La boucle Do/While
La boucle Do/While (ou Do/While/Loop) ressemble fortement à la boucle While/Wend. Le principe est le même : "tant qu'une condition est respectée, exécuter une suite d'instructions".
En fait :
- Prenez une boucle While / Wend.
- Remplacez While par Do While.
- Remplacez Wend par Loop.
et vous obtenez la variante !
- Sub TestBoucleDoWhile()
- Dim i As Integer
- i = 1
- Do While i <= 5
- MsgBox "i vaut " & i
- i = i + 1
- Loop
- End Sub
Exit Do
La ressemblance entre While/Wend et Do/While fait qu'on utilise quasiment tout le temps la première variante, plus compacte.
Mais la deuxième garde quand même un intérêt : il est possible de forcer son arrêt par un Exit Do, de la même manière qu'on arrête une boucle For/Next par un Exit For.
- Sub TestBoucleDoWhile()
- Dim i As Integer
- i = 1
- Do While i <= 5
- MsgBox "i vaut " & i
- If i = 3 Then Exit Do
- i = i + 1
- Loop
- MsgBox "Terminé, i vaut " & i
- End Sub
La boucle Do/Until
Encore une variante de boucle : Do/Until (ou Do/Loop Until) est une boucle qui se traduit par "faire telle suite d'actions jusqu'à ce qu'une condition soit atteinte". La formulation est donc un peu différente d'une boucle While ("tant que...").
- Sub TestBoucleDoUntil()
- Dim i As Integer
- i = 1
- Do
- MsgBox "i vaut " & i
- i = i + 1
- Loop Until i = 5
- End Sub
Info
Comme la boucle Do/While, la boucle Do/Until peut être interrompue par un Exit Do.
Comparatif entre Do/While et Do/Until
Les boucles Do/While et Do/Until n'ont pas tout à fait le même comportement.
- La première évalue la condition dès l'entrée de la boucle.
- La seconde évalue la condition après le premier tour de boucle.
Essayez le code suivant. Vous verrez que la boucle While effectue 2 tours : le premier pour la valeur 0, le second pour la valeur 1. Alors que la boucle Until n'effectue qu'un tour, pour la valeur 0.
Remplacez les i = 0 par des i = 1, et vous constaterez que la boucle While tourne toujours une fois (normal : la valeur de départ est bien inférieure ou égale à 1 dès l'entrée dans la boucle). Mais la boucle Until tourne maintenant indéfiniment : on rentre dans la boucle avant d'évaluer la condition, puis i est augmenté... et la condition de sortie n'est jamais vérifiée !
Astuce
Rappelez-vous que la combinaison Ctrl + Pause permet de forcer l'arrêt d'une boucle infinie. Ca peut toujours servir !
- Sub ComparatifDo()
- Dim i As Integer
- i = 0
- Do While i <= 1
- MsgBox "Boucle While, i vaut " & i
- i = i + 1
- Loop
- i = 0
- Do
- MsgBox "Boucle Until, i vaut " & i
- i = i + 1
- Loop Until i <= 1
- End Sub