4
Les Boucles VBA Quand utiliser une boucle? Dès qu'une ou plusieurs instructions doivent (ou peuvent) être répétées, on met ces instructions dans une boucle. La boucle est le seul moyen de recommencer des instructions car quand VBA arrivera au point de fin de la boucle, il remonte à son point de départ. Les 3 types de Boucles Boucle For Each Pour faire chaque élément d'une collection Boucle For On détermine le nombre de tour et on dispose d'une variable indice Boucle Do Loop On sort de la boucle par rapport à une condition Boucle For Syntaxe: For <variable> = <valeurDepart> To <valeurFin> [Step <valeurPas> ] ... Next <variable> Exemple: Dim i As Integer For i = 1 To 5 Step 2 ... Next i La boucle For a comme particularité d'exécuter des affectations implicites: <variable> = <valeurDepart> au premier tour (initialisation à la valeur de départ, i = 1) <variable> = <variable> + <valeurPas> aux tours suivants (incrémentation de la variable, le pas par défaut étant égal à 1, ici i sera augmenté de 2 à chaque tour) A chaque exécution du For, VBA regarde si la variable est strictement supérieure à la valeurFin (ici est-ce que i>5) et sort de la boucle dans ce cas. Conseil: Pour éviter les erreurs (très fréquentes), prenez l'habitude de ne pas vous servir de la variable en dehors de sa boucle (règle: je n'utilise le i que après la ligne du For et avant la ligne du Next). Faites comme si la variable était détruite après le Next, et qu'elle n'avait été créée qu'après le For. Notez que rien n'oblige à se servir de la variable i dans la boucle. La boucle For sert avant tout à déterminer le nombre de tour à l'avance, et l'utilisation de la variable dans les instructions de la boucle est juste une possibilité supplémentaire. Attention: si on veut faire un compte à rebours, le pas doit être négatif et VBA sortira alors quand la variable sera strictement inférieure à la valeur de fin. For i=10 to 1 Step -1 Utilisation du Exit For Si il y a des cas où la boucle ne doit pas faire le nombre de tour indiqué dans la boucle For, il suffit de rajouter un Exit For dans un branchement pour ajouter une condition de sortie. Par exemple, faire 10 tours à priori, mais stopper la boucle si une valeur calculée est négative à un tour. Les Boucles VBA page 1/4 www.infodauphine.com n°1 du Soutien en Info à Dauphine

Les Boucles VBA - infodauphine.cominfodauphine.com/deux/vba/fiches/boucles.pdf · Les Boucles VBA . Quand utiliser une boucle? Dès qu'une ou plusieurs instructions doivent (ou peuvent)

Embed Size (px)

Citation preview

Les Boucles VBA

Quand utiliser une boucle? Dès qu'une ou plusieurs instructions doivent (ou peuvent) être répétées, on met ces instructions dans une boucle. La boucle est le seul moyen de recommencer des instructions car quand VBA arrivera au point de fin de la boucle, il remonte à son point de départ.

Les 3 types de Boucles Boucle For Each Pour faire chaque élément d'une collection Boucle For On détermine le nombre de tour et on dispose d'une variable indice Boucle Do Loop On sort de la boucle par rapport à une condition

Boucle For Syntaxe: For <variable> = <valeurDepart> To <valeurFin> [Step <valeurPas> ] ... Next <variable> Exemple: Dim i As Integer For i = 1 To 5 Step 2 ... Next i La boucle For a comme particularité d'exécuter des affectations implicites: <variable> = <valeurDepart> au premier tour

(initialisation à la valeur de départ, i = 1) <variable> = <variable> + <valeurPas> aux tours suivants

(incrémentation de la variable, le pas par défaut étant égal à 1, ici i sera augmenté de 2 à chaque tour) A chaque exécution du For, VBA regarde si la variable est strictement supérieure à la valeurFin (ici est-ce que i>5) et sort de la boucle dans ce cas.

