Comment combiner Loop For VBA et conditions If pour des macros robustes ?

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 Long
For i = 1 To 10
  Cells(i, 1).Value = i * 2
Next 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).Row au 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.

Homme travaillant sur des macros Excel VBA avec boucles et conditions dans un bureau à domicile

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 i
End 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 j
Next 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.

Deux collègues collaborant sur un code VBA avec boucles For et conditions If dans un espace de co-working

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 ici
LigneSuivante:
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 Range
For Each cel In Range("A2:A" & lastRow)
  If cel.Value = "" Then cel.Interior.Color = vbYellow
Next 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.Value puis Case Is > 1000, Case 500 To 1000, Case Else couvrent 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.

Les immanquables