En programmation, il est souvent nécessaire d’exécuter une portion de code plusieurs fois de suite. La répétition des instructions peut se produire un certain nombre de fois connu à l’avance ou tant qu’une condition est vérifiée. Cet article passe en revue les principales instructions de bouclage du langage VBA.
La boucle For … Next
Lorsque le nombre de répétitions est connu à l’avance, le plus simple est d’utiliser une boucle For … Next. Voici sa syntaxe :
For compteur = début To Fin Step pas ' Une ou plusieurs instructions Next compteur
Où Compteur est une variable qui commence à début et finit à fin en progressant de pas à chaque itération de la boucle.
Remarque
Si la partie Step pas n’est pas précisée, la variable compteur va de début à fin par pas de 1.
Quelques exemples pour mieux comprendre.
Supposons que vous vouliez remplir les cellules A1 à H1 avec les valeurs 1 à 8. Voici le code à utiliser :
Dim i As Integer For i = 1 to 8 Cells(1, i) = i Next i
Ici, nous utilisons la méthode Cells() en précisant le numéro de ligne et le numéro de colonne. Voici le résultat :
Supposons maintenant que vous vouliez remplir les cellules C3 à C12 avec les valeurs « a » à « j« . Voici le code à utiliser :
Dim i As Integer For i = 3 To 12 Cells(i, 3) = Chr(97 + i - 3) Next i
Ici, nous utilisons la méthode Cells() en précisant le numéro de ligne (i, qui va de 3 à 12) et le numéro de colonne (fixe et égal à 3). La méthode Chr() convertit le code ASCII passé en argument en un caractère. Pour arriver au résultat souhaité, le code ASCII de la lettre « a » a été cherché dans un tableau de codes ASCII. Par exemple sur la page http://www.table-ascii.com/ :
Etant donné que i varie de 3 à 12, la formule à utiliser est 97 + i – 3. L’argument de la fonction Chr() va donc de 97 (pour i = 3) à 106 (pour i = 12).
Voici le résultat :
Supposons maintenant que vous vouliez remplir le bloc de cellules A3-C9 comme ceci :
Comment feriez-vous ?
Observez la progression numérique dans les cellules. Les valeurs vont de 1 à 21, et on change de ligne toutes les trois cellules.
Pour faire simple, nous allons imbriquer deux boucles : une pour les lignes et une pour les colonnes. Voici le code :
Dim i, j As Integer For i = 0 To 6 For j = 1 To 3 Cells(i + 3, j) = j + i * 3 Next j Next i
La boucle la plus extérieure s’intéresse aux lignes et la boucle la plus intérieure aux colonnes. Les index des boucles ont été choisis pour simplifier au maximum la formule.
Lors de la première exécution de la boucle extérieure, i vaut 0 et j va de 1 à 3. La formule :
Cells(i + 3, j) = j + i * 3
Cible donc les cellules A3, B3 puis C3. Et la valeur affectée à ces cellules est 1, 2 et 3. Si vous ne voyez pas ce que je veux dire, simulez le fonctionnement de la boucle interne en remplaçant j par 1, 2 puis 3 et voyez le résultat. Vous obtenez :
- Pour i=0 et j=1 : Cells(3,1) = 1, soit A3 = 1
- Pour i=0 et j=2 : Cells(3,2) = 2, soit B3 = 2
- Pour i=0 et j=3 : Cells(3,3) = 3, soit C3 = 3
Lorsque la boucle interne a fini de s’exécuter, la boucle externe incrémente la valeur de i, qui passe de 0 à 1. La formule :
Cells(i + 3, j) = j + i * 3
Cible alors les cellules A4, B4 et C4 et leur affecte (respectivement) les valeurs 4, 5 et 6.
La progression de i et de j se poursuit jusqu’à ce que ces index dépassent les valeurs maximales fixées à 6 et 3. Les deux boucles prennent alors fin et la plage A3-C9 est entièrement remplie.
Un dernier exemple pour illustrer l’utilisation d’un pas de progression. Supposons que vous vouliez obtenir le résultat suivant :
Plusieurs approches sont possibles, mais une des plus simples consiste certainement à utiliser un pas de progression négatif dans la boucle :
Dim i As Integer For i = 12 To 2 Step -2 Cells(1, i / 2) = i Next i
Ici, la variable i passe de 12 à 2 par pas de -2. Elle vaut donc successivement 12, 10, 8, 6, 4, puis 2.
La formule :
Cells(1, i / 2) = i
Cible les cellules situées en ligne 1 et en colonne 6 (12/2), 5 (10/2), 4 (8/2), 3 (6/2), 2 (4/2) puis 1 (2/2). La valeur de i est affectée à ces cellules, ce qui donne bien le résultat attendu.
Dans certaines boucles, on ne sait pas à l’avance combien de fois les instructions seront exécutées. Dans ce cas, la boucle For … Next n’est pas appropriée. Vous utiliserez plutôt une boucle While … Wend, Do While … Loop, Do … Loop While ou Do Until … Loop.
La boucle While … Wend
La boucle While … Wend est exécutée tant qu’une condition est vérifiée. Voici sa syntaxe :
While condition ' Une ou plusieurs instructions Wend
Par exemple, pour remplir les cellules A1 à H1 avec les chiffres 1 à 8 avec une boucle While … Wend, comme dans la copie d’écran suivante :
Vous pourriez utiliser ces instructions :
Dim i As Integer i = 1 While i < 9 Cells(1, i) = i i = i + 1 Wend
Ces instructions peuvent sembler plus complexes que celles utilisées dans la boucle For … Next équivalente. Examinons-les pas à pas.
- La variable i est déclarée en tant qu’Integer et initialisée à 1.
- La boucle se poursuit tant que i est inférieur à 9.
- Les cellules de la ligne 1 et de la colonne 1 à 8 sont alors ciblées avec la méthode Cells() et on leur affecte la valeur de la variable i, c’est-à-dire 1 à 8.
- La variable i est incrémentée d’un à chaque passage dans la boucle avec l’instruction i = i + 1.
Vous voyez, il n’y a rien de bien compliqué.
La boucle Do While … Loop
Nous allons maintenant utiliser une boucle Do While … Loop pour obtenir le même résultat que dans la boucle While … Wend précédente. Voici le code utilisé :
Dim i As Integer i = 1 Do While i < 9 Cells(1, i) = i i = i + 1 Loop
Le code est strictement équivalent. Il n’y a que l’écriture qui change.
La boucle Do … Loop While
Voyons maintenant comment utiliser une boucle Do … Loop While pour obtenir le même résultat. Voici le code utilisé :
Dim i As Integer i = 1 Do Cells(1, i) = i i = i + 1 Loop While i < 9
Ici, la condition de fin de boucle est testée en fin de boucle. Quelle que soit la valeur de i, la boucle s’exécute donc au moins une fois. Mis à part cette légère différence, le code est très semblable à celui utilisé dans les boucles précédentes.
La boucle Do Until … Loop
Voyons enfin comment utiliser une boucle Do Until … Loop pour arrive au même résultat. Voici le code utilisé :
Dim i As Integer i = 1 Do Until i > 8 Cells(1, i) = i i = i + 1 Loop
Ici, le test de fin de boucle est effectué en début de boucle. La boucle prend fin quand i est supérieur à 8 (et non tant que i est inférieur à 9 comme dans les autres boucles). Mis à part ce détail, le code est similaire à celui utilisé dans les autres boucles.
Maintenant que vous connaissez les différentes boucles utilisables en VBA, vous devrez trouver celle qui est la plus appropriée à chaque cas que vous devrez traiter…
Quitter une boucle prématurément
Cet article ne serait pas complet si nous ne parlions pas des sorties prématurées des boucles. Rien de bien sorcier rassurez-vous.
Supposons que lorsqu’une condition est vérifiée, vous vouliez terminer la boucle. Dans ce cas, vous utiliserez une des instructions suivantes :
Boucle | Instruction pour sortir de la boucle |
For … Next | Exit For |
While … Wend | Exit While |
Do While … Loop | Exit Do |
Do … Loop While | Exit Do |
Do Until … Loop | Exit Do |
bonjour
je veux faire un boucle for …next pour des nombre qui donne par moi même à la début
exemple
for i=1,i=3,i=8
……..
next i