Vous êtes sur la page 1sur 11

1.

PRÉSENTATION
Ces répétitions sont rendues possibles grâce à la mise en place de boucles, et la plus courante
d’entre elles est la boucle for…next (« tant que… ») :

For i = 1 To 10
' Action répétée
Next i

Une boucle For s’utilise avec l’aide d’une variable à laquelle nous donnons une valeur minimale (ici
la variable i a pour valeur 1).

Ensuite nous spécifions que nous souhaitons exécuter une portion de code tant que la valeur de i est
inférieure ou égale à 10 (To 10).

Et enfin après avoir inséré le code que nous voulons répéter, nous fermons notre boucle grâce
au mot clé Next.

De cette manière, la valeur de la variable i est incrémentée d’une unité (il s’agit de l’incrémentation
par défaut, que nous pourrons modifier grâce à la propriété Step, que nous verrons un peu plus
tard), puis si la nouvelle valeur est toujours comprise dans la plage de répétition, alors le
déroulement du code reprend directement au début de la boucle.

Dans le cas contraire, alors le déroulement continue sur les lignes situées en dessous du Next.

2. EXEMPLE
Imaginons par exemple que nous souhaitions afficher cinq fois une notification à l’utilisateur.

En VBA, nous pourrions saisir cinq fois la même ligne :

Sub exempleBoucleForNext()
MsgBox "Notification 1"
MsgBox "Notification 2"
MsgBox "Notification 3"
MsgBox "Notification 4"
MsgBox "Notification 5"
End Sub

Evidemment, cette manière de procéder n’a rien d’optimisée. En effet, si ici nous ne faisons que
répéter cinq fois une opération, nous pourrions facilement imaginer un exemple dans lequel nous le
ferions plusieurs centaines, ou même milliers de fois.

Nous allons simplement pouvoir utiliser une boucle For !

Sub exempleBoucleForNext()
Dim i As Integer
For i = 1 To 5
MsgBox "Notification 1"
Next i
End Sub

Comme vous pouvez le voir, nous commençons ici par créer une variable i de type Integer que nous
utiliserons ensuite pour faire fonctionner la boucle (je vous conseille en effet de toujours déclarer
vos variables).

Puis nous créons la boucle en paramétrant une valeur de 1 pour la variable i, et étant donné que
nous souhaitons afficher le message à cinq reprises, nous définissons une valeur maximale de 5 (For i
= 1 To 5).

Et nous terminons la boucle par Next i, ce qui permet de retourner sur la première ligne.

Notez que nous pourrions saisir simplement Next, sans préciser d’incrémenter la variable i, celle-ci
étant implicite.

Alors évidemment, ici nous affichons EXACTEMENT le même message à cinq reprises : « Notification
1 ».

Mais tout l’intérêt d’une boucle For réside justement dans le fait que nous pouvons très simplement
exploiter la variable incrémentée dans notre code. Pour cela, il suffit concaténer la chaîne affichée
avec l’esperluette (« & ») :

Sub exempleBoucleForNext()
Dim i As Integer
For i = 1 To 5
MsgBox "Notification " & i
Next
End Sub
3. MODIFIER LE PAS
Dans l’exemple que nous venons de voir, je vous ai expliqué que par défaut lorsque la boucle se
termine, la valeur de la variable utilisé s’incrémente d’une unité.

Parfois nous allons souhaiter modifier ce comportement afin par exemple de faire en sorte que celle-
ci augmente de dix unités.

Pour cela, nous avons à disposition le paramètre Step :

Sub exempleBoucleForNext()
Dim i As Integer
For i = 10 To 50 Step 10
MsgBox "Notification " & i
Next
End Sub

La notification a ici pour valeur 10, puis 20, … jusqu’à 50.

4. INVERSER LA BOUCLE
Pour inverser la boucle, il suffit simplement d’initialiser la boucle avec une valeur de début supérieur
à la valeur finale et de spécifier un Step négatif :
Sub exempleBoucleForNext()
Dim i As Integer
For i = 5 To 1 Step -1
MsgBox "Notification " & i
Next
End Sub

5. IMBRIQUER DES BOUCLES DANS DES BOUCLES


Il est tout à fait possible d’imbriquer des boucles dans d’autres boucles, dans ce cas, il faut être
vigilant dans l’utilisation de la variable qui sert de compteur pour ne pas créer de conflit entre les
différents niveaux de boucles.

