Les boucles
Objectifs
Dans ce chapitre, vous allez découvrir une partie importante de la programmation en VBA, celle des boucles. Nous y aborderons quelques définitions et cas de figure dans la vie réelle, puis nous verrons les différents types de boucles.
Vous apprendrez à structurer vos boucles et à en sortir de façon anticipée.
À la fin du chapitre, vous trouverez des exercices pour vous entraîner.
Cas d’utilisation des boucles
En VBA, lorsque vous souhaitez exécuter à plusieurs reprises la même série d’instructions, la méthode de recopier n fois les mêmes lignes n’est pas une solution viable, surtout lorsqu’il s’agit d’écrire un programme, comme par exemple :
Sub MauvaiseFaconDeCoder()
MsgBox "Bonjour"
MsgBox "Bonjour"
MsgBox "Bonjour"
.….
MsgBox "Bonjour"
End Sub
Exemple 1 : mauvaise façon de coder une instruction qui se répète
De la même façon, si vous souhaitez afficher le message jusqu’à ce que l’utilisateur tape une des valeurs que vous souhaitez (1 ou 0 par exemple), vous ne saurez pas à quel moment vous devez poursuivre le reste de votre programme comme avec le code suivant.
Sub AutreMauvaiseFaconDeCoder()
Dim Reponse As Integer
Reponse = InputBox("Veuillez saisir une valeur entre 1 et 0")
If Reponse <> 0 And Reponse <> 1 Then
Reponse = InputBox("Veuillez saisir une valeur entre 1 et 0")
End If
If Reponse <> 0 And Reponse <> 1 Then
Reponse...
Une boucle c’est quoi ?
Une boucle en VBA est une série de mots-clés qui délimitent une série d’instructions qui pourront être exécutées à plusieurs reprises, selon des conditions que vous pourrez fixer vous-même, comme afficher trois fois le même message, ou encore effectuer le même traitement sur plusieurs lignes d’une même feuille Excel.
Il existe plusieurs types de boucles, chacune ayant son intérêt selon les besoins. Leur nom est directement lié aux mots-clés qui sont utilisés pour encadrer les instructions répétées.
Une boucle est une structure de code composée de trois parties :
[Début de Boucle] [liée à une condition]
Instructions
[Boucler] [liée à une condition]
Pour savoir quel type de boucle utiliser, un tableau récapitulatif des cas de figure vous sera présenté en fin de chapitre.
Les différents types de boucles
Les boucles For Next
Lorsque vous savez déjà combien de fois vous souhaitez exécuter des instructions, la boucle For Next est tout indiquée.
La syntaxe générale d’une telle boucle est la suivante :
For Compteur=ValeurDebut To ValeurFin
Instructions
Next Compteur
Exemple 3 : syntaxe générale d’une boucle For Next
Voici un exemple de boucle For Next :
Dim i As Long
For i = 1 To 10
MsgBox "C'est le jour de la Marmotte"
Next i
Exemple 4 : utilisation d’une boucle For Next
Les mots-clés For et Next lui donnent son nom d’usage.
Dans ce type de boucle un compteur est utilisé pour faire varier d’une valeur de départ jusqu’à une valeur d’arrivée.
Dans notre exemple précédent, notre compteur est la variable i, de type numérique entier, qui va varier de 1 à 10, et va donc prendre successivement les valeurs 1, 2, 3, 4, 5, 6, 7, 8, 9 et 10. Une fois la valeur d’arrivée atteinte, on dit qu’on « sort de la boucle », et le programme poursuit l’exécution des lignes qui suivront après la boucle.
Ce qui est pratique avec ce type de boucles, c’est que vous pouvez utiliser la valeur de la variable i à l’intérieur de la boucle pour votre traitement.
Ainsi vous pouvez afficher les valeurs de 1 à 5 à l’utilisateur avec ces 3 lignes :
For i = 1 To 5
MsgBox i
Next i
Exemple 5 : autre utilisation d’une boucle For Next
Mais vous pouvez également utiliser cette variable pour lire les valeurs des cellules A1 à A5 par exemple, avec :
For i = 1 To 5
MsgBox Range("A" & i).Value
Next i
Exemple 6 : utilisation de la variable i dans une boucle For Next
Mais ce n’est pas tout, vous pouvez également indiquer avec quel pas votre programme avance pour aller de la valeur de début à la valeur d’arrivée. Par exemple, si vous souhaitez afficher les valeurs impaires de 1 à...
Boucle infinie et autres types d’erreurs liés aux boucles
Boucle infinie
Attention, il est fréquent que lorsque vous utilisez des boucles de type Do Loop ou While Wend, vous fassiez une mauvaise évaluation des critères d’entrée/sortie de boucle et vous tombiez dans une « boucle infinie », qui fera que votre application tournera indéfiniment (avec pour conséquence de geler à l’écran), ne vous laissant plus d’autre choix que de l’arrêter pour la redémarrer.
Voici un exemple de boucle infinie (la condition sera toujours fausse/False) :
Do Until False
Instructions
Loop
Exemple 19 : boucle infinie avec Do Until Loop
Pour arrêter le programme alors qu’il est en train de tourner, vous avez la possibilité d’utiliser simultanément les touches de votre clavier Ctrl et Pause. Il est également possible d’utiliser la touche Echap. La fenêtre suivante s’affichera :
Vous pouvez alors poursuivre le programme (Continuer), d’arrêter le programme (Fin), d’accéder au code (Débogage) ou encore d’accéder à l’aide en ligne de Microsoft.
Dépassement de capacité
Il peut arriver également que lorsque vous utilisez les boucles, la variable qui vous sert de compteur aille au-delà des limites...
Sortir d’une boucle
Bien que cela soit déconseillé lorsque vous débutez la programmation VBA avec les boucles, sachez qu’il est possible de sortir de façon anticipée d’une boucle, c’est-à-dire de sortir de la boucle avant d’atteindre la valeur maximum ou que la condition de sortie soit vraie. L’instruction de sortie anticipée comportera le mot-clé Exit (Sortir) associé au type de boucle de laquelle vous souhaitez sortir. Cette instruction vous permet de gagner du temps, mais elle rendra plus difficile le débogage ultérieur de votre code. Aussi il est recommandé de l’utiliser avec parcimonie.
Sortir d’une boucle For - Exit For
Pour sortir des boucles de type For Next ou de type For Each Next, la syntaxe de sortie anticipée se fera au moyen des mots-clés Exit For.
Par exemple, si vous parcourez les 50 premières lignes de la colonne A, pour vérifier que la valeur ENI est disponible :
Dim bENIEstPresent As Boolean 'sert à savoir si la valeur ENI est trouvée
bENIEstPresent = False 'on initialise notre variable
Dim i As Integer
For i = 1 To 50
If Range("A" & i).Value = "ENI" Then 'Si la cellule contient ENI alors
bENIEstPresent = True 'on bascule la variable à Vrai/True ...
Récapitulatif selon les cas
Bien que plusieurs types de boucle soient à votre disposition, toutes n’auront pas la même efficacité. Aussi afin que vous sachiez quelle structure de code utiliser selon le cas de figure, voici un tableau récapitulatif.
Cas où N le nombre de fois où les instructions seront exécutées est : |
||
Connu à l’avance |
Inconnu (de 0 à N fois) |
Inconnu (1 fois ou plus) |
Boucle For Next For i=1 To 10 ... Next i |
Boucle Do Until Loop Do Until Condition ... Loop |
Boucle Do Loop Until Do ... Loop Until Condition |
Boucle For Each Next |
Boucle Do While Loop Do While Condition ... Loop |
Boucle Do Loop While Do ... Loop While Condition |
L’expérience de programmation vous permettra par la suite de vous adapter selon votre aisance et votre compréhension de votre programme.
Exercices
Boucles For Next
À pas de 1
Créez une macro AfficherDe15a20.
Cette macro devra afficher les valeurs allant de 15 à 20.
Exécutez la macro AfficherDe15a20.
Vous devrez voir successivement les valeurs 15 à 20.
À pas de 2
Créez une macro AfficherDe10a20.
Cette macro devra afficher les valeurs allant de 10 à 20, en allant de 2 en 2.
Exécutez la macro AfficherDe10a20.
Vous devrez voir successivement les valeurs paires de 10 à 20.
À Pas décroissant
Créez une macro Afficher40a20PasDeMoins5.
Cette macro devra afficher les valeurs allant de 40 à 20, avec un pas décroissant de 5.
Exécutez la macro Afficher40a20PasDeMoins5.
Vous devrez voir successivement les valeurs 40, 35, 30, 25 et 20.
À pas paramétré
Écrivez une procédure BoucleAPasParametre, qui prendra en paramètre trois valeurs numériques entières, nommées respectivement BorneA, BorneB et Pas.
Cette procédure devra afficher les valeurs comprises entre BorneA et BorneB selon le pas Pas.
Créez une macro AppelBoucleAPasParametre.
La macro fera appel à la procédure BoucleAPasParametre à 3 reprises. Elle lui passera successivement les valeurs 2, 7 et 1, puis 5, 10 et 2 et enfin 5, 10 et-2.
Exécutez la macro AppelBoucleAPasParametre.
Vous devrez voir successivement...