Structures de répétition (Les boucles) dans Excel VBA

L’instruction Loop (Boucle) est utilisée pour répéter l’exécution de blocs de code VBA un nombre prédéterminé de fois. Il est possible de créer trois types de structures avec l’instruction Loop :
■ Do…Loop;

■ Do While…Loop;

■ Do Until…Loop.
 
1 Do…Loop

La structure de boucle Do … Loop utiliser le mot clé While pour déterminer qu’un ensemble d’instructions s’exécutera tant qu’une condition est vraie ou le mot clé Until pour déterminer qu’un ensemble d’instructions s’exécutera tant qu’une condition est fausse. La syntaxe de cette structure est la suivante :

Do {While | Until} Condition
    Instructions
Exit Do
    Instructions
Loop

Cette structure est divisée en deux parties:

■ Condition (facultatif): expression numérique ou chaîne égale à True ou False (les conditions Null sont traitées comme False).
■ Instructions: une instruction ou un ensemble d’instructions qui sera exécuté de manière répétée lorsque Condition est égal à True ou jusqu’à ce que cela se produise.
Nous pouvons utiliser l’instruction Exit Do pour arrêter le flux de la structure Do…Loop. Dans ce cas, l’exécution se poursuit à partir de la ligne située en dessous de l’instruction Loop. Dans le cas de structures Do … Loop imbriquées, une instruction Exit Do transfère l’exécution à la structure située au niveau immédiatement supérieur à celui en cours.
2 Do While…Loop
La structure de boucle Do While … permet à un ensemble d’instructions d’être exécuté lorsqu’une condition est vraie. Cette structure a deux syntaxes possibles.
a- Condition testée au début de la boucle
Avec cette syntaxe illustrée ci-dessous, les instructions ne sont exécutées que si la condition est vraie (si la condition est fausse, l’exécution commence à la ligne située en dessous de l’instruction Loop):

Do While condition
    Instructions
Loop
Prenon un exemple de compteur de 0 à 10:
Sub BoucleDoWhile()
    Dim n As Long
    Do While n <= 10
    MsgBox n
    n = n + 1
    Loop
End Sub

Commentaires 

■ La variable n est déclaré en type Long (Nombre entier) car utilisée comme compteur.

■ La structure de boucle Do While … permet de compte de 0 à 10 tant que n est inférieur ou égale à 10.

■ La fonction MsgBox est la méthode la plus rapide, la plus simple et la plus utilisée pour afficher un message.

Considérez la feuille de travail suivante, qui devrait calculer le nombre total de vente de voitures de marque TOYOTA:

Figure : calculer le nombre total de vente de voitures

Le code suivant décrit la procédure qui démarrera dans la cellule B2 et exécutera les instructions contenues dans la boucle Do While tant que la cellule active sera remplie, c’est-à-dire différente de vide. Dans chaque cellule sélectionnée, il sera vérifié si le contenu est égal à TOYOTA et, le cas échéant, la valeur correspondante sera ajoutée à la variable toy, qui se trouve dans la cellule de colonne à côté de la cellule active (colonne C). Une fois la cohérence vérifiée et indépendante de la cellule activant le contenu TOYOTA ou non vérifié, celle-ci sera placée dans la cellule postérieure (ligne suivante) et répétera le processus.
La boucle ne se termine que lorsque la cellule active (appartenant à la colonne B) est vide. Prenons l’exemple:

Sub ExempleBoucleDoWhile()
    Dim toy As Integer
    Range("B2").Select
'Tant que la cellule active est différente du vide
    Do While ActiveCell <> ""
        If ActiveCell = "TOYOTA" Then
            toy = toy + ActiveCell.Offset(0, 1)
        End If
        ActiveCell.Offset(1, 0).Select
    Loop
    MsgBox "Total des ventes (TOYOTA) = " & toy
End Sub

Commentaires 

■ La méthode Select est utilisée pour sélectionner la cellule B1 qui est désormais considérée comme cellule active.

■ La propriété ActiveCell renvoie un objet Range qui représente la cellule active dans le classeur actif.

