Une boucle For en VBA répète un bloc d’instructions un nombre défini de fois. Une condition If évalue une expression et oriente l’exécution selon le résultat. Combiner les deux dans une même macro permet de parcourir des plages de cellules Excel tout en filtrant, transformant ou validant chaque donnée ligne par ligne. La solidité d’une macro dépend directement de la façon dont ces deux structures s’imbriquent.
Anatomie d’une boucle For Next en VBA Excel
La boucle For Next repose sur un compteur, une borne de départ et une borne de fin. À chaque itération, le compteur s’incrémente (par défaut de 1) jusqu’à atteindre la borne finale. La syntaxe minimale ressemble à ceci :
A lire aussi : Scrabble Clicmouse : comment jouer en ligne ?
Dim i As LongFor i = 1 To 10 Cells(i, 1).Value = i * 2Next i
Ce code écrit les doubles de 1 à 10 dans la colonne A. Le mot-clé Next referme le bloc et incrémente le compteur. Trois points méritent une attention particulière pour écrire des macros fiables.
A découvrir également : Roundcubefree ou Zimbra : quel webmail Free choisir au quotidien ?
- Déclarer le compteur en Long plutôt qu’en Integer : un Integer est limité à 32 767, ce qui provoque un dépassement silencieux sur de grands classeurs. Long supporte plus de deux milliards de valeurs.
- Calculer la dernière ligne dynamiquement avec
LastRow = Cells(Rows.Count, 1).End(xlUp).Rowau lieu de coder une borne fixe. Toute modification du classeur invalide une borne en dur. - Éviter de modifier la plage parcourue pendant l’itération (suppression de lignes, insertion de colonnes). Si c’est nécessaire, parcourir la boucle en sens inverse avec
Step -1.
Ces précautions évitent la majorité des erreurs d’exécution rencontrées dans les macros de traitement de données.

Condition If Then Else : logique de branchement dans une macro VBA
L’instruction If évalue une expression booléenne. Si elle est vraie, le bloc qui suit Then s’exécute. Sinon, le bloc Else prend le relais. On peut chaîner plusieurs tests avec ElseIf.
Un If isolé n’a d’intérêt que ponctuel. Sa puissance apparaît quand il est placé à l’intérieur d’une boucle : chaque itération devient un point de décision. Le code ne se contente plus de parcourir, il trie, valide ou transforme.
Opérateurs de comparaison et opérateurs logiques
Les comparaisons de base (=, <>, >, <) se combinent avec And, Or et Not. Attention à l'ordre d'évaluation : VBA évalue toutes les conditions d'un And même si la première est fausse, ce qui peut déclencher une erreur sur un objet inexistant. Tester l'existence d'un objet avant d'accéder à ses propriétés reste une règle de base pour éviter les plantages.
Par exemple, vérifier qu'une cellule n'est pas vide avant de comparer sa valeur :
If Cells(i, 1).Value <> "" And IsNumeric(Cells(i, 1).Value) Then
Cette double vérification protège le reste du code contre les données manquantes ou mal typées.
Imbriquer For et If pour filtrer des données dans un classeur Excel
Le cas d'usage le plus courant consiste à parcourir toutes les lignes d'une plage avec For, puis à appliquer un traitement conditionnel avec If. Voici un exemple complet qui colore en rouge les cellules dont la valeur dépasse un seuil :
Sub ColorerHorsLimite() Dim i As Long Dim lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To lastRow If Cells(i, 3).Value > 1000 Then Cells(i, 3).Interior.Color = vbRed Else Cells(i, 3).Interior.ColorIndex = xlNone End If Next iEnd Sub
La variable lastRow rend la macro adaptable à n'importe quelle longueur de données. Le Else réinitialise la couleur pour éviter qu'un ancien marquage persiste après modification du classeur.
Boucles imbriquées avec double condition
Quand le traitement porte sur plusieurs colonnes, une seconde boucle For parcourt les colonnes à l'intérieur de la boucle principale. Chaque cellule subit alors un test If qui dépend de sa position et de sa valeur. Ce type de macro sert à auditer un tableau entier, par exemple pour repérer des cellules vides dans une plage obligatoire :
For i = 2 To lastRow For j = 1 To 5 If IsEmpty(Cells(i, j)) Then Cells(i, j).Value = "MANQUANT" End If Next jNext i
Chaque boucle imbriquée multiplie le nombre d'itérations. Sur un classeur de plusieurs milliers de lignes, la lenteur devient perceptible. Deux leviers permettent de la limiter.

Optimisation et gestion d'erreurs dans les boucles VBA
Désactiver le rafraîchissement d'écran avec Application.ScreenUpdating = False avant la boucle, puis le réactiver après, réduit considérablement le temps d'exécution. Désactiver le recalcul automatique (Application.Calculation = xlCalculationManual) produit le même effet sur les classeurs contenant des formules complexes.
Gestion d'erreurs avec On Error dans une boucle For
Placer un On Error Resume Next global autour d'une boucle masque toutes les erreurs, y compris celles qui signalent un vrai problème. Une approche plus robuste consiste à cibler la gestion d'erreur sur l'instruction risquée, puis à tester immédiatement Err.Number :
For i = 2 To lastRow On Error Resume Next valeur = Cells(i, 1).Value If Err.Number <> 0 Then Err.Clear GoTo LigneSuivante End If On Error GoTo 0 ' traitement normal iciLigneSuivante:Next i
Ce patron localise l'erreur à la ligne fautive sans compromettre le reste de l'exécution. Après migration d'un classeur vers une nouvelle version d'Office, ce type de structure aide à identifier les lignes problématiques plutôt que de laisser la macro s'arrêter brutalement.
For Each et Select Case : alternatives et compléments au duo For-If
La boucle For Each parcourt directement les objets d'une collection (cellules d'un Range, feuilles d'un classeur) sans compteur explicite. Elle simplifie la lecture du code quand l'index numérique n'est pas nécessaire :
Dim cel As RangeFor Each cel In Range("A2:A" & lastRow) If cel.Value = "" Then cel.Interior.Color = vbYellowNext cel
Quand les branches conditionnelles dépassent trois ou quatre ElseIf, la structure Select Case rend le code plus lisible qu'une cascade de If. Chaque Case correspond à une valeur ou une plage de valeurs du même objet, ce qui évite de répéter la variable testée à chaque ligne.
Select Case cel.ValuepuisCase Is > 1000,Case 500 To 1000,Case Elsecouvrent trois scénarios en quelques lignes.- For Each combiné à Select Case est particulièrement adapté aux macros de catégorisation (attribuer un libellé, un code couleur ou un statut selon la valeur d'une cellule).
- For Next avec compteur reste préférable quand la position de la ligne ou de la colonne intervient dans le traitement (calculs entre cellules adjacentes, décalages relatifs).
Le choix entre ces structures n'est pas esthétique. Il conditionne la maintenabilité du code et la facilité avec laquelle un autre utilisateur pourra le modifier après vous. Une macro robuste est d'abord une macro que quelqu'un d'autre peut relire six mois plus tard sans documentation externe.

