Re Bonjour Tom, Bonjour Thomas, le Forum
ARf oui, j'ai fait vite mon copié/collé entre la BoucleOnSheets A & B, et je me suis fais avoir comme un bleu avec le i, puisqu'en sorti de boucle de For i = 1 to 3, i vaut 4... ce qui est logique car en sortie du dernier next i, il se produit une incrémentation du numero.
Pour ce qui est de choisir entre les boucles 'For Each XXX in YYYY' et 'For i = X to Y', les deux ne sont pas toujours applicables contrairement à l'exemple présent. De manière générale, on préfèrera, si on en a la possibilité, appliquer une méthode de boucle For Each Object in Objects.Collection qui représente une réélle instance aux objets ainsi spécifiés dans la Collection. C'est sûrement du chinois à lire, désolé, mais je suis à la bourre.
En clair, ici :
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
On fait bien instance à un Object WorkSheet que l'on scanne dans une Collection des Objets WorkSheets de Ce Classeur...
Par Contre ici
Dim i As Byte
For i = 1 To ThisWorkbook.Worksheets.Count
On ne fait pas d'instance à une collection d'Objets, mais on va appeler à chaque tour de boucle la Feuille dont le numéro d'index est i ...
Sur une petite quantité on ne verra aucune difference, sinon la méthode For Each Object in Objects.Collection devrait être plus optimisée...
Sinon pour Tom, et bien pour Créer et Nommer tes onglets au noms des classeurs ouverts, il suffit de faire le même style de boucle :
Je file je suis ultra à la bourre
Bonsoir
@+Thierry
ARf oui, j'ai fait vite mon copié/collé entre la BoucleOnSheets A & B, et je me suis fais avoir comme un bleu avec le i, puisqu'en sorti de boucle de For i = 1 to 3, i vaut 4... ce qui est logique car en sortie du dernier next i, il se produit une incrémentation du numero.
Pour ce qui est de choisir entre les boucles 'For Each XXX in YYYY' et 'For i = X to Y', les deux ne sont pas toujours applicables contrairement à l'exemple présent. De manière générale, on préfèrera, si on en a la possibilité, appliquer une méthode de boucle For Each Object in Objects.Collection qui représente une réélle instance aux objets ainsi spécifiés dans la Collection. C'est sûrement du chinois à lire, désolé, mais je suis à la bourre.
En clair, ici :
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
On fait bien instance à un Object WorkSheet que l'on scanne dans une Collection des Objets WorkSheets de Ce Classeur...
Par Contre ici
Dim i As Byte
For i = 1 To ThisWorkbook.Worksheets.Count
On ne fait pas d'instance à une collection d'Objets, mais on va appeler à chaque tour de boucle la Feuille dont le numéro d'index est i ...
Sur une petite quantité on ne verra aucune difference, sinon la méthode For Each Object in Objects.Collection devrait être plus optimisée...
Sinon pour Tom, et bien pour Créer et Nommer tes onglets au noms des classeurs ouverts, il suffit de faire le même style de boucle :
Option Explicit
Sub BoucleOnSheetsA()
Dim WS As Worksheet
Dim WB As Workbook
Dim MyWB As Workbook
Dim TabName As String
Set MyWB = ThisWorkbook
For Each WB In Workbooks
If Not WB.Name = MyWB.Name Then
With MyWB
.Worksheets.Add after:=Worksheets(Worksheets.Count)
TabName = IIf(LCase(Right(WB.Name, 3)) = 'xls', Left(WB.Name, Len(WB.Name) - 4), WB.Name)
On Error GoTo Out
.Worksheets(Worksheets.Count).Name = TabName
End With
End If
Next
Exit Sub
Out:
MsgBox 'La feuille ' & WB.Name & ' existe déja'
With Application
.DisplayAlerts = False
Worksheets(Worksheets.Count).Delete
.DisplayAlerts = True
End With
End Sub
Je file je suis ultra à la bourre
Bonsoir
@+Thierry