Conseil: Pour éviter les erreurs (très fréquentes), prenez l'habitude de ne pas vous servir de la variable en dehors de sa boucle (règle: je n'utilise le i que après la ligne du For et avant la ligne du Next). Faites comme si la variable était détruite après le Next, et qu'elle n'avait été créée qu'après le For. Notez que rien n'oblige à se servir de la variable i dans la boucle. La boucle For sert avant tout à déterminer le nombre de tour à l'avance, et l'utilisation de la variable dans les instructions de la boucle est juste une possibilité supplémentaire. Attention: si on veut faire un compte à rebours, le pas doit être négatif et VBA sortira alors quand la variable sera strictement inférieure à la valeur de fin. For i=10 to 1 Step -1 Utilisation du Exit For Si il y a des cas où la boucle ne doit pas faire le nombre de tour indiqué dans la boucle For, il suffit de rajouter un Exit For dans un branchement pour ajouter une condition de sortie. Par exemple, faire 10 tours à priori, mais stopper la boucle si une valeur calculée est négative à un tour.

Les Boucles VBA page 1/4 www.infodauphine.com n°1 du Soutien en Info à Dauphine

boucle for each syntaxe: For each <variable> In <collection> ... Next <variable> Exemple: Dim ws As Worksheet For Each ws in Worksheets ... Next ws Le schéma de cette boucle est à peu près identique à celui de la boucle For, avec ces différences: A chaque tour, VBA affecte un des élément de la collection à la variable. La variable sera donc une variable objet (dans l'exemple, ws stockera la référence de la 1ère feuille du

classeur actif au 1èr tour, celle de la 2e feuille au 2e tour, etc.) On pourrait ici utiliser dans la boucle ws.Name pour avoir le nom de la feuille à chaque tour.

VBA sort de la boucle quand tous les éléments de la collection ont été affectés (il fera donc un nombre de tour égale à la propriété Count de la collection, c'est-à-dire son nombre d'éléments)