Voici un exemple de boucle for imbriquée dans une seconde :

Sub exempleBoucleForImbriquées()
Dim x As Integer, y As Integer

For x = 1 To 9
For y = 1 To 9
Feuil16.Cells(y + 7, x) = x * y
Next
Next
End Sub

Ici, nous affichons le résultat des tables de multiplications des nombres 1 à 9 dans un tableau :
6. QUITTER UNE BOUCLE AVANT LA FIN !
Il existe deux méthodes pour quitter une boucle avant que la variable de test n’atteigne le résultat
maximal attendu :

Soit modifier directement la valeur de la variable (par exemple en saisissant une ligne x = 1000), mais
dans ce cas, la boucle ira quand jusque au bout de son exécution actuelle et le code n’en sortira que
lorsqu’il arrivera au niveau de la ligne contenant le mot-clé Next :

Sub exempleBoucleForImbriquées()
Dim x As Integer, y As Integer

For x = 1 To 9
For y = 1 To 9
If x * y > 50 Then x = 1000
Feuil16.Cells(y + 7, x) = x * y
Next
Next
End Sub
Ici la cellule ALL16 est modifiée pour prendre la valeur de 9000 (1000 * 9) !

Soit utiliser une instruction Exit For et dans ce cas, le code sort immédiatement de la boucle sans en
exécuter la suite :

Sub exempleBoucleForImbriquées()

Dim x As Integer, y As Integer

For x = 1 To 9
For y = 1 To 9
If x * y > 50 Then Exit For
Feuil16.Cells(y + 7, x) = x * y
Next
Next
End Sub
Vous noterez au passage qu’ici l’instruction Exit For a été saisie dans la boucle imbriquée, c’est donc
celle-ci qui est quittée, mais relancée juste après par la boucle principale.

7. ATTENTION AU PIÈGE !
Attention en effet, car comme nous venons de le voir juste avant, il est possible de modifier
simplement la valeur de la variable directement dans le code de la boucle.

Il faut alors prendre toutes les précautions afin de ne pas générer des bugs qui auraient pour
conséquence de rendre nos macros simplement inutilisables !

Sub exempleBoucleForNext()
Dim i As Integer
For i = 5 To 1 Step -1
MsgBox "Notification " & i
i = 3
Next
End Sub

Ici nous rétablissons systématiquement la valeur de i à 3, notre code ne pourra donc jamais arriver à
son terme !

8. LA VARIANTE FOR … EACH POUR BOUCLER SUR UNE COLLECTION

8.1. Découverte de For … Each

Maintenant que nous avons découvert comment réaliser une simple boucle qui se répète tant
qu’une condition est remplie, je vais vous montrer une variante de la boucle For, qui va nous
permettre de passer en revue chacun des objets appartenant à une collection.

Nous avons déjà abordé la notion d’objet dans un chapitre précédent de la


formation sur l’apprentissage de VBA. Nous avions alors défini un objet comme étant « en quelque
sorte une super variable qui est elle-même composée de propriétés (c’est-à-dire des variables
propres à cet objet) et méthodes (c’est-à-dire des procédures qui permettent d’agir sur cet objet). ».
Nous avions également vu qu’une collection permet de regrouper un ensemble d’objet d’un même
type.

Bien évidemment, si vous souhaitez en savoir plus sur ces notions que nous ne faisons ici que
survoler, je vous invite vivement à consulter cet article si vous ne l’avez pas déjà fait.

L’exemple le plus parlant de collection d’objet que nous manipulons très souvent sans même nous
en rendre compte est la plage de cellules (Range) qui est composée d’un ensemble d’objets qui
correspond aux cellules.

Grâce à l’instruction For … Each, nous allons ainsi pouvoir passer en revue chacune des cellules
appartenant à une plage pour effectuer un traitement sur celles-ci.
8.2. Lire les cellules sélectionnées

Prenons l’exemple de la plage des cellules retournées par la sélection :

Sub lireCellulesSelectionnées()
Dim cellule As Range
For Each cellule In Selection
MsgBox cellule
Next
End Sub

Ici, nous commençons par créer une variable cellule typée en tant que Range qui va ensuite nous
servir à passer en revue chacune des cellules sélectionnées.

Ensuite nous utilisons le For Each, que nous pourrions traduire par : « Pour toutes les cellules
contenues dans la sélection » (« For Each cellule in Selection »).

