Les boucles DO, LOOP, WHILE et UNTIL

Dans un programme, il est souvent nécessaire de répéter une ou plusieurs actions jusqu'à ce que quelque chose se passe, ou tant que quelque chose ne s'est pas passé. Nous alons voir ici comment ça se passe. Voici un petit lexique Anglais/Français :

Loop = Boucle (Faire une boucle, recommencer la boucle)
Do = Faire (Effectuer, faire les actions qui suivent)
While = Tant que (Tant que X = 1, ou Tant que le mot de passe est erroné)
Until = Jusqu'à ce que (Jusqu'à ce que X = 10, ou Jusqu'à ce que le mot de passe soit correct)


Premier programme : Simple utilisation de InputBox, sans autre

Sub TestLoop()
  Dim Reponse As Integer
  Reponse = InputBox("Entrez un chiffre")
End Sub


Ce programme demande un chiffre encore et encore tant que l'utilisateur s'évertue a entrer un autre chiffre que 5

Sub TestLoop2()
  Dim Reponse As Integer
  Do
    Reponse = InputBox("Entrez un chiffre")
  Loop While Reponse <> 5
End Sub


Ce programme fait exactement l'inverse : Il Continue tant que l'utilisateur entre 5

Sub TestLoop3()
  Dim Reponse As Integer
  Do
    Reponse = InputBox("Entrez un chiffre")
  Loop While Reponse = 5
End Sub


On ajoute ici du code avant la boucle, et après, simplement pour montrer comment généralement un programme se déroule : Une partie d'introduction, la boucle elle-même et ensuite, la conclusion.

Sub TestLoop4()
  Dim Reponse As Integer
  MsgBox "Début" ' Une seule fois avant la boucle

  Do
    Reponse = InputBox("Entrez un chiffre")
  Loop While Reponse = 5

  MsgBox "Fin" ' Une seule fois après la boucle
End Sub


Avec Do While, le programme n'entre pas nécessairement dans la boucle. Si on entre le bon mot de passe immédiatement, le programme s'arrête. Dans l'exemple d'avant on faisait DO quelque chose WHILE une condition, donc on faisait au moins une fois cette chose, tandis qu'ici, c'est DO WHILE une condition, on fait quelque chose. Le programme regarde IMMEDIATEMENT si la condition est satisfaite

Sub TestLoop5()
  Dim Reponse As String
  Reponse = InputBox("Entrez le mot de passe")

  Do While Reponse <> "youpi"
    Reponse = InputBox("Mauvaise réponse. Essayez encore")
  Loop
End Sub


Ici, par contre, avec le while a la fin de la boucle, le' programme fait AU MOINS une fois "Mauvaise réponse",' meme si l'utilisateur répond tout de suite bien

Sub TestLoop6()
  Dim Reponse As String
  Reponse = InputBox("Entrez le mot de passe")
  Do
    Reponse = InputBox("Mauvaise réponse. Essayez encore")
  Loop While Reponse <> "youpi"
End Sub


Ici, le principe est le même, mais on utilise UNTIL (Jusqu'a ce que). En fait, on peut passe toute sa vie de programme en utilisant exclusivement WHILE sans jamais utiliser UNTIL. Il suffit de changer la tournure de phrase. WHILE Reponse = "youpi" veut dire exactement la même chose que UNTIL Reponse <> "youpi", Mais dans certains cas, c'est plus pratique d'utiliser WHILE, et dans d'autres cas UNTIL, mais c'est très subjectif.

Sub TestLoop7()
  Dim Reponse As String
  Reponse = InputBox("Entrez le mot de passe")
  Do Until Reponse = "youpi"
    Reponse = InputBox("Mauvaise réponse. Essayez encore")
  Loop
End Sub


Application complète de boucles pour l'obtention d'un mot de passe. On fait une première demande de mot de passe : "Entrez le mot de passe". Et seulement si l'utilisateur se plante au premier essai, on lui signale qu'il s'est trompé ("Mauvaise réponse. Essayez encore"), et ce message, il va le voir jusqu'à ce qu'il arrête de se tromper (1 fois, 5 fois ou mille fois s'il est vraiment très maladroit, ou s'il a la maladie de parkinson.). A la fin, quand il a enfin tapé le bon mot de passe, le programme lui dit en combien d'essais il a trouvé.

Sub MotPasse()
  ' Déclaration des variables
  Dim Reponse As String ' Contient l'essai de mot de passe
  Dim NombreEssai As Integer ' Compte les essais

  ' Premiere demande :
  Reponse = InputBox("Entrez le mot de passe")
  ' De tout façon, on doit faire au moins 1 essai
  NombreEssai = 1

  ' Faire la boucle JUSQU'A CE QUE L'utilisateur entre youpi
  Do Until Reponse = "youpi"
    Reponse = InputBox("Mauvaise réponse. Essayez encore")
    ' On augmente le nombre d'essais :
    NombreEssai = NombreEssai + 1
  Loop ' Fin de la boucle

  ' Message de bienvenue final. Si c'est trouvé en un essai, 
  ' écrire au singulier, et écrire au pluriel
  ' si c'est en plusieurs essais :
  If NombreEssai = 1 Then
    MsgBox "Mot de passe trouvé au premier Essai"
  Else
    MsgBox "Mot de passe trouvé en " & NombreEssai & " Essais"
  End If
End Sub