■ Tant que la cellule active (ActiveCell) est différente (<>) du vide (“”), si la cellule active contient le mot TOYOTA (If ActiveCell = “TOYOTA”), à la valeur correspondante sera ajoutée à la variable toy, qui se trouve dans la cellule de colonne à côté de la cellule active (toy = toy + ActiveCell.Offset(0, 1)).

■ La propriété Offset permet de décaler une cellule ou plage de cellule. Par exemple ActiveCell.Offset(0, 1) decale la plage de la cellule active d’une colonne vers la droite.

■ On passe ensuite à la prochaine  cellule (ActiveCell.Offset(1, 0).Select) pour vérifier si le contenu contient le mot TOYOTA.

Lorsque nous exécutons la macro, nous obtenons le résultat suivant :


b- Condition testée après instructions
La syntaxe suivante exécute toutes les instructions et teste la condition. Tant que la condition est vraie, la boucle sera exécutée à plusieurs reprises :

Do
    Instruction
Loop While Condition

Dans l’exemple ci-dessous, les commandes de la structure Do seront exécutées au moins une fois. En effet, les instructions sont d’abord exécutées avant de comparer l’action.

Sub BoucleDoWhile2()
    Dim n As Long
    n = 10
    Do
    MsgBox n
    n = n + 1
    Loop While n <= 20
End Sub

Commentaires 

■ Le message contenant la valeur de la variable n est affiché et la valeur 1 sera ajoutée à la variable qui aura la valeur 11.

■ Tant que la variable est inférieur ou égale à 20, la procédure continue.

3 Do Until…Loop
La structure de boucle Do Until …Loop exécute des instructions lorsqu’une condition est fausse.
Comme pour la boucle Do While …Loop, cette structure a deux syntaxes possibles :
a- Condition testée au début de la boucle

Do Until Condition
    Instrution
Loop

Comme dans l’exemple précédent, qui utilise la structure Do … While, dans l’exemple ci-dessous, un compteur de 0 à 10 sera affiché. Dans ce cas, nous observons la condition Do à la valeur de la variable > 10, c’est-à-dire uniquement lorsque la condition pour satisfaisante, la procédure quitte la boucle Do … Until.

Sub BoucleDoUntil()
    Dim n As Long
    Do Until n > 10
        MsgBox n
        n = n + 1
    Loop
End Sub

À l’aide de la boucle Do..Until, examinez l’exemple pour calculer le nombre total de voiture TOYOTA. Cet exemple a déjà été démontré à l’aide de la boucle Do..While. Notez que la condition de boucle Do..Until est inversée par rapport à la condition de boucle Do..while, mais les deux codes auront le même objectif et auront le même résultat.

Sub ExempleBoucleDoUntil()
    Dim toy As Integer
    Range("B2").Select
'Faire jusqu'à ce que la cellule active soit nulle (vide)
    Do Until ActiveCell = ""
        If ActiveCell = "TOYOTA" Then
            toy = toy + ActiveCell.Offset(0, 1)
        End If
        ActiveCell.Offset(1, 0).Select
    Loop
    MsgBox "Total des ventes (TOYOTA) = " & toy
End Sub

Commentaires

■ Jusqu’à ce que la cellule active (B2 representée par ActiveCell) soit vide (Do Until ActiveCell = “”), à la valeur correspondante sera ajoutée à la variable toy, qui se trouve dans la cellule de colonne à côté de la cellule active (toy = toy + ActiveCell.Offset(0, 1)).

Figure : Condition testée au début de la boucle



b-  Condition testée à la fin de la boucle

Do
    Instruction
Until Loop Condition

Dans ce cas, considérons l’exemple suivant :

Sub BoucleDoUntil()
    Dim n As Byte
    n = 8
    Do
    MsgBox n
    n = n + 1
    Loop Until n > 10
End Sub

Commentaires 

Notez que la boucle continue à effectuer le calcul jusqu’à ce que le nombre soit supérieur à 10.

4 While … Wend (Tant que …)
La structure While … Wend est un peu similaire à la structure Do While …, à l’exception que le test de condition doit être effectué au début, comme dans la syntaxe suivante :

While Condition
    Instruction
