De la théorie à la pratique : construire une macro complète avec Loop For VBA

La boucle For…Next en VBA répète un bloc d’instructions un nombre de fois défini par un compteur. C’est la structure de contrôle la plus utilisée dans les macros Excel pour parcourir des cellules, des lignes ou des éléments de tableau. Comprendre son mécanisme interne avant de l’intégrer dans une macro complète évite la plupart des erreurs de logique que l’on découvre trop tard à l’exécution.

Anatomie d’une boucle For Next en VBA

Une boucle For…Next repose sur trois éléments : une variable compteur, une valeur de départ et une valeur de fin. À chaque passage, VBA incrémente le compteur d’un pas (par défaut 1) jusqu’à dépasser la borne supérieure.

A découvrir également : Comment se connecter à Arkevia ?

La syntaxe de base ressemble à ceci :

Sub ExempleBoucle()
Dim i As Long
For i = 1 To 10
    Cells(i, 1).Value = i * 2
Next i
End Sub

Lire également : NTYMail : comment accéder à votre messagerie ?

Ici, la variable i démarre à 1, et le code écrit dans la colonne A le double de chaque numéro de ligne, de la ligne 1 à la ligne 10. Le mot-clé Next renvoie l’exécution au début de la boucle en incrémentant le compteur.

Le mot-clé Step pour modifier l’incrément

Par défaut, le compteur augmente de 1. Le mot-clé Step permet de changer ce comportement. Un pas négatif autorise un parcours en sens inverse.

For i = 20 To 2 Step -2 parcourt les lignes 20, 18, 16… jusqu’à 2. Cette possibilité est utile quand on supprime des lignes dans un tableau Excel : en partant du bas, les index des lignes restantes ne changent pas au fur et à mesure de la suppression.

Professionnelle utilisant l'éditeur VBA d'Excel dans un bureau en open space pour construire une macro avec une boucle For

Déclarer les variables avant la boucle For VBA

Une macro fiable commence toujours par la déclaration explicite de ses variables avec Dim. L’instruction Option Explicit, placée en tête de module, force cette déclaration et empêche VBA de créer silencieusement des variables mal orthographiées.

  • Dim i As Long : pour le compteur. Le type Long couvre une plage de valeurs largement suffisante pour parcourir des lignes Excel.
  • Dim derniereLigne As Long : pour stocker dynamiquement la dernière ligne remplie d’une colonne, ce qui évite de coder en dur une borne fixe.
  • Dim ws As Worksheet : pour référencer explicitement la feuille de travail cible, ce qui protège la macro contre les erreurs quand plusieurs feuilles sont ouvertes.

Déclarer le compteur en Long plutôt qu’en Integer est une habitude à prendre. Le type Integer est limité à 32 767, ce qui peut poser problème sur des jeux de données volumineux. Le type Long accepte des valeurs bien plus élevées sans coût de performance mesurable.

Construire une macro complète avec boucle For : nettoyage de données Excel

Passer de la syntaxe isolée à une macro fonctionnelle suppose d’assembler plusieurs briques : déclaration des variables, détection dynamique de la plage de données, boucle de traitement, et gestion des cas limites.

Prenons un cas concret : une colonne B contient des montants saisis manuellement, parfois avec des espaces ou des textes parasites. La macro doit parcourir chaque cellule, vérifier si la valeur est numérique, et appliquer un formatage monétaire aux cellules valides tout en colorant en rouge les cellules problématiques.

Code complet de la macro de nettoyage

Sub NettoyerMontants()
Dim ws As Worksheet
Dim i As Long
Dim derniereLigne As Long

Set ws = ThisWorkbook.Sheets(« Données »)
derniereLigne = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row

For i = 2 To derniereLigne
    If IsNumeric(ws.Cells(i, 2).Value) Then
        ws.Cells(i, 2).NumberFormat = « #,##0.00 € »
    Else
        ws.Cells(i, 2).Interior.Color = RGB(255, 200, 200)
    End If
Next i
End Sub

La ligne Cells(ws.Rows.Count, 2).End(xlUp).Row détecte la dernière ligne remplie en colonne B en remontant depuis le bas de la feuille. Cette technique rend la macro adaptable à n’importe quelle taille de jeu de données, sans modification du code.

La boucle démarre à 2 pour sauter la ligne d’en-tête. Chaque itération teste la cellule avec IsNumeric : si la valeur est un nombre, le format monétaire s’applique ; sinon, un fond rouge signale l’anomalie.

Écran d'ordinateur portable affichant le code VBA d'une boucle For dans un éditeur Visual Basic, posé sur une table de bibliothèque universitaire

Boucle For Each VBA pour parcourir des collections d’objets

La variante For Each…Next ne fonctionne pas avec un compteur numérique. Elle parcourt chaque élément d’une collection (cellules d’une plage, feuilles d’un classeur, fichiers d’un dossier) sans exiger de connaître leur nombre à l’avance.

Sub ProtegerFeuilles()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
    ws.Protect Password:= »motdepasse »
Next ws
End Sub

Cette macro protège toutes les feuilles du classeur en une seule exécution. Ajouter ou supprimer une feuille ne casse pas le code, car la collection Worksheets est évaluée dynamiquement.

For Next ou For Each : critères de choix

For…Next convient quand le traitement dépend de la position (numéro de ligne, index). For Each est préférable quand on agit uniformément sur chaque élément d’une collection sans se soucier de l’ordre. Mélanger les deux dans une même macro est courant : For Each pour parcourir les feuilles, For…Next à l’intérieur pour parcourir les lignes de chaque feuille.

Erreurs fréquentes dans les boucles For en macro VBA

Trois pièges reviennent régulièrement lors de la construction de macros avec des boucles For.

Le premier : modifier la variable compteur à l’intérieur de la boucle. Écrire i = i + 1 dans le corps d’un For…Next provoque un saut d’itération difficile à détecter. Le compteur est géré automatiquement par Next ; toute modification manuelle crée un comportement imprévisible.

Le deuxième : ne pas désactiver le rafraîchissement d’écran. Sur un tableau de plusieurs milliers de lignes, chaque écriture dans une cellule déclenche un recalcul visuel. Ajouter Application.ScreenUpdating = False avant la boucle et le remettre à True après divise le temps d’exécution de manière significative.

Le troisième : imbriquer trop de boucles For sans extraire de sous-procédures. Au-delà de deux niveaux d’imbrication, le code devient difficile à lire et à déboguer. Isoler le traitement interne dans une procédure Sub séparée, appelée depuis la boucle, améliore la lisibilité et facilite les tests unitaires.

La maîtrise d’Excel et de VBA reste valorisée pour l’automatisation de tâches dans des secteurs variés (énergie, finance, contrôle interne). Savoir construire une macro structurée autour d’une boucle For demeure une compétence recherchée, y compris dans un contexte où les outils d’IA commencent à générer du code VBA.

Comprendre ce que le code fait ligne par ligne reste la seule garantie de pouvoir le corriger quand l’automatisation échoue.

Les plus lus