Introduction
Que ne voit-on pas dans les forums ce type de questions
- Je cherche à savoir si dans une même macro, on peut travailler sur plusieurs feuille excel d’un même classeur.
- Je dois faire un récapitulatif des commandes de l’année qui se trouvent dans le même classeur mais dans des feuilles séparées (une par mois)
- Je dispose dans un même classeur, d’une feuille nommée [RECAP] dans laquelle je souhaite rapatrier les données se trouvant dans d’autres feuilles nommées Vente suivi de l’année (Exemple [Vente – 2017]
- etc.
Finalement, il s’agit de parcourir les feuilles d’un même classeur et d’effectuer une tâche répétitive.
Que faut-il faire ?
Pour parcourir l’ensemble des feuilles d’un classeur, il faut utiliser une structure répétitive (une boucle) soit For Each … In … Next ou For … To … Next
Si vous ne connaissez par les boucles, je vous invite à lire ce tutoriel La gestion des boucles dans Excel
Exemples de procédures répétitives
Dans les deux exemples qui suivent, nous affichons simplement le nom des feuilles du classeur
Exemple 1 : (For Each … In … Next)
Sub ListeFeuille() Dim sht As Worksheet For Each sht In ThisWorkbook.Worksheets MsgBox sht.Name Next End Sub
Exemple 2 : (For … To … Next)
Sub ListeFeuille() Dim s As Integer For s = 1 To ThisWorkbook.Worksheets.Count MsgBox Worksheets(s).Name Next End Sub
Même résultat avec des méthodes différentes.
Exemple avec une procédure décisionnelle
Si l’on souhaite faire un traitement sur certaines feuilles seulement, on utilisera une structure décisionnelle comme If ou Select Case que l’on imbriquera dans la structure répétitive.
Pour en savoir plus sur les structures décisionnelles, je vous invite à lire le chapitre 11. Les structures décisionnelles du tutoriel d’Olivier Lebeau titré Initiation au VBA Office.
Sub ListeFeuille()
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
Select Case LCase(Left(sht.Name, 5))
' Vérifie les 5 premiers caractères en minuscule du nom de la feuille
Case "vente"
' N'affiche le nom que si celui-ci commence par vente
MsgBox sht.Name
End Select
Next
End Sub
Bonjour,
Lorsque je teste les exemples ci-dessus, les instructions « For Each sht In ThisWorkbook.Worksheets » ou similaires, me donnent l’erreur 429.
D’autre macros me donne la même erreur pour une instruction similaire.
Y a-t-il quelque chose qui m’échappe des les options d’Excel ou y a-t-il une erreur de syntaxe ?
Merci pour votre réponse.
Gérard PORT
Bonjour Gérard,
Par acquit de conscience, j’ai refait les tests sur les procédures publiées et je ne rencontre pas de problème et certainement pas une erreur 429
L’instruction :
For Each sht In ThisWorkbook.Worksheets
est correcte et ne provoque normalement pas une erreur 429 à elle seule.
L’erreur 429 correspond généralement à un problème de création d’objet ActiveX/COM, donc plutôt à un souci d’environnement qu’à une erreur de syntaxe sur la boucle.
Les causes possibles sont notamment :
une référence manquante dans l’éditeur VBA
(Outils > Références puis vérifier s’il y a une référence marquée MANQUANT),
une bibliothèque Office/Excel/VBA mal enregistrée,
un autre morceau de code de la procédure qui crée un objet avec CreateObject ou New,
plus rarement une installation Office endommagée.
À vérifier aussi :
que la variable de boucle est bien déclarée, par exemple :
Dim sht As Worksheet
et que le test est fait dans un classeur Excel standard.
Si vous le souhaitez, copiez-collez ici la procédure complète qui provoque l’erreur 429 ainsi que la ligne exactement surlignée lors du débogage, car cette erreur ne vient probablement pas de For Each … Worksheets lui-même.