Wend
Prenons l'exemple suivant :
Sub WhileWend()
    Dim n As Long
        While n <= 10
            MsgBox n
            n = n + 1
        Wend
End Sub 

Commentaires

La condition est vérifiée à plusieurs reprises et, chaque fois que True (Vrai), les instructions situées avant l’instruction Wend sont exécutées.

Si la condition est égal à False, l’exécution continuera à partir de la ligne sous l’instruction Wend.

5 For…Next et For Each…Next

La boucle For … Next est utilisée pour définir le nombre de répétitions d’un ensemble d’instructions. Cette boucle nécessite un compteur (une variable numérique) avec une valeur de début, une valeur de fin et une étape, comme dans la syntaxe suivante :

For counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]

Commentaires

La syntaxe de l’instruction For…Next comprend les éléments suivants :

counter (Obligatoire) : Variable numérique utilisée comme un compteur de boucles. Cette variable ne peut être ni une variable de type Boolean, ni un élément de tableau.

start (Obligatoire) : Valeur initiale de compteur.

end (Obligatoire) :Valeur finale de compteur.

step (Facultatif) : Valeur d’incrémentation de counter après chaque exécution de la boucle. Si aucune valeur n’est indiquée, l’argument step prend par défaut la valeur 1

statements (Facultatif) : Une ou plusieurs instructions entre For et Next à exécuter le nombre de fois indiqué.

Chaque fois que le bloc de code compris entre les instructions For et Next est exécuté, le compteur qui commence par la valeur définie sur initiale, est incrémenté de la valeur définie comme étape. La boucle est exécutée autant de fois que nécessaire pour que le compteur atteigne sa valeur finale. Par exemple, si la valeur initiale est 10, la valeur finale est 20 et l’incrément est 2, les instructions de bloc entre le compteur et l’instruction Next seront exécutées 6 fois (10, 12, 14, 16, 18 et 20):

Sub BoucleForNext()
    Dim n As Long
        For n = 10 To 20 Step 2
            MsgBox n
        Next
End Sub

Commentaires 

L’instruction Step est la valeur d’incrémentation de compteur après chaque exécution de la boucle.

Si aucune valeur n’est indiquée, l’argument step prend par défaut la valeur 1.
Pour compter le total vendu des voitures TOYOYA, considérons l’exemple suivant, à l’aide de la boucle For ..  Next:

Sub ExempleBoucleForNext()
    Dim toy, ligne As Integer
    Range("B2").Select
'Parcourir de la ligne 2 à la ligne 22
    For ligne = 2 To 22
        Cells(ligne, 2).Select
        If ActiveCell = "TOYOTA" Then
            toy = toy + ActiveCell.Offset(0, 1)
        End If
    Next
    MsgBox "Total des ventes (TOYOTA) = " & toy
End Sub

Figure : La boucle For … Next

La boucle For Each … Next fonctionne de la même manière que la boucle For … Next, mais le nombre de fois où les instructions seront exécutées est déterminé par le nombre d’éléments d’un tableau ou d’une collection. La syntaxe de cette boucle est la suivante:

For Each element In group
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]

Commentaires

La syntaxe de l’instruction For…Each…Next comprend les éléments suivants :

■ element (Requis) : Variable utilisée pour itérer les éléments de la collection ou de la matrice. Pour les collections, Element ne peut être qu’une variable de type Variant , une variable objet générique ou une variable d’objet spécifique. Pour les matrices, élément ne peut être qu’une variable Variant.

■ group (Requis) : Nom d’une collection ou d’une matrice d’objets (à l’exception d’une matrice de types définis par l’utilisateur).

