Boucles Excel VBA – Pour Chacune, Pour la Suite, Faites Tout, Imbriquées et Plus
Pour fonctionner efficacement dans VBA, vous devez comprendre les boucles.
Les boucles vous permettent de répéter un bloc de code un nombre défini de fois ou de répéter un bloc de code sur chaque objet d’un ensemble d’objets.
Nous allons d’abord vous montrer quelques exemples pour vous montrer de quoi les boucles sont capables. Ensuite, nous vous apprendrons tout sur les boucles.
Exemples rapides de boucle VBA
Pour Chaque Boucle
Pour Chaque boucle, parcourez chaque objet d’une collection, par exemple chaque feuille de calcul du classeur ou chaque cellule d’une plage.
Boucle dans toutes les feuilles de calcul du classeur
Ce code parcourt toutes les feuilles de calcul du classeur, affichant chaque feuille :
1
2
3
4
5
6
7
8
|
Sous LoopThroughSheets()
Dim ws Comme Feuille De Calcul
Pour Chaque ws Dans Les Feuilles De Calcul
ws.Visible=True
Suivant
End Sub
|
Boucle dans Toutes les cellules de la plage
Ce code boucle dans une plage de cellules, testant si la valeur de la cellule est négative, positive ou nulle:
Pour les boucles suivantes
Un autre type de boucle « For” est la Boucle For Next. La boucle For Next vous permet de parcourir des entiers.
Ce code parcourra les entiers 1 à 10, affichant chacun une boîte de message:
1
2
3
4
5
6
|
Sub ForLoop()
Dim i En Entier
Pour i =1 À 10
MsgBox i
Suivant i
End Sub
|
Do While Loops
Do While Loops bouclera tant que la condition est remplie. Ce code parcourra également les entiers 1 à 10, affichant chacun une boîte de message.
1
2
3
4
5
6
7
8
|
Sub DoWhileLoop()
Dim n Comme Entier
n = 1
Faire pendant que n < 11
MsgBox n
n = n +1
Boucle
End Sub
|
Faire Des boucles Jusqu’à
Inversement, Faites jusqu’à ce que les boucles bouclent jusqu’à ce qu’une condition soit remplie. Ce code fait la même chose que les deux exemples précédents.
1
2
3
4
5
6
7
8
|
Sub DoUntilLoop()
Dim n Comme Entier
n = 1
Retour Jusqu’À n > = 10
MsgBox n
n = n+1
Boucle
End Sub
|
Nous en discuterons ci-dessous, mais vous vous devez être extrêmement prudent lors de la création de boucles Do While ou Do Until afin de ne pas créer de boucle sans fin.
Générateur de boucles VBA
Ceci est une capture d’écran du « Générateur de boucles” de notre complément VBA Premium: AutoMacro. Le générateur de boucles vous permet de créer rapidement et facilement des boucles pour parcourir différents objets ou nombres. Vous pouvez effectuer des actions sur chaque objet et/ou sélectionner uniquement des objets répondant à certains critères.
Le complément contient également de nombreux autres constructeurs de code, une vaste bibliothèque de code VBA et un assortiment d’outils de codage. C’est un must pour tout développeur VBA.
Maintenant, nous allons couvrir les différents types de boucles en profondeur.
VBA Pour la boucle suivante
Pour la syntaxe de la boucle
La Boucle For Next vous permet de répéter un bloc de code un nombre spécifié de fois. La syntaxe est:
1
2
3
4
5
|
For Counter = Start to End
Next
|
Where the items in brackets are optional.
- – Declares the counter variable. Required if Option Explicit is declared at the top of your module.
- Counter – Une variable entière utilisée pour compter
- Start – La valeur de départ (Ex. 1)
- End – La valeur de fin (Ex. 10)
- – Vous permet de compter tous les n entiers au lieu de tous les 1 entiers. Vous pouvez également aller en sens inverse avec une valeur négative (ex. Étape -1)
- L’instruction de clôture suivante à la boucle Suivante. Vous pouvez inclure le compteur ou non. Cependant, je recommande fortement d’inclure le compteur car cela facilite la lecture de votre code.
i– – Le code qui répétera
Si c’est déroutant, ne vous inquiétez pas. Nous passerons en revue quelques exemples:
Compter jusqu’à 10
Ce code comptera jusqu’à 10 en utilisant une boucle For-Next:
1
2
3
4
5
6
7
8
|
Sub ForEach_CountTo10()
Dim n Comme Entier
Pour n = 1 À 10
MsgBox n
Suivant n
End Sub
|
Pour L’Étape De Boucle
Compter jusqu’à 10 – Seulement des nombres pairs
Ceci le code comptera jusqu’à 10 en ne comptant que les nombres pairs:
1
2
3
4
5
6
7
8
|
Sub ForEach_CountTo10_Even()
Dim n Comme Entier
Pour n = 2 À 10 Étape 2
MsgBox n
Suivant n
End Sub
|
Notez que nous avons ajouté l' »étape 2”. Cela indique à la boucle For de « parcourir » le compteur par 2. Nous pouvons également utiliser une valeur de pas négative pour inverser:
Pour l’étape de boucle – Inverse
Compte à rebours à partir de 10
Ce code compte à rebours à partir de 10:
1
2
3
4
5
6
7
8
9
|
Sub ForEach_Countdown_Inverse()
Dim n Comme Entier
Pour n = 10 À 1 Étape -1
MsgBox n
Suivant n
MsgBox « Lift Off »
End Sub
|
Supprimer Lignes si la cellule est vide
J’ai le plus souvent utilisé une étape négative pour la boucle pour parcourir des plages de cellules, en supprimant les lignes qui répondent à certains critères. Si vous faites une boucle des lignes du haut aux lignes du bas, lorsque vous supprimez des lignes, vous gâcherez votre compteur.
Cet exemple supprimera les lignes avec des cellules vides (à partir de la rangée du bas):
Boucle For imbriquée
Vous pouvez « imbriquer” une Boucle For dans une autre Boucle For. Nous utiliserons des boucles For imbriquées pour créer une table de multiplication:
1
2
3
4
5
6
7
8
9
10
11
|
Sub Nested_ForEach_MultiplicationTable()
Dim row En Entier, col En Entier
Pour Les lignes =1 À 9
Pour Les Cellules col =1 À 9
(ligne +1, col +1).Valeur = ligne * col
Col suivant
Ligne suivante
End Sub
|
Exit For
L’instruction Exit For vous permet de quitter immédiatement une boucle For Next.
Vous utiliseriez généralement Exit For avec une instruction If, en quittant la boucle For Next si une certaine condition est remplie.
Par exemple, vous pouvez utiliser une boucle For pour trouver une cellule. Une fois cette cellule trouvée, vous pouvez quitter la boucle pour accélérer votre code.
Ce code parcourra les lignes 1 à 1000, en recherchant « erreur » dans la colonne A. S’il est trouvé, le code sélectionnera la cellule, vous alertera de l’erreur trouvée et quittera la boucle:
Important: Dans le cas de boucles For imbriquées, Exit For ne quitte que la Boucle For actuelle, pas toutes les boucles actives.
Continuer Pour
VBA n’a pas la commande ”Continuer » qui se trouve dans Visual Basic. Au lieu de cela, vous devrez utiliser « Exit”.
VBA Pour Chaque Boucle
Le VBA Pour Chaque Boucle parcourra tous les objets d’une collection:
- Toutes les cellules d’une plage
- Toutes les feuilles de calcul d’un classeur
- Toutes les formes d’une feuille de calcul
- Tous les classeurs ouverts
Vous pouvez également utiliser Imbriqué Pour Chaque boucle pour :
- Toutes les cellules d’une plage sur toutes les feuilles de calcul
- Toutes les formes sur toutes les feuilles de calcul
- Toutes les feuilles dans tous les classeurs ouverts li>
- et ainsi de suite
La syntaxe est:
1
2
3
|
For Each Object in Collection
Next
|
Where:
For Each Cell in Range
This code will loop through each cell in a range:
For Each Worksheet in Workbook
This code will loop through all worksheets in a workbook, unprotecting each sheet:
1
2
3
4
5
6
7
8
9
|
Sub ForEachSheet_inWorkbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Déprotégez « password »
Suivant ws
End Sub
|
Pour Chaque Classeur ouvert
Ce code enregistre et ferme tous les classeurs ouverts:
1
2
3
4
5
6
7
8
9
|
Sub ForEachWB_inWorkbooks()
Dim wb Comme Classeur
Pour Chaque wb Dans Les Classeurs
wb.Fermer SaveChanges:=True
Suivant wb
End Sub
|
Pour Chaque Forme de la feuille de calcul
Ce code supprimera toutes les formes de la feuille active.
1
2
3
4
5
6
7
8
9
|
Sub ForEachShape()
Dim shp Comme Forme
Pour Chaque shp Dans ActiveSheet.Formes
shp.Delete
Suivant shp
End Sub
|
Pour Chaque Forme dans Chaque Feuille de calcul du Classeur
, Vous pouvez également imbriquer Pour Chaque Boucle. Ici, nous parcourrons toutes les formes de toutes les feuilles de calcul du classeur actif:
1
2
3
4
5
6
7
8
9
10
11
|
Sub ForEachShape_inAllWorksheets()
Dim shp Comme Forme, ws Comme Feuille De Calcul
Pour Chaque ws Dans Les Feuilles De Calcul
Pour Chaque shp Dans ws.Formes
shp.Delete
Next shp
Next ws
End Sub
|
Pour chaque boucle IF
Comme nous l’avons déjà mentionné, vous pouvez utiliser une instruction If dans un boucle, n’effectuant des actions que si certains critères sont remplis.
Ce code masquera toutes les lignes vides d’une plage :
Boucle VBA Do While
Les VBA Do While et Do Until (voir section suivante) sont très similaires. Ils répéteront une boucle pendant (ou jusqu’à ce qu’une condition soit remplie).
La boucle Do While répète une boucle tant qu’une condition est remplie.
Voici la syntaxe Do While:
1
2
3
|
Faire Pendant la condition
Boucle
|
Où :
- Condition – La condition à tester
- – Le bloc de code à répéter
Vous pouvez également configurer une boucle Do While avec la Condition à la fin de la boucle:
1
2
3
|
Do
Loop While Condition
|
We will demo each one and show how they differ:
Do While
Here is the Do While loop example we demonstrated previously:
1
2
3
4
5
6
7
8
|
Sub DoWhileLoop()
Dim n Comme Entier
n = 1
Faire pendant que n < 11
MsgBox n
n = n +1
Boucle
End Sub
|
Boucle Tandis que
Maintenant, exécutons la même procédure, sauf que nous allons déplacer la condition à la fin de la boucle:
1
2
3
4
5
6
7
8
|
Sub DoLoopWhile()
Dim n Comme Entier
n = 1
Retour
MsgBox n
n = n + 1
Boucle Pendant que n <11
End Sub
|
VBA Faire Jusqu’à Boucle
Retour Jusqu’à Les boucles répéteront une boucle jusqu’à ce qu’une certaine condition soit remplie. La syntaxe est essentiellement la même que les boucles Do While :
1
2
3
|
Faire Jusqu’à Condition
Boucle
|
et de même la condition peut aller au début ou à la fin de la boucle:
1
2
3
|
Do
Loop Until Condition
|
Do Until
This do Until loop will count to 10, like our previous examples
1
2
3
4
5
6
7
8
|
Sub DoUntilLoop()
Dim n Comme Entier
n =1
Retour Jusqu’À n > 10
MsgBox n
n = n +1
Boucle
End Sub
|
Boucle Jusqu’à
Cette boucle jusqu’à la boucle comptera jusqu’à 10:
1
2
3
4
5
6
7
8
|
Sub DoLoopUntil()
Dim n Comme Entier
n = 1
Retour
MsgBox n
n = n + 1
Boucle Jusqu’À n > 10
End Sub
|
Exit Do Loop
Similaire à l’utilisation de Exit For pour quitter une boucle For, vous utilisez la commande Exit Do pour quitter immédiatement une boucle Do
1
|
Exit Do
|
Voici un exemple de Sortie Do:
Boucle de fin ou de rupture
Comme nous l’avons mentionné ci-dessus, vous pouvez utiliser la sortie Pour ou la sortie Do pour quitter les boucles:
1
|
Exit For
|
1
|
Exit Do
|
However, these commands must be added to your code before you run ta boucle.
Si vous essayez de ”casser » une boucle en cours d’exécution, vous pouvez essayer d’appuyer sur ÉCHAP ou CTRL + Pause Pause sur le clavier. Cependant, cela peut ne pas fonctionner. Si cela ne fonctionne pas, vous devrez attendre la fin de votre boucle ou, dans le cas d’une boucle sans fin, utilisez CTRL + ALT + Suppr pour forcer la fermeture d’Excel.
C’est pourquoi j’essaie d’éviter les boucles Do, il est plus facile de créer accidentellement une boucle sans fin vous forçant à redémarrer Excel, risquant de perdre votre travail.
Plus d’exemples de boucles
Boucle à travers les lignes
Cela boucle toutes les lignes d’une colonne:
Boucle dans les colonnes
Cela boucle dans toutes les colonnes d’une ligne:
Boucle dans les fichiers d’un dossier
Ce code boucle dans tous les fichiers d’un dossier, créant une liste:
Boucle dans le tableau
Ce code boucle dans le tableau ‘arrList’:
1
2
3
|
Pour i= LBound(arrList) Vers UBound(arrList)
MsgBox arrList(i)
Suivant i
|
La fonction LBound obtient la « limite inférieure” du tableau et UBound obtient la « limite supérieure”.
Boucles dans Access VBA
La plupart des exemples ci-dessus fonctionneront également dans Access VBA. Cependant, dans Access, nous parcourons l’objet Recordset plutôt que l’Objet Range.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
div> 15
16
17
18
|
Sub LoopThroughRecords()
En cas d’erreur, Reprenez Ensuite
Dim dbs En Tant que base de données
Dim rst En Tant que Jeu d’enregistrements
Set dbs=CurrentDb
Set rst = dbs.OpenRecordset(« tblClients », dbOpenDynaset)
With rst
.MoveLast
.MoveFirst
Do Until .EOF = True
MsgBox (rst.Fields(« ClientName »))
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub
|