Comme pour la boucle For, un Exit For dans un branchement permet de rajouter une condition de sortie si il existe des cas où l'on ne veut pas faire la collection jusqu'au bout (par exemple, faire toutes les cellules d'une plage, mais stopper la boucle si une des cellule est vide)

Boucle Do Loop Avec la boucle Do, on utilise While soit en début de boucle, soit en fin de boucle, et VBA sort de la boucle quand la condition du While est égale à false. Il est aussi possible de placer la condition de sortie au milieu de la boucle, en supprimant le While et en plaçant un Exit Do dans un branchement à l'intérieur de la boucle. Le placement de la condition de sortie aura une influence sur les instructions de la boucles qui seront forcément faites (même si on sort de la boucle dès le début) et celles qui risquent de ne pas du tout être exécutées. Sortie en début de boucle Sortie en fin de boucle Sortie en milieu de boucle Au lieu de While, on peut utiliser Until qui est l'équivalent de While Not Do While n<>0 Do Until n=0 Do While Not n=0 Conseil: Placer le Do au dessus des instructions que l'on veut recommencer, et le Loop en dessous de celles-ci. Puis réfléchir à la place de la condition de sortie (While ou Exit Do) suivant les instructions qui doivent être faites au moins 1 fois et à quel moment je veux sortir de la boucle.

Les Boucles VBA page 2/4 www.infodauphine.com n°1 du Soutien en Info à Dauphine

Choisir la boucle à utiliser Les questions à se poser, dans l'ordre, sont:

1. Doit-on parcourir une collection? Boucle For Each

2. Peut-on exprimer le nombre de tour (combien de fois on veut le faire)? Boucle For

3. Si la réponse est non à ces 2 questions boucle Do Loop En se demandant: "Quelles instructions de la boucle devront être faites au moins 1 fois (celles qui doivent forcément être exécutées)" pour choisir l'emplacement de la condition de sortie:

Aucune instruction de la boucle ne doit forcément être exécutée. La boucle fera peut-être 0 tour: Do While ? [instructions] Loop

La totalité des instructions de la boucle doivent forcément être exécutées. La boucle doit faire au moins 1 tour entier: Do [instructions] Loop While ?

Une partie seulement des instructions de la boucle doivent être forcément exécutée. On a besoin de sortir de la boucle en milieu de boucle. Do [instructions 1 fois minimum] If ? Then Exit Do End If [instructions peut-être 0 fois] Loop

Précisions Il est parfois pratique d'utiliser une boucle For pour parcourir une collection quand on a besoin de la variable

indice (par exemple pour pouvoir travailler sur les cellules de 2 colonnes avec Cells(i,1) et Cells(i,2) )

Si on sait le nombre de tours mais qu'il y a un cas où on va s'arrêter avant la fin, il y a 2 possibilités: o Boucle For avec un branchement Exit For o Boucle Do Loop où je crée ma propre variable indice (initialisée avant la boucle, incrémentée dans la

boucle) et je me sers de la variable indice et du cas d'arrêt de la boucle dans le While Exemple: S'arrêter sur la première cellule de la colonne 1 qui est paire parmi les 10 1ères cellules.

For i=1 To 10 If Cells(i,1).Value Mod 2 = 0 Then Exit For End If Next i

i=1 Do While Cells(i,1).Value Mod 2 <> 0 And i<=10 i = i + 1 Loop

Personnellement, contrairement à beaucoup de profs de Dauphine, je privilégie la version avec For (si je sais combien de fois je vais le faire: boucle For), et mon expérience m'a prouvé qu'elle était bien mieux maîtrisée par les étudiants car plus intuitive. A noter que si l'on voulait vérifier qu'on avait trouvé une valeur paire, il est conseillé d'utiliser une variable drapeau.

Si vous essayez de faire une boucle Do While et que vous n'arrivez pas exprimer la condition du While, supprimer le While. C'est probablement qu'il faut le mettre en fin de boucle ou le remplacer par un Exit Do dans la boucle.

Les Boucles VBA page 3/4 www.infodauphine.com n°1 du Soutien en Info à Dauphine

Boucles et Variables Les variables vont avoir un rôle particulier avec les boucles car elles vont permettre de faire le lien entre les tours. On peut résumer leur rôle en 4 règles:

La valeur que je donne à la variable avant la boucle sera celle qu'elle aura au 1er tour. La valeur que je lui donne à un tour sera celle qu'elle aura au tour suivant. La valeur que la variable possède à un tour (avant d'être affectée, y compris à droite de

l'affectation) est celle qu'elle a prise au tour précédent. La valeur que la variable possède après la boucle est celle qu'on lui a donnée au dernier tour.

Boucles imbriquées On utilise une boucle dans une boucle quand il y a quelque chose que l'on veut faire plusieurs fois à chaque tour d'une boucle (exemple: je dois parcourir toutes les cellules 10 fois de suite, ou je dois faire chaque cellules de chaque feuilles)

[instructions faites une seule fois] Boucle1 [instructions faites pour chaque tour de boucle1 (exemple 10 fois)] Boucle2 [instructions faite pour chaque tour de boucle2 à chaque tour de boucle1 (ex: pour chaque cellules, puis à nouveau pour chaque cellules, etc. 10 fois] End Boucle2 [instructions faites pour chaque tour de boucle1 après avoir fait boucle2 (ex: après avoir parcouru les cellules] End Boucle1 [instructions faites une seule fois]

Il est fortement conseillé de toujours faire un schéma de ses boucles sur son brouillon quand on travaille avec des boucles imbriquées (voir les séances d'exercices).

Erreurs fréquentes Vous oubliez de raisonner en terme de tour. Ce que j'écris dans ma boucle va être exécuté à

chaque tour et il faut que je raisonne par rapport à ça. Notamment, les variables vont changées à chaque tour, il ne faut pas raisonner que sur le premier tour.

Vérifiez toujours que vous avez mis dans votre boucle ce qui doit être répété, et à l'extérieur de la boucle ce qui ne sera fait qu'une seule fois.

Ne faites pas une boucle imbriquée quand vous voulez juste compter le nombre de tour d'une boucle Do Loop. Ajouter une variable compteur ou indice à la place.

Ne confondez pas Do While et If. Do While veut dire une boucle, il y aura une répétition. If veut dire 0 ou 1 fois.

VBA ne comprend jamais vos intentions. Ce n'est pas une logique que vous donnez à VBA mais un itinéraire. A vous de transformer votre logique en itinéraire (ex: + + + + un seul + dans une boucle)

Ne demandez pas de VBA à faire des hypothèses. Par exemple, si on veut calculer un Sn par rapport à une limite (ex: quand Sn - Sn-1 < 10-3), je ne peux pas faire For i=1 To n car n'est pas une valeur définie à l'avance.

Attention aux initialisations. D'abord, ne les oubliez pas. A part les paramètres, chaque variable doit d'abord avoir été affectée avant d'être utilisée. Ensuite, avec les boucles imbriquées, ne confondez pas ce qui doit être initialisé une fois (avant la 1ère boucle) et ce qui doit être réinitialisé à chaque tour de la 1ère boucle (entre les 2 boucles).

Les Boucles VBA page 4/4 www.infodauphine.com n°1 du Soutien en Info à Dauphine