Bonjour,
Avec cela:
1 2 3
| For i = 1 To 4
fl(i).Activate
Next |
La boucle terminée, ta seule feuille active est ta feuille numéro 4. Tu ne peux pas avoir deux feuilles actives dans le même classeur.
Le seul bienfait de la méthode Activate est de désigner la feuille qui va faire l'objet de l'attention de la macro. Et on peut joyeusement toujours s'en passer, ou presque.
par exemple :
1 2
| sheets("Feuil1").activate
activesheet.range("a1").value = 2.71828 |
Peut, le plus facilement du monde être remplacée par:
sheets("Feuil1").range("a1").value = 2.71828
Et c'est le même principe pour select.
Si tu dois boucler sur un ensemble de feuilles et traiter chaque feuille tu dois faire ton traitement dans ta boucle:
1 2 3 4
| For i = 1 To 4
fl(i).Activate
activesheet.range("A3").value = activesheet.range("A1").value + activesheet.range("A2").value
Next |
et encore là, tu peux de passer de Activate.
1 2 3
| For i = 1 To 4
sheets(i).range("A3").value = activesheet.range("A1").value + activesheet.range("A2").value
Next |
Tu as aussi plusieurs collections déjà implantées dans VBA-Excel qui permettent la plupart du temps d'éviter de gérer des tableaux de noms d'objets :
Sheets : l'ensemble des feuilles d'un classeur, incluant les feuilles graphique, le feuilles de calcul, les feuilles de macros Excel 4 et les autres type de feuille qui pourraient exister
Worksheets : l'ensemble des feuilles (uniquement les feuilles de calcul).
Workbooks : l'ensemble des classeurs ouverts dans un instance déterminée d'Excel
Tiens, ton code pourrait être réduit à ceci:
1 2 3 4 5 6 7 8
| Sub Test()
'sans s ==> l'objet
'Avec un s ==> la collection des objets (sans le s)
For each unefeuille in activeworkbook.workshheets
'unefeuille devient automatiquement un objet Worksheet
unefeuile.Range("A1").Value = unefeuille.name
Next
End Sub |
Ou, ce qui revient au même:
1 2 3 4 5 6 7
| Sub Test2_A()
'sans s ==> l'objet
'Avec un s ==> la collection des objets (sans le s)
for i = 1 to Activeworkbook.worksheets.count
worksheets(i).Range("A1").Value = worksheets(i).name
Next
End Sub |
Ou, avec des blocs with:
1 2 3 4 5 6 7 8 9 10
| Sub Test_A()
'sans s ==> l'objet
'Avec un s ==> la collection des objets (sans le s)
For each unefeuille in activeworkbook.workshheets
'unefeuille devient automatiquement un objet Worksheet
with unefeuille
.Range("A1").Value = .name
end with
Next
End Sub |
1 2 3 4 5 6 7 8 9
| Sub Test2()
'sans s ==> l'objet
'Avec un s ==> la collection des objets (sans le s)
for i = 1 to Activeworkbook.worksheets.count
with worksheets(i)
.Range("A1").Value = .name
end with
Next
End Sub |
P.S. Cela a été un peu long à rédiger. Si jamais, j'ai provoqué des doublons ou des collisions, toutes mes excuses.
P.P.S. Un bon truc à ne pas négliger:
Dans l'éditeur VBA (et même pour VB6 et VB.net). Un clic sur un mot-clef et
Partager