Les boucles en VBA : For Next, Step, Do While, Do Until, While Wend et For Each
Une boucle répète un bloc d’instructions : parcourir les lignes d’un tableau, additionner une colonne jusqu’à la première cellule vide, traiter chaque feuille du classeur. VBA propose trois familles. For … Next tourne un nombre de fois connu à l’avance, grâce à un compteur. Do … Loop (et l’ancien While … Wend) tourne tant qu’une condition est vraie, ou jusqu’à ce qu’elle le devienne. For Each … Next parcourt chaque élément d’une collection. Chaque simulateur s’exécute pas à pas (F8) : suivez la ligne jaune, les variables et la feuille. Voir aussi les conditions et les sélections.
For … Next
For i = début To fin donne à la variable compteur i la valeur de début, exécute le bloc, puis Next i ajoute 1 et recommence tant que i ne dépasse pas la fin. Le nombre de tours est connu d’avance : fin − début + 1. Le compteur sert directement de numéro de ligne dans Cells(i, colonne). Déclarez-le en Long (ou Integer) et ne le modifiez jamais dans le bloc.
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row : la fin est calculée une seule fois, au démarrage de la boucle, quelle que soit la taille du tableau.For i = 2 To 7). N’utilisez pas sa valeur après Next sans en tenir compte.Step : changer le pas
Par défaut le compteur augmente de 1. Step fixe un autre pas : Step 2 une ligne sur deux, Step 0.5 des demi-valeurs, Step -1 un compte à rebours. Avec un pas négatif, le début doit être supérieur à la fin. Le parcours à l’envers est indispensable pour supprimer des lignes : chaque suppression fait remonter les lignes du dessous, qu’une boucle descendante sauterait.
Step 0.1, les erreurs d’arrondi peuvent faire manquer la dernière valeur. Préférez un compteur entier et une division : x = i / 10.Do While … Loop
Quand on ne sait pas combien de tours faire, on répète tant qu’une condition est vraie : Do While condition … Loop. La condition est testée avant chaque tour ; si elle est fausse dès le départ, le bloc ne s’exécute jamais. C’est à vous de faire évoluer la condition dans le bloc (ici i = i + 1), sinon la boucle ne s’arrête pas.
End(xlUp).Row.Exit Do sort immédiatement d’une boucle Do, quelle que soit la condition.Do … Loop : tester au début ou à la fin
La condition peut se placer après Do ou après Loop. Do … Loop While condition exécute le bloc au moins une fois, puis teste. C’est utile pour redemander une saisie tant qu’elle n’est pas valide : la question doit être posée avant d’être vérifiée. Sans aucune condition, Do … Loop tourne indéfiniment et ne se quitte que par Exit Do.
Do / s = InputBox("Nombre de stagiaires ?") / Loop Until IsNumeric(s) : la boîte réapparaît tant que la saisie n’est pas un nombre.Do While … Loop, Do Until … Loop, Do … Loop While, Do … Loop Until : While ou Until, au début ou à la fin.Do Until : jusqu’à ce que
Do Until condition est l’inverse de Do While : la boucle tourne tant que la condition est fausse et s’arrête dès qu’elle devient vraie. Do Until Cells(i, 1).Value = "" équivaut à Do While Cells(i, 1).Value <> "" : choisissez la forme qui se lit le plus naturellement. Prévoyez toujours une condition de sortie de secours.
Do Until trouve se lit mieux que Do While Not trouve.While … Wend
While condition … Wend est l’ancienne syntaxe, conservée pour la compatibilité. Elle fonctionne comme Do While … Loop, avec deux limites : pas de test en fin de boucle et pas d’instruction pour en sortir (il n’existe pas de Exit While). Vous la rencontrerez dans du code ancien ; pour du code neuf, utilisez Do … Loop.
For Each … Next
For Each élément In collection parcourt tous les éléments d’une collection d’objets, sans compteur : chaque cellule d’une plage (For Each c In Range("B2:B7")), chaque feuille (For Each ws In Worksheets), chaque classeur ouvert. La variable se déclare avec le type de l’objet (Range, Worksheet). C’est la boucle la plus simple quand on veut traiter tout le monde.
For Each c In Range("A1").CurrentRegion.Columns(2).Cells : la plage suit la taille réelle du tableau.Quitter une boucle et sortir des boucles infinies
Exit For (dans une boucle For ou For Each) et Exit Do (dans une boucle Do) quittent immédiatement la boucle : l’exécution reprend après Next ou Loop. C’est le cas typique d’une recherche : inutile de continuer une fois la valeur trouvée. Quand une boucle ne s’arrête plus (condition jamais atteinte, compteur oublié), Excel ne répond plus : appuyez sur Échap ou Ctrl + Pause pour interrompre la macro.
DoEvents laisse Excel traiter les clics et l’affichage ; Application.StatusBar = "Ligne " & i montre la progression.Exercice : parcourir, totaliser, nettoyer et chercher
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
- Exécutez
Numeroter(For … Next) puisTotaliser(Do While) sur la feuille Ventes. - Exécutez
Surligner(For Each) etChercher(Exit For). - Exécutez
SupprimerVidessur la feuille Import (Step -1), puisListerFeuilles. - Répondez aux questions de la feuille Contrôle.