Comment utiliser la boucle For Each en VBA : Guide pas à pas avec exemples
Une boucle For Each est un moyen en VBA (Visual Basic for Applications) de parcourir automatiquement chaque élément d’un ensemble d’objets, appelé Collection. Cette structure de boucle est particulièrement utile lorsque vous avez plusieurs éléments à traiter de manière identique, comme une série de cellules dans une feuille Excel, des feuilles de calcul dans un classeur, ou des formes graphiques sur une feuille.
Notre formation pour programmer en VBA vous aidera à exploiter pleinement les boucles ‘For Each’ pour parcourir les collections et optimiser votre code.
Quand utiliser la boucle For Each ?
Imaginez que vous avez une liste de courses sur une feuille Excel avec plusieurs cellules remplies de produits. Vous voulez ajouter un signe « ✔ » à chaque produit pour indiquer qu’il a été acheté. Plutôt que de le faire manuellement pour chaque cellule, vous pouvez utiliser une boucle For Each pour parcourir chaque cellule et ajouter automatiquement ce signe.
Les concepts de Item et Collection
Avant d’aller plus loin, il est essentiel de comprendre deux concepts clés dans une boucle For Each : Item et Collection.
- Collection : Une collection est un ensemble d’éléments que vous souhaitez parcourir. Par exemple, cela pourrait être une série de cellules sur une feuille de calcul, toutes les feuilles dans un classeur, ou tous les fichiers dans un dossier.
- Item : L’Item représente un seul élément de la collection. Dans notre exemple de liste de courses, chaque cellule individuelle contenant un produit serait un Item.
Imaginez que vous avez les cellules A1 à A5 remplies avec les noms de produits. Vous voulez les parcourir une par une pour leur ajouter un signe « ✔ ».
For Each cell In Range(« A1:A5″)
cell.Value = cell.Value & » ✔ »
Next cell
Dim cell As Range For Each cell In Range("A1:A5") cell.Value = cell.Value & " ✔" Next cell
- Collection ici est Range(« A1:A5 »), qui représente toutes les cellules de A1 à A5.
- Item est cell, qui représente chaque cellule individuelle dans cette plage. La boucle va prendre une cellule à la fois, y ajouter » ✔ », puis passer à la cellule suivante jusqu’à ce que toutes les cellules de la collection soient traitées.
Lorsque vous utilisez la boucle For Each pour parcourir une plage de cellules comme Range(« A1:A5 »), la variable VBA utilisée dans la boucle (dans notre cas, cell) prend successivement la référence de chaque cellule dans la collection spécifiée, c’est-à-dire A1, A2, A3, A4, et A5.
Avant de commencer la boucle, vous devez déclarer la variable cell comme suit :
Dim cell As Range
Cette déclaration indique que cell peut contenir une référence à une ou plusieurs cellules Excel.
Dans cet exemple, nous allons utiliser Debug.Print pour afficher l’adresse de chaque cellule au fur et à mesure que la boucle les parcourt. Cela vous permettra de voir comment la variable cell change de valeur à chaque itération de la boucle.
Dim cell As Range For Each cell In Range("A1:A5") Debug.Print cell.Address Next cell
- For Each cell In Range(« A1:A5 ») : La variable cell prend successivement la position de chaque cellule dans la plage A1:A5.
- Debug.Print cell.Address : À chaque itération, l’adresse de la cellule actuellement référencée par cell est affichée dans la fenêtre « Exécution » (Immediate Window) de l’éditeur VBA.
- Next cell : La boucle passe à la cellule suivante dans la plage.
Lorsque vous exécutez ce code, vous verrez les adresses des cellules s’afficher dans la fenêtre « Exécution » (Immediate Window). Voici ce que vous obtiendrez :
$A$1 $A$2 $A$3 $A$4 $A$5
- $A$1 : Lors de la première itération, cell fait référence à la cellule A1.
- $A$2 : Lors de la deuxième itération, cell fait référence à la cellule A2.
- $A$3 : Lors de la troisième itération, cell fait référence à la cellule A3.
- $A$4 : Lors de la quatrième itération, cell fait référence à la cellule A4.
- $A$5 : Lors de la cinquième et dernière itération, cell fait référence à la cellule A5.
Chaque fois que la boucle avance, cell change de référence pour la cellule suivante dans la collection Range(« A1:A5 »). L’utilisation de Debug.Print cell.Address vous permet de visualiser cette progression directement dans l’interface de l’éditeur VBA, facilitant ainsi la compréhension du fonctionnement de la boucle For Each.
Pourquoi utiliser For Each VBA ?
La boucle For Each est extrêmement utile car elle vous permet de travailler avec des collections d’objets sans avoir à vous soucier de leur gestion individuelle par un index. Cela rend votre code plus simple, plus propre, et moins sujet aux erreurs.
Syntaxe de la boucle For Each
La syntaxe générale de la boucle For Each est la suivante :
‘ Actions à exécuter pour chaque Item
Next Item
For Each Item In Collection ' Actions à exécuter pour chaque Item Next Item
Pour rendre cela plus concret, revenons à notre exemple de liste de courses :
For Each cell In Range(« A1:A5″)
cell.Value = cell.Value & » ✔ »
Next cell
Dim cell As Range For Each cell In Range("A1:A5") cell.Value = cell.Value & " ✔" Next cell
- For Each cell In Range(« A1:A5 ») : On commence la boucle en précisant qu’on veut parcourir chaque cellule (Item) dans la plage de cellules A1 à A5 (Collection).
- cell.Value = cell.Value & » ✔ » : Cette ligne de code ajoute » ✔ » au contenu de chaque cellule.
- Next cell : Cette ligne marque la fin de l’instruction pour cette cellule, et la boucle passe à la suivante.
Introduction à Exit For
Exit For est une instruction spéciale que vous pouvez utiliser à l’intérieur de la boucle For Each pour arrêter la boucle avant qu’elle ne se termine naturellement. Cela peut être utile si vous avez trouvé ce que vous cherchez et que vous n’avez pas besoin de continuer à parcourir les autres éléments.
Supposons que vous cherchiez un produit spécifique dans la liste de courses, et que vous vouliez arrêter la recherche dès que vous le trouvez.
For Each cell In Range(« A1:A5 »)
If cell.Value = « Lait » Then
MsgBox « Produit trouvé : » & cell.Address
Exit For
End If
Next cell
Dim cell As Range For Each cell In Range("A1:A5") If cell.Value = "Lait" Then MsgBox "Produit trouvé : " & cell.Address Exit For End If Next cell
- If cell.Value = « Lait » Then : La boucle vérifie si la cellule contient le mot « Lait ».
- MsgBox « Produit trouvé : » & cell.Address : Si le produit est trouvé, une boîte de message affiche l’adresse de la cellule.
- Exit For : La boucle s’arrête immédiatement après avoir trouvé « Lait », sans parcourir les autres cellules.
Exemples pratiques
Même si la boucle For est simple à utiliser, certaines erreurs peuvent survenir :
- Oublier Next : Si vous omettez Next à la fin de la boucle, le code ne fonctionnera pas correctement. VBA pourrait générer une erreur de syntaxe ou un comportement inattendu.
- Mauvais incrément (Step) : Si le Step est 0, la boucle ne progressera jamais, causant une boucle infinie.
- Conditions de boucle invalides : Par exemple, essayer de parcourir une plage où la valeur de départ est supérieure à la valeur de fin sans utiliser un Step négatif.
Déboguer avec VBA :
- Utiliser des points d’arrêt pour suspendre l’exécution du code à des endroits stratégiques et examiner les variables en cours d’exécution
- Le mode pas-à-pas permet de parcourir chaque ligne de code pour observer le comportement de la boucle et identifier où une erreur se produit.
Parcourir une sélection de cellules dans une plage
Vous souhaitez parcourir chaque cellule sélectionnée sur une feuille pour vérifier quelque chose ou appliquer une modification.
For Each cell In Selection
If IsNumeric(cell.Value) And cell.Value > 100 Then
MsgBox « Cellule avec valeur supérieure à 100 trouvée : » & cell.Address
Exit For
End If
Next cell
Dim cell As Range For Each cell In Selection If IsNumeric(cell.Value) And cell.Value > 100 Then MsgBox "Cellule avec valeur supérieure à 100 trouvée : " & cell.Address Exit For End If Next cell
Ce code parcourt chaque cellule sélectionnée. Si une cellule contient une valeur numérique supérieure à 100, une boîte de message affiche son adresse, et la boucle s’arrête.
Parcourir les feuilles d’un classeur
Vous voulez vérifier quelque chose ou effectuer une action sur chaque feuille d’un classeur.
For Each ws In ThisWorkbook.Worksheets
If ws.Name = « FeuilleCible » Then
MsgBox « Feuille cible trouvée. »
Exit For
End If
ws.Range(« A1 »).Value = « Traitée »
Next ws
Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets If ws.Name = "FeuilleCible" Then MsgBox "Feuille cible trouvée." Exit For End If ws.Range("A1").Value = "Traitée" Next ws
Le code parcourt chaque feuille dans le classeur. Si une feuille nommée « FeuilleCible » est trouvée, une boîte de message s’affiche, et la boucle s’arrête. Sinon, « Traitée » est écrit dans la cellule A1 de chaque feuille.
Parcourir un ensemble de classeurs ouverts
Vous avez plusieurs fichiers Excel ouverts et vous souhaitez effectuer une action sur chacun d’eux.
For Each wb In Workbooks
If wb.Name = « ClasseurCible.xlsx » Then
MsgBox « Classeur cible trouvé. »
Exit For
End If
wb.Sheets(1).Range(« A1 »).Value = « Vérifié »
Next wb
Dim wb As Workbook For Each wb In Workbooks If wb.Name = "ClasseurCible.xlsx" Then MsgBox "Classeur cible trouvé." Exit For End If wb.Sheets(1).Range("A1").Value = "Vérifié" Next wb
Le code parcourt tous les classeurs ouverts. Si un classeur nommé « ClasseurCible.xlsx » est trouvé, la boucle s’arrête. Sinon, « Vérifié » est écrit dans la cellule A1 de la première feuille de chaque classeur.
Parcourir toutes les formes dans une feuille
Vous voulez effectuer une action sur toutes les formes (par exemple, des graphiques, boutons) sur une feuille de calcul.
For Each shp In ActiveSheet.Shapes
If shp.Name = « FormeCible » Then
MsgBox « Forme cible trouvée. »
Exit For
End If
shp.Fill.ForeColor.RGB = RGB(0, 0, 255) ‘ Change la couleur de remplissage en bleu
Next shp
Dim shp As Shape For Each shp In ActiveSheet.Shapes If shp.Name = "FormeCible" Then MsgBox "Forme cible trouvée." Exit For End If shp.Fill.ForeColor.RGB = RGB(0, 0, 255) ' Change la couleur de remplissage en bleu Next shp
Le code parcourt toutes les formes sur la feuille active. Si une forme nommée « FormeCible » est trouvée, la boucle s’arrête. Sinon, la couleur de remplissage de toutes les formes est changée en bleu.
Parcourir tous les tableaux croisés dynamiques (TCD) d’un fichier Excel
Vous avez plusieurs TCD dans un classeur et vous souhaitez les actualiser ou vérifier quelque chose sur chacun d’eux.
Dim pt As PivotTable
For Each ws In ThisWorkbook.Worksheets
For Each pt In ws.PivotTables
If pt.Name = « TCDCible » Then
MsgBox « TCD cible trouvé. »
Exit For
End If
pt.RefreshTable ‘ Actualise chaque TCD
Next pt
Next ws
Dim ws As Worksheet Dim pt As PivotTable For Each ws In ThisWorkbook.Worksheets For Each pt In ws.PivotTables If pt.Name = "TCDCible" Then MsgBox "TCD cible trouvé." Exit For End If pt.RefreshTable ' Actualise chaque TCD Next pt Next ws
Le code parcourt chaque feuille puis chaque TCD sur cette feuille. Si un TCD nommé « TCDCible » est trouvé, la boucle s’arrête. Sinon, tous les TCD sont actualisés.
Optimisation et bonnes pratiques
Éviter les erreurs courantes
- Mauvaise déclaration des variables : Assurez-vous que les variables sont bien déclarées et de type approprié pour éviter les erreurs.
- Manipulation de collections vides : Vérifiez que la collection n’est pas vide avant d’entrer dans la boucle pour éviter les erreurs de parcours.
Optimiser l’utilisation de Exit For
Sortir de la boucle dès que possible : Utilisez Exit For pour arrêter la boucle dès que l’objectif est atteint, ce qui rend votre code plus efficace.
Cas d’utilisation courants
Automatisation avec For Each et Exit For
Automatisation de tâches répétitives : Utilisez For Each pour automatiser des tâches comme la mise en forme, l’actualisation de données, ou la vérification de conditions sur des ensembles d’objets.
Limites et alternatives
Limites : For Each ne permet pas de parcourir des éléments dans un ordre spécifique (par exemple, en sens inverse) et ne permet pas de sauter des éléments. Dans certains cas, une boucle For classique peut être plus adaptée.
Un consultant VBA Excel peut vous accompagner dans l’optimisation de vos boucles ‘For Each’, pour un code plus performant et maintenable.
Alternatives
Un consultant VBA Excel peut vous accompagner dans l’optimisation de vos boucles ‘For Each’, pour un code plus performant et maintenable.