Boucle en VBA : maîtriser les boucles dans Excel pour automatiser vos tâches
Vous avez déjà eu besoin de répéter la même action sur des dizaines, voire des milliers de lignes Excel ? Modifier une cellule, vérifier une condition, copier une valeur ou supprimer des données : faire cela manuellement est long, répétitif et source d’erreurs. C’est précisément dans ce type de situation que les boucles en VBA deviennent indispensables.
Une boucle permet de demander à Excel de répéter automatiquement une instruction, ou un ensemble d’instructions, tant qu’une condition est remplie ou pour chaque élément d’une liste. En quelques lignes de code, vous pouvez remplacer de longues minutes de manipulation par une macro fiable et réutilisable.
Dans cet article, nous allons voir les principales boucles VBA, leurs différences, leurs avantages et les erreurs à éviter. L’objectif : vous donner les bases nécessaires pour automatiser vos tâches avec méthode, sans transformer votre classeur en laboratoire secret de la NASA.
Pourquoi utiliser une boucle en VBA ?
Imaginez une feuille contenant 5 000 lignes de données. Vous souhaitez colorer en rouge les montants supérieurs à 1 000 €, ou ajouter le texte « À vérifier » dans une colonne lorsque la cellule voisine est vide. Une approche manuelle serait interminable. Une boucle, elle, peut parcourir chaque ligne et appliquer la règle automatiquement.
Les boucles sont particulièrement utiles pour :
- parcourir les lignes ou les colonnes d’un tableau ;
- répéter une opération sur plusieurs feuilles ;
- contrôler le contenu d’une plage de cellules ;
- rechercher une valeur répondant à un critère ;
- supprimer ou modifier des lignes ;
- traiter une collection d’objets Excel, comme les classeurs ou les feuilles.
Une boucle repose généralement sur trois éléments : un point de départ, une condition ou une liste d’éléments à parcourir, et une instruction répétée.
La boucle For…Next : la plus utilisée
La boucle For...Next est idéale lorsque vous connaissez le nombre de répétitions à effectuer. Elle utilise une variable compteur qui évolue à chaque passage.
For compteur = début To fin ' Instructions à répéterNext compteur
Voici un exemple simple qui écrit les nombres de 1 à 10 dans la colonne A :
Sub EcrireNombres() Dim i As Long For i = 1 To 10 Cells(i, 1).Value = i Next iEnd Sub
La variable i prend successivement les valeurs 1, 2, 3, jusqu’à 10. À chaque passage, la valeur est inscrite dans la ligne correspondante de la première colonne.
Le type Long est recommandé pour les compteurs de lignes. Il peut gérer un nombre de valeurs beaucoup plus important que le type Integer, ce qui évite certaines erreurs lorsque vous travaillez avec de grandes feuilles.
Parcourir les lignes d’un tableau
Dans la pratique, vous ne connaissez pas toujours à l’avance le nombre exact de lignes. Il est donc préférable de déterminer la dernière ligne utilisée avant de lancer la boucle.
Sub ParcourirTableau() Dim derniereLigne As Long Dim i As Long derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To derniereLigne Cells(i, 3).Value = Cells(i, 2).Value * 1.2 Next iEnd Sub
Dans cet exemple, la colonne A contient les données qui permettent de repérer la dernière ligne utilisée. La boucle commence à la ligne 2 afin d’ignorer l’en-tête. Pour chaque ligne, la valeur de la colonne B est multipliée par 1,2 et le résultat est inscrit dans la colonne C.
La ligne suivante est très fréquente en VBA :
derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
Elle part du bas de la colonne A et remonte jusqu’à la dernière cellule non vide. Attention toutefois : si votre colonne de référence contient des cellules vides au milieu ou à la fin du tableau, choisissez une colonne toujours renseignée, comme un identifiant ou une date.
Ajouter une condition dans une boucle
Une boucle devient particulièrement intéressante lorsqu’elle est associée à une structure If...Then. Vous pouvez ainsi exécuter une action uniquement lorsque certaines conditions sont remplies.
Sub IdentifierMontantsEleves() Dim derniereLigne As Long Dim i As Long derniereLigne = Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To derniereLigne If Cells(i, 2).Value > 1000 Then Cells(i, 3).Value = "À vérifier" Cells(i, 3).Interior.Color = RGB(255, 200, 200) End If Next iEnd Sub
Cette macro parcourt les montants de la colonne B. Si un montant dépasse 1 000, elle inscrit « À vérifier » dans la colonne C et applique une couleur de fond rosée.
Vous pouvez bien sûr utiliser plusieurs conditions :
If Cells(i, 2).Value > 1000 And Cells(i, 4).Value = "En attente" Then Cells(i, 5).Value = "Prioritaire"End If
Le mot-clé And exige que les deux conditions soient vraies. Avec Or, une seule des conditions doit être remplie.
Modifier le pas d’une boucle avec Step
Par défaut, une boucle For augmente le compteur de 1 à chaque passage. Vous pouvez modifier ce comportement avec Step.
For i = 1 To 10 Step 2 Cells(i, 1).Value = "Ligne impaire"Next i
Cette boucle traite les lignes 1, 3, 5, 7 et 9. Le compteur avance de deux en deux.
Il est également possible de parcourir une plage dans le sens inverse :
For i = 10 To 1 Step -1 Cells(i, 1).Value = iNext i
Le parcours décroissant est très utile lorsqu’il faut supprimer des lignes. Si vous supprimez une ligne en avançant de haut en bas, les lignes suivantes remontent et certaines peuvent être ignorées. En partant du bas, ce problème disparaît.
Sub SupprimerLignesVides() Dim derniereLigne As Long Dim i As Long derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row For i = derniereLigne To 2 Step -1 If Cells(i, 1).Value = "" Then Rows(i).Delete End If Next iEnd Sub
La boucle For Each : parcourir des objets
La boucle For Each est particulièrement pratique lorsque vous souhaitez parcourir chaque élément d’une collection. Elle évite de gérer vous-même un compteur.
For Each element In collection ' InstructionsNext element
Par exemple, voici une macro qui affiche le nom de chaque feuille du classeur dans la fenêtre Exécution :
Sub ListerFeuilles() Dim feuille As Worksheet For Each feuille In ThisWorkbook.Worksheets Debug.Print feuille.Name Next feuilleEnd Sub
ThisWorkbook désigne le classeur qui contient la macro. Cette précision est importante : ActiveWorkbook désigne le classeur actuellement actif, qui peut être différent si l’utilisateur ouvre un autre fichier pendant l’exécution.
Vous pouvez également parcourir les cellules d’une plage :
Sub MettreEnFormeCellules() Dim cellule As Range For Each cellule In Range("B2:B100") If cellule.Value < 0 Then cellule.Font.Color = RGB(192, 0, 0) End If Next celluleEnd Sub
Cette macro parcourt chaque cellule de B2 à B100 et colore en rouge les valeurs négatives.
La boucle Do While : continuer tant qu’une condition est vraie
La boucle Do While s’utilise lorsque le nombre de répétitions n’est pas connu à l’avance. Elle continue tant qu’une condition reste vraie.
Do While condition ' InstructionsLoop
Voici un exemple qui parcourt la colonne A tant que les cellules ne sont pas vides :
Sub ParcourirJusquaCelluleVide() Dim i As Long i = 2 Do While Cells(i, 1).Value <> "" Cells(i, 2).Value = "Ligne traitée" i = i + 1 LoopEnd Sub
La boucle commence à la ligne 2 et avance jusqu’à rencontrer une cellule vide dans la colonne A.
Vous pouvez aussi écrire la condition à la fin avec Do...Loop While :
Do i = i + 1Loop While Cells(i, 1).Value <> ""
La différence est importante : dans cette version, les instructions sont exécutées au moins une fois, même si la condition est fausse dès le départ.
La boucle Do Until : s’arrêter lorsqu’une condition est vraie
La boucle Do Until fonctionne à l’inverse de Do While. Elle continue jusqu’à ce que la condition soit vraie.
Sub RechercherMot() Dim i As Long i = 1 Do Until Cells(i, 1).Value = "FIN" i = i + 1 Loop MsgBox "Le mot FIN se trouve à la ligne " & iEnd Sub
Cette macro parcourt la colonne A jusqu’à trouver le texte « FIN ». Elle affiche ensuite le numéro de la ligne concernée.
Attention : si le mot recherché n’existe jamais, la boucle continuera indéfiniment. Pour éviter ce scénario, ajoutez une limite de sécurité :
Do Until Cells(i, 1).Value = "FIN" Or i > 1000 i = i + 1Loop
Une boucle infinie peut bloquer Excel. Si cela vous arrive, utilisez Ctrl + Pause ou le bouton d’arrêt dans l’éditeur VBA pour interrompre l’exécution.
Sortir prématurément d’une boucle
Le mot-clé Exit For permet de quitter immédiatement une boucle For. De même, Exit Do permet de sortir d’une boucle Do.
Sub TrouverPremiereValeur() Dim i As Long For i = 2 To 1000 If Cells(i, 1).Value = "Client recherché" Then MsgBox "Client trouvé à la ligne " & i Exit For End If Next iEnd Sub
Dès que le client est trouvé, il est inutile de poursuivre le parcours. La macro s’arrête donc immédiatement. Cela améliore la lisibilité du code et peut accélérer son exécution.
Améliorer les performances de vos boucles
Une boucle qui traite quelques dizaines de lignes s’exécute instantanément. Sur plusieurs dizaines de milliers de lignes, la différence peut devenir très visible. Quelques bonnes pratiques permettent d’éviter les ralentissements.
- Évitez autant que possible les sélections avec
Selectet les activations avecActivate. - Utilisez des variables pour mémoriser les objets, comme une feuille ou une plage.
- Désactivez temporairement l’actualisation de l’écran.
- Désactivez le recalcul automatique si votre macro effectue beaucoup de modifications.
- Préférez les tableaux VBA lorsque vous devez traiter une grande quantité de données.
Voici une structure classique pour accélérer une macro :
Sub TraitementRapide() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ' Votre boucle ici Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = TrueEnd Sub
Il est préférable de réactiver ces options même si une erreur survient. Pour une macro destinée à être utilisée régulièrement, ajoutez une gestion d’erreur afin qu’Excel ne reste pas bloqué en mode manuel.
Quelques erreurs fréquentes à éviter
Les boucles VBA sont accessibles, mais certains pièges reviennent souvent :
- Oublier d’incrémenter la variable dans une boucle
Do WhileouDo Until. - Utiliser une mauvaise colonne pour déterminer la dernière ligne.
- Commencer à la ligne 1 et écraser les en-têtes.
- Supprimer des lignes de haut en bas au lieu de parcourir la plage à l’envers.
- Ne pas prévoir le cas où aucune donnée ne correspond au critère.
- Utiliser des références non qualifiées, comme
Range("A1"), lorsque plusieurs feuilles sont ouvertes.
Pour rendre votre code plus sûr, précisez la feuille concernée :
Worksheets("Données").Cells(i, 3).Value = "OK"
Vous évitez ainsi qu’une macro écrive dans la mauvaise feuille simplement parce qu’un autre onglet était actif au moment du lancement.
Une méthode simple pour choisir sa boucle
Le choix de la boucle dépend surtout de la situation :
- Utilisez
For...Nextlorsque vous connaissez le début et la fin du parcours. - Utilisez
For Eachpour parcourir des cellules, des feuilles ou d’autres objets. - Utilisez
Do Whilepour continuer tant qu’une condition est vraie. - Utilisez
Do Untilpour continuer jusqu’à ce qu’une condition soit remplie.
Commencez toujours par décrire le problème avec des mots simples : « Pour chaque ligne du tableau, si le montant dépasse 1 000, alors j’ajoute une alerte. » Cette phrase contient déjà la structure de votre macro : une boucle, une condition et une action.
Avec un peu de pratique, les boucles deviennent rapidement un réflexe. Elles permettent de transformer une tâche répétitive en automatisation propre, rapide et réutilisable. La prochaine fois qu’Excel vous impose de répéter une action plus de trois fois, posez-vous la question : ne serait-ce pas le moment idéal pour écrire une boucle VBA ?