Les boucles While et For
Le sommaire :
Une boucle permet de
réitérer l’exécution d’un traitement selon une condition.
Une boucle est également
appelée une répétitive.
Il existe 3 types de boucles,
la boucle While, la boucle Do et la boucle For.
Tant que la boucle ne
remplit pas une condition attendue, le traitement qu’elle contient est exécuté.
Chaque exécution du
traitement contenu dans la boucle est appelée une itération.
Vous devez être très
prudent lorsque vous partez dans la construction d’une boucle.
Vous apprendrez à
découvrir le piège de la boucle !
En effet, Puisqu’il faut
qu’une condition soit remplie pour que la boucle soit interrompue, vous
comprendrez que dans le cas d’une boucle pour laquelle la condition ne serait
jamais atteinte, serait une boucle éternelle qui risquerait de vous embêter au
point peut-être, de planter tout simplement votre machine…
Alors, avant d’exécuter
votre boucle, je vous conseille vivement de relire attentivement votre code
afin d’être sûr qu’il n’y ait aucune erreur de logique.
Cette boucle permet
l’exécution d’un traitement tant qu’une condition est vraie.
La syntaxe :
While condition
Traitement
Fin de la boucle While
Tant que la condition est
vraie, traitement est exécuté, la condition est revérifiée ETC.
Voici un exemple de code.
Lisez attentivement le
code afin de comprendre l’objectif de la boucle.
C’est simple, une boîte de
message apparaît à l’écran et contient la question suivante :
« Êtes-vous d’accord
avec moi ? »
L’utilisateur a le choix de répondre entre « Oui »
et « Non ».
S’il répond
« Non », la boîte de message est réaffichée à l’écran car la
condition de la boucle « tant que » est remplie.
En clair, l’utilisateur
n’a qu’une possibilité pour sortir de cette boîte de message, c’est de répondre
« Oui ».
' Déclaration de la
variable Résultat
' pour contenir la réponse
de la boîte de message
Dim Résultat As Integer
'Initialisation de
Résultat à la valeur VBNo
Résultat = vbNo
'Tant que Résultat est
égal à Non
While Résultat = vbNo
' Ouverture de la boîte de message avec la
question
Résultat = MsgBox("Bonjour",
vbYesNo, "êtes-vous d'accord avec moi ?")
Wend
' L'utilisateur à répondu
Oui
' Affichage d'un message
de satisfaction
Résultat = MsgBox("Aure
voir", vbOKOnly, "Merci d'avoir approuvé ma question...")
La boucle For permet
d’exécuter un traitement dont le nombre d’itération est déterminé par un
compteur qui sera incrémenté à chaque
itération.
Voici la syntaxe en
français :
Pour Compteur allant de 1
à 10 par pas de 1,
Exécute ce traitement.
Incrémente le compteur.
La véritable
syntaxe :
For Compteur = Val1 To Val2 Step Val3
Traitement
Next Compteur
Compteur est une variable
de type entier.
Val1, est la valeur
initiale que devra prendre Compteur.
Val2, est la dernière
valeur que devra prendre Compteur.
Val3, est la valeur de
l’incrémentation de Compteur, si ce paramètre est omis, la valeur par défaut
est 1.
Traitement, est le code
qui sera exécuté à chaque itération.
Next Compteur, est la
ligne d’instruction qui déclenche l’incrémentation de compteur.
Remarque, Compteur doit
être un entier mais vous lui donner le nom de votre choix.
Voici un exemple qui va
provoquer la concaténation de la chaîne de caractères « Bonjour » à
la variable MaChaine.
La concaténation sera
exécutée 5 fois.
' Déclaration de la
variable Compteur
Dim Compteur As Integer
' Déclaration de la
variable Chaine
Dim MaChaine As String
' Déclaration de la
variable Résultat pour la réponse de la boîte de message
Dim Résultat As Integer
' Pour Compteur prenant
les valeurs de 1 à 5 et par pas de de 1
For Compteur = 1 To 5 Step
1
' Concaténation de la chaîne Bonjour à la
variable MaChaine
MaChaine = MaChaine + "Bonjour"
Next Compteur
' Affichage de MaChaine
dans une boîte de message
Résultat =
MsgBox("Résultat", vbOKOnly, MaChaine)
Cette boucle permet de
répéter un traitement jusqu’à ce qu’une condition soit vraie.
Voici la syntaxe en bon
français :
Faire
Traitement
Jusqu’à ce que condition
soit vraie.
La syntaxe en VISUAL
BASIC :
Do
LeTraitement
Loop Until LaCondition
La description :
« LeTraitement »
sera exécuté jusqu’à ce que « LaCondition » soit vraie.
Remarque :
A l’intérieur du code du
traitement, vous pouvez à tout moment stopper l’exécution de ce traitement et
sortir de la boucle par l’intermédiaire de l’instruction Exit Do.
Voici un exemple de
code :
Nous allons déclarer une
variable de type chaîne de caractères et elle s’appellera Réponse.
Nous afficherons une
question dans InputBox. La question sera :
« Quelle est la
capitale de LA France ? »
InputBox sera dans le
traitement de la boucle Do Until. La condition de fin de boucle sera vraie
lorsque l’utilisateur aura répondu PARIS.
Cependant, nous laisserons
une chance à l’utilisateur en lui permettant d’arrêter la boucle s’il répond
crac.
A la fin de la boucle,
nous afficherons « Bravo » si l’utilisateur a répondu
« PARIS », et nous afficherons, « Vous êtes un tricheur »,
s’il a répondu « crac ».
' Déclaration de la
variable Réponse contenant la réponse de l'utilisateur
Dim Réponse As String
' Début de la boucle
Do
' Affichage de la question
Réponse = InputBox("Quelle est la
capitale de LA FRANCE ?", "Question du jour")
' Vérifie si la réponse n'est pas crac
If Réponse = "Crac" Then Exit Do
' Vérification de la
réponse par la boucle Until
Loop Until Réponse =
"PARIS"
' Vérifie si l'utilisateur
à répondu PARIS ou crac
If Réponse =
"PARIS" Then
' La réponse est PARIS
MsgBox ("Bravo !")
Else
' La réponse est crac
MsgBox ("Vous êtes un tricheur
!")
End If
Nous pouvons imbriquer une
boucle dans une autre boucle.
A chaque exécution de la
boucle contenant, la boucle imbriquée est exécutée complètement. Par
conséquent, le traitement qui sera intégré dans la boucle imbriquée, est
exécuté par le nombre d’itérations de la boucle imbriquée multiplié par le
nombre d’itération de la boucle contenant.
Nous pouvons bien sûr
imbriquer une boucle dans une boucle imbriquée et ainsi de suite…
Voici donc un exemple de
code avec la boucle For :
Nous allons déclarer un
tableau qui va s’appeler Remplissage.
Ce tableau sera en deux
dimensions, 10 par 10, donc le tableau Remplissage pourra contenir 100 valeurs.
La variable NumCel de type
entier sera incrémentée de la valeur 1 à chaque exécution d’une itération de la
boucle For imbriquée.
Donc, à la fin du
traitement des boucles, la variable NumCel contiendra la valeur 100.
' Déclaration de la
variable Résultat de la boîte de message
Dim Résultat As Integer
' Déclaration du tableau
Remplissage
Dim Remplissage(10, 10) As
Integer
' Déclaration et
initialisation de la variable NumCel
Dim NumCel As Integer
NumCel = 1
' Déclaration des
variables compteur pour les boucles FOR
Dim I As Integer
Dim J As Integer
For I = 1 To 10 Step 1
For J = 1 To 10 Step 1
' Affectation de la valeur NumCel
Remplissage(I, J) = NumCel
NumCel = NumCel + 1
Next J
Next I
Résultat =
MsgBox("Valeur de la cellule 5 5", vbOKOnly, Remplissage(5, 5))
End Sub
Dans cet exemple, nous
allons créer une macro qui va rechercher la dernière ligne du tableau, donc de
la région de données, et ce, afin d’activer la cellule devant recevoir une
nouvelle ligne.
Dans la boucle, nous
allons utiliser la commande ActiveCell.OffSet qui va permettre de descendre
d’une ligne à chaque ittération…
Je dois donc vous
présenter cette commande dès maintenant :
Active.offset
Permet de se déplacer depuis la cellule courante.
La syntaxe :
ActiveCell.OffSet(NombreLignes,NombreColonnes).Select
La description :
NombreLignes est une valeur numérique qui définit le déplacement vertical, donc, de ligne en ligne.
0, aucun déplacement.
Une valeur positive, déplacement à la ligne suivante, 1 pour une ligne, 2 pour 2 lignes, 3 pour 3 lignes Etc.
Une valeur négative, déplacement à la ligne précédente, -1 pour une ligne Etc…
NombreColonnes est une valeur numérique qui définit le déplacement horizontal, donc, de colonne en colonne.
0, aucun déplacement.
Une valeur positive, déplacement à la colonne suivante, 1 pour une colonne, 2 pour 2 colonnes, 3 pour 3 colonnes Etc.
Une valeur négative, déplacement à la colonne précédente, -1 pour une colonne Etc…
Par exemple, pour déplacer le curseur à la ligne précédente :
ActiveCell.OffSet(-1,0).Select
Donc, dans notre boucle, comme nous désirons descendre d’une ligne, nous utiliserons la syntaxe suivante :
ActiveCell.OffSet(1,0).Select
Attention, vous devez débuter la macro en activant la première cellule en haut à gauche de votre tableau, ici, dans cet exemple, nous considérerons que le tableau débute à la cellule A1.
Sub FinDuTableau()
'
' FinDuTableau Macro
' Macro enregistrée le 15/03/2008 par BOULANGER
'
' Touche de raccourci du clavier: Ctrl+k
'
Range("A1").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Philippe BOULANGER