■ statements (Facultatif) : Une ou plusieurs instructions exécutées sur chaque élément dans group.
L’instruction Exit For peut être utilisée pour rompre une boucle à tout moment (généralement utilisée après qu’une condition a été remplie), ce qui permet à l’exécution de continuer à partir de la ligne située en dessous de Next.
L’instruction For … Each … Next ne peut pas être utilisée avec un tableau de types définis par l’utilisateur. En effet, lorsque vous utilisez des tableaux, Element doit être une variable de type Variant, qui ne peut pas contenir un type défini par utilisateur.
Lorsque la boucle est insérée, toutes les instructions du bloc sont exécutées pour le premier élément de groupe, puis pour le deuxième élément, etc. Lorsqu’il n’y a plus d’éléments dans Group, l’exécution quitte la boucle et continue à partir de l’instruction située en dessous de l’instruction Next. N’oubliez pas que le bloc For … Chaque bloc n’est inséré que si Groupe contient au moins un élément.
Il est possible d’imbriquer des boucles For … Each…Next, mais chaque élément de la boucle doit être unique. Si l’instruction Next ne spécifie pas Element, l’exécution des instructions se poursuit comme si cet élément était inclus.
Dans l’exemple ci-dessous, la variable appelée CelluleX traversera la plage des cellules B2 à B22, en vérifiant que le contenu de la cellule est le mot TOYOTA. Si la condition est remplie, la couleur intérieure de la cellule devient rouge. Nous pouvons utiliser la même feuille de calcul que les exemples précédents.

Sub BoucleForEach()
    Dim CelluleX As Object
    For Each CelluleX In Range("B2:B22")
        If CelluleX.Value = "TOYOTA" Then
            CelluleX.Interior.ColorIndex = 3
        End If
    Next
End Sub

Figure : La boucle For Each…Next

Commentaires :

La propriété ColorIndex envoie et définit la couleur de la bordure, de la police ou de l’intérieur, comme l’indique le tableau suivant. La couleur est spécifiée sous la forme d’une valeur d’index dans la palette de couleurs, ou comme une des constantes XlColorIndex  : xlColorIndexAutomatic ou xlColorIndexNone. Sa syntaxe est expression.ColorIndex, où expression peut prendre les valeur Border, Font ou Interior.

Objet Description
Border Couleur de la bordure.
Font Couleur de la police de caractères.
Interior Couleur de remplissage de l’intérieur. Affectez la valeur xlColorIndexNone à ColorIndex pour indiquer que vous ne souhaitez pas de remplissage intérieur. Affectez la valeur xlColorIndexAutomatic à ColorIndex pour indiquer le remplissage automatique (pour les objets dessinés).

6 GoTo
L’instruction GoTo entraîne l’exécution d’une instruction spécifiée par un libellé de ligne, ignorant les autres instructions possibles du flux normal de procédures. Vous pouvez spécifier des étiquettes de ligne pour n’importe quelle ligne de code en saisissant simplement un nom alphanumérique commençant par une lettre et finissant par le signe deux-points (:).
Dans l’exemple de code ci-dessous, lorsqu’une condition est remplie, l’instruction GoTo sera utilisée pour exécuter l’instruction identifiée avec le libellé de ligne ErreurLogin:

Sub GoToTest()
    Dim NomUtilisateur as String
    NomUtilisateur = InputBox ("Tapez votre nom: ")
    If NomUtilisateur <> "eliechan" Then
        GoTo ErreurLogin
    Endif
    MsgBox ("Salut, Elie!")
    Exit Sub
    ErreurLogin:
    MsgBox "L'accès est refusé. Seul Elie Chancelin est autorisé à accéder."
End Sub

Commentaires

La fonction InputBox permet à l’utilisateur de saisir un nom, qui sera ensuite vérifié. Si ce nom est différent de eliechan, l’exécution passe au point identifié par le libellé de ligne ErreurLogin:, qui affiche le message de la deuxième commande MsgBox.

Si le nom que vous entrez est eliechan, le message de la première commande MsgBox sera affiché, le code aura une séquence et sera finalisé dans l’instruction Exit Sub.
Il est important de noter que la lecture et l’interprétation d’un code comportant de nombreuses instructions GoTo peuvent être difficiles. VBA propose d’autres instructions plus appropriées et structurées pour modifier le flux d’exécution des procédures. Il est recommandé d’utiliser l’instruction GoTo uniquement lorsque cela est nécessaire (dans le suivi des erreurs, par exemple).

S’abonner
Notifier de
0 Commentaires
Inline Feedbacks
Voir tous les commentaires

Initiation à Excel

Fonctions Excel

Excel VBA

Macros VBA Utiles

Plus d'outils

Sur Facebook

Sur YouTube

0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x