Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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.
Sub exempleBoucleForNext()
Dim i As Integer
For i = 10 To 50 Step 10
MsgBox "Notification " & i
Next
End Sub
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
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()
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 !
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.
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
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 »).
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.
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
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")
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"