Cours VBA : les boucles

Les boucles permettent de répéter des instructions un certain nombre de fois pour vous éviter de devoir écrire des macros d'une longueur interminable et vous faire gagner un temps considérable.

Le code suivant numérote les cellules de la colonne A (de la ligne 1 à 12) :


Sub exemple()

    Cells(1, 1) = 1
    Cells(2, 1) = 2
    Cells(3, 1) = 3
    Cells(4, 1) = 4
    Cells(5, 1) = 5
    Cells(6, 1) = 6
    Cells(7, 1) = 7
    Cells(8, 1) = 8
    Cells(9, 1) = 9
    Cells(10, 1) = 10
    Cells(11, 1) = 11
    Cells(12, 1) = 12

End Sub

Ce code est très répétitif ...

Maintenant, imaginez qu'il faille numéroter plusieurs milliers de lignes ... Vous comprenez donc probablement l'intérêt de créer des boucles.

Voici la boucle Do :

Sub exemple()

    Do While [CONDITION]
        'Instructions
    Loop

End Sub

Tant que la condition est vraie, les instructions sont exécutées en boucle (attention à ne pas créer une boucle infinie).

Voici la macro répétitive ci-dessus avec la boucle Do :

Sub exemple()

    Dim numero As Integer

    numero = 1 'Numéro de départ

    Do While numero <= 12 'Tant que la variable numero est <= 12, la boucle est répétée
        Cells(numero, 1) = numero 'Numérotation
        numero = numero + 1 'Le numéro est augmenté de 1 à chaque boucle
    Loop

End Sub

Avec cette boucle, si nous voulons numéroter 500 lignes, il suffit alors de remplacer 12 par 500 ...

Do Loop

Dans le précédent exemple, vous avez pu voir la boucle Do sous la forme suivante :

Sub exemple()

    Do While [CONDITION]
        'Instructions
    Loop

End Sub

Avec Do, la condition peut également être placée en fin de boucle, ce qui implique que les instructions seront dans tous les cas exécutées au moins une fois :

Sub exemple()

    Do
        'Instructions
    Loop While [CONDITION]

End Sub

Plutôt que de répéter la boucle tant que la condition est vraie, il est possible de quitter la boucle lorsque la condition est vraie en remplaçant While par Until :

Sub exemple()

    Do Until [CONDITION]
        'Instructions
    Loop

End Sub

For Next

Sub exemple()
    
    Dim i As Integer

    For i = 1 To 5
        'Instructions
    Next

End Sub

La boucle For est répétée ici 5 fois.

A chaque répétition de la boucle, la variable i est automatiquement incrémentée de 1 :

Sub exemple()
    
    Dim i As Integer

    For i = 1 To 5
        MsgBox i 'Renvoie les valeurs : 1 / 2 / 3 / 4 / 5
    Next

End Sub

Si nécessaire, vous pouvez modifier l'incrément (par défaut à 1) de la boucle en ajoutant Step :

Sub exemple()
    
    Dim i As Integer

    For i = 10 To 0 Step -2
        MsgBox i 'Renvoie les valeurs : 10 / 8 / 6 / 4 / 2 / 0
    Next

End Sub

For Each Next

La boucle For Each permet de parcourir chaque élément d'un ensemble d'éléments, par exemple parcourir chaque cellule d'une plage de cellules :

Sub exemple()

    Dim cellule As Range
    
    For Each cellule In Range("A1:B3")
        cellule = cellule.Address
    Next

End Sub

Parcourir chaque feuille du classeur :

Sub exemple()

    Dim feuille As Worksheet
    
    For Each feuille In Worksheets
        MsgBox feuille.Name
    Next

End Sub

Parcourir chaque élément d'un tableau :

Sub exemple()

    Dim tableau(2) As String
    
    tableau(0) = "A"
    tableau(1) = "B"
    tableau(2) = "C"
    
    For Each valeur In tableau
        MsgBox valeur
    Next

End Sub

Quitter une boucle prématurément

Il est possible de quitter une boucle For prématurément grâce à l'instruction suivante :

Exit For 'Quitter une boucle For

Dans cet exemple, l'objectif est de retourner le numéro de la première ligne contenant la valeur 1. Lorsque cet objectif est atteint, le numéro est affiché et la boucle est interrompue (car il est dans ce cas inutile de parcourir les autres lignes) :

Sub exemple()
    
    Dim i As Integer

    'Boucle pour 100 lignes au maximum
    For i = 1 To 100

        'Si la cellule vaut 1
        If Cells(i, 1) = 1 Then 'Si l'objectif est atteint
            MsgBox "La cellule a été trouvée à la ligne " & i & " !"
            Exit For 'On quitte la boucle For
        End If

    Next

End Sub

Les autres instructions Exit :

Exit Do 'Quitter une boucle Do
Exit Sub 'Quitter une procédure
Exit Function 'Quitter une fonction