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 Select et les activations avec Activate.
  • 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 While ou Do 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...Next lorsque vous connaissez le début et la fin du parcours.
  • Utilisez For Each pour parcourir des cellules, des feuilles ou d’autres objets.
  • Utilisez Do While pour continuer tant qu’une condition est vraie.
  • Utilisez Do Until pour 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 ?