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).
bonjour,jai un souci
je souhaite faire des autoincrementation sur plusieur cellules, et ce a la suite d’un controle If du genre, if condition alors incrementer les cellules x et y, sinon ne rien faire. mais avec la commande if c est pas possible de mettre plusieurs resultats a partir d’une condition if. maintenant je suis nouveau dans VBA, du coup kelkun peut-il m’aider?
bonjour
je cherchais un programme pour des soustractions successives pour calcyler le pgcd de 2 nombres