Cela permet deux choses :

 Tout d’abord créer une boucle qui va se répéter autant de fois qu’il y a de cellules dans la
sélection,
 Affecter chacune des cellules à tour de rôle à la variable cellule

Enfin, il ne reste plus qu’à effectuer un traitement sur la cellule en cours d’affectation : ici nous nous
contentons d’en afficher la valeur dans une boîte de notification (via MsgBox).

Une autre collection de VBA forte utile est la collection Worksheets, qui contient l’ensemble des
objets Worksheet (c’est-à-dire les feuilles de calculs) du classeur. Cela peut par exemple permettre
de créer un sommaire automatique.

8.3. Créer un sommaire automatique

Cet exemple est inspiré de l’article « Comment créer un sommaire automatique et généré en 1 clic
sur Excel » que vous retrouverez en cliquant ici :

Sub créerSommaire()
Dim cellule As Range ' 1
Set cellule = Feuil16.[a21] ' 2

Dim feuille As Worksheet ' 3


For Each feuille In Worksheets ' 4
ActiveSheet.Hyperlinks.Add anchor:=cellule, Address:="",
SubAddress:="'" & feuille.Name & "'!A1", TextToDisplay:=feuille.Name ' 5
Set cellule = cellule.Offset(1, 0) ' 6
Next ' 7
End Sub

Pour faire simple :

 1 : Nous commençons par créer une variable de type Range que nous nommons cellule, et
qui va nous permettre de nous déplacer dans la feuille de calcul actuelle afin de venir y saisir
les différents liens du sommaire.
 2 : Nous affectons la cellule A21 de la feuille 16 à cette cellule,
 3 : Puis nous créons une seconde variable qui est cette fois-ci typée en tant que Worksheet,
c’est-à-dire une feuille de calcul du classeur,
 4 : Cette variable nous permet de passer en revue toutes les feuilles contenues dans le
classeur,
 5 : Nous créons le lien hypertexte qui permet d’atterrir sur la cellule A1 de la feuille en cours
de revue et dont le noms est retourné par la propriété feuille.Name directement sur la
cellule en cours de traitement (pour plus de détail sur la création de liens hypertextes en
VBA, je vous invite à consulter le tutoriel « Comment créer un sommaire automatique et
généré en 1 clic sur Excel » si ce n’est pas déjà fait)
 6 : Cela étant fait, nous passons sur la cellule située juste en dessous pour le prochain
passage de la boucle,
 7 : Et enfin, nous clôturons la boucle avec le mot clé habituel Next

Et voilà, comme vous pouvons le voir par cet exemple, il est très simple de créer un sommaire en
quelques lignes de codes seulement !
8.4. Lire les éléments d’un tableau

Enfin sachez que l’instruction For … Each ne se limite à énumérer les différents éléments contenus
dans une bibliothèque, en effet celle-ci permet également de passer en revue les différents
éléments d’un tableau de type Array.

Il s’agit d’une notion que nous n’avons pas encore abordé jusqu’alors. Sachez simplement
qu’un Array est une variable qui a la particularité de contenir plusieurs valeurs.

Dans l’exemple que nous allons voir juste après, nous créons une variable listeFruits, laquelle
contient comme son nom l’indique une suite de nom de fruits :

Sub lireUnTableau()
Dim listeFruits As Variant
listeFruits = Array("Pomme", "Banane", "Orange")

Dim fruit As Variant


For Each fruit In listeFruits
MsgBox fruit
Next
End Sub
L’utilisation de For … Each nous permets de récupérer chacune des valeurs de cette liste au sein
d’une variable que nous avons instanciée juste avant sous le nom de fruit.

Il nous suffit ensuite d’afficher cette valeur à l’utilisateur via une MsgBox.

Note : pour pouvoir utiliser correctement l’énumération des éléments contenus dans un Array, les
variables sont déclarées en tant que Variant

Ici, nous avons définis les noms à affecter à notre listeFruits directement en utilisant la fonction VBA
Array().

Nous pourrions également créer de toute pièce un Array en utilisant par exemple la fonction
Split() directement en tant que paramètre que For … Each.

Dans ce dernier exemple, nous énumérons chaque mot contenu dans une phrase :

Sub motParMot()
Dim phrase As String
phrase = "Bonjour et bienvenue sur excelformation.fr"

Dim mot As Variant


For Each mot In Split(phrase, " ")
MsgBox mot
Next
End Sub

Vous aimerez peut-être aussi