Pas de différence entre do … loop until … et do until … loop : pourquoi ?

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

je suis en train de mettre au point des bouts de code et ne comprends pas la différence entre une boucle do loop avec dans un cas la condition en haut et dans l'autre cas la condition en bas de boucle.
J'ai recherché un peu partout et ai compris que si la condition est à la fin, dans ce cas la condition sera testée au moins une fois.
Mais dans le cas d'espèce (voir pièce jointe et code ci-dessous), cela ne fait aucune différence …

Aurais-je loupé un épisode ?
J'avoue que j'adapte un bout de code qui m'avait été présenté sur ce forum, avec la condition en fin de boucle, mais sans qu'il soit fait explicitement référence à la nécessité d'avoir la condition à la fin plutôt qu'au début.
Comme je ne vois pas de différence mais surtout que j'aimerais comprendre, quelqu'un peut-il me dire pourquoi j'arrive au même résultat, quelque soit le type de boucle utilisé ?

ci-dessous le code avec la condition à la fin

Code:
Sub Selection_Annee_until_à_la_fin()
Dim AnneeReponse As Long
Dim PlagedeRecherche As Range
Dim RechercheAnnee As Range
Dim dernlig As Long
dernlig = Sheets("Source").Range("F" & Rows.Count).End(xlUp).Row
Set PlagedeRecherche = Sheets("Source").Range("F2:F" & dernlig)
       Do
            AnneeReponse = Application.InputBox("Indiquez l'année, SVP ", Type:=1)
            ' test de l'existence de l'année dans la base
            Set RechercheAnnee = PlagedeRecherche.Find(What:=AnneeReponse, LookAt:=xlWhole)
            If RechercheAnnee Is Nothing Then
                MsgBox "L'année indiquée ne figure pas dans la base, recommencez SVP"
            End If
Loop Until Not RechercheAnnee Is Nothing
 MsgBox "l'année " & RechercheAnnee & " a été saisie, ici la suite du traitement ..."
End Sub


ci-dessous le code avec la condition au début

Code:
Sub Selection_Annee_until_au_début()

Dim AnneeReponse As Long
Dim PlagedeRecherche As Range
Dim RechercheAnnee As Range
Dim dernlig As Long
dernlig = Sheets("Source").Range("F" & Rows.Count).End(xlUp).Row
Set PlagedeRecherche = Sheets("Source").Range("F2:F" & dernlig)
    
 Do Until Not RechercheAnnee Is Nothing
            AnneeReponse = Application.InputBox("Indiquez l'année, SVP ", Type:=1)
            ' test de l'existence de l'année dans la base
            Set RechercheAnnee = PlagedeRecherche.Find(What:=AnneeReponse, LookAt:=xlWhole)
            If RechercheAnnee Is Nothing Then
                MsgBox "L'année indiquée ne figure pas dans la base, recommencez SVP"
            End If
Loop
 MsgBox "l'année " & RechercheAnnee & " a été saisie, ici la suite du traitement ..."
End Sub





Merci d'avance pour vos lumières

Sebast
 

Pièces jointes

  • question_21102014.xlsm
    169.8 KB · Affichages: 21

ROGER2327

XLDnaute Barbatruc
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Bonjour Sebast.


Essayez le code suivant :​
Code:
Sub TEST()
Dim x As Boolean, VF As Boolean
  MsgBox "Premier cas :" & vbCrLf & "x = FAUX"
  x = False
  GoSub R
  MsgBox "Les deux boucles ont été exécutées."
  MsgBox "Deuxième cas :" & vbCrLf & "x = VRAI"
  x = True
  GoSub R
  MsgBox "Seule la deuxième boucle a été exécutée."
Exit Sub

R:

  VF = x
  Do Until VF
    MsgBox """jusqu'à ce que ""x"" soit ""VRAI"""" placé après ""FAIRE"""
    VF = True
  Loop

  VF = x
  Do
    MsgBox """jusqu'à ce que ""x"" soit ""VRAI"""" placé après ""BOUCLE"""
    VF = True
  Loop Until VF

Return
End Sub
Simple affaire de logique...​



Bonne journée.


ℝOGER2327
#7628


Lundi 16 Haha 142 (Saint Vadrouille, emblème - fête Suprême Quarte)
30 Vendémiaire An CCXXIII, 5,5483h - tonneau
2014-W43-2T13:18:57Z
 

Sebast

XLDnaute Impliqué
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Bonjour Roger2327,

merci pour ton aide.
J'ai cependant un peu de mal à m'y retrouver parmi ces imbrications.

Je voulais juste savoir ce qui, dans le code que j'ai posté, fait que j'ai systématiquement le même résultat alors que les boucles sont construites différemment.
J'en viens du coup à ne plus trop savoir si c'est important d'opter pour l'une plutôt que pour l'autre ...

Avec ma pièce jointe, vois-tu une différence dans le fonctionnement des boucles, y a-t-il une erreur qui m'échappe ?


Bonne journée
 

Roland_M

XLDnaute Barbatruc
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Bonjour à tous,

qq exemples simples

Code:
Sub ExempleBoucle()

'd'abord la différence entre do loop et while wend
'c'est qu'avec do il y a la possibilité de faire "exit do"
'ensuite il est préférable de mettre en début le test limite
'ça évite de rentrer dedans si pas ok déjà au départ

'cette boucle ne tournera jamais
X = 0: While X > 0: MsgBox "X = " & X: Wend

'cette boucle tournera à l'infini
X = 1: While X > 0: MsgBox "X = " & X: Wend

'cette boucle tournera juqu'à ce que X = 10
X = 0: While X < 10: X = X + 1: MsgBox "X = " & X: Wend

'cette boucle tournera juqu'à ce que X = 10
X = 0: Do While X < 10: X = X + 1: MsgBox "X = " & X: Loop

'cette boucle tournera juqu'à ce que X = 10
X = 0
Do
 X = X + 1
 MsgBox "X = " & X
 If X = 10 Then Exit Do
Loop

'ou
X = 0
Do
 X = X + 1: If X > 10 Then Exit Do
 MsgBox "X = " & X
Loop


End Sub
 
Dernière édition:

Sebast

XLDnaute Impliqué
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Bonsoir Roland_M,

merci pour tes exemples.
Je les comprends mais du coup encore moins pourquoi le distingo dans mon code ne s'opère pas.

J'ai beau avoir une routine avec la condition en haut de la boucle et une autre avec la condition en fin de boucle, le résultat est le même (voir pièce jointe).

a +

Sebast
 

ROGER2327

XLDnaute Barbatruc
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Re...


Bonjour Roger2327,

merci pour ton aide.
J'ai cependant un peu de mal à m'y retrouver parmi ces imbrications.

Je voulais juste savoir ce qui, dans le code que j'ai posté, fait que j'ai systématiquement le même résultat alors que les boucles sont construites différemment.
J'en viens du coup à ne plus trop savoir si c'est important d'opter pour l'une plutôt que pour l'autre ...

Avec ma pièce jointe, vois-tu une différence dans le fonctionnement des boucles, y a-t-il une erreur qui m'échappe ?


Bonne journée
Peu importent les imbrications, il suffit d'exécuter la procédure TEST proposée. Elle montre que le comportement de la boucle Do ... Loop dépend de l'état logique initial de la condition de sortie.

Si la condition de sortie est initialement FAUX,
Do Until condition de sortie
Code
Loop
et
Do
Code
Loop Until condition de sortie
exécutent toutes les deux Code jusqu'à ce que Code change l'état logique de condition de sortie.


Si la condition de sortie est initialement VRAI,
Do Until condition de sortie
Code
Loop
n'exécute pas Code.
Seul
Do
Code
Loop Until condition de sortie
exécute Code jusqu'à ce que Code change l'état logique de condition de sortie (ou que vous sortiez par Exit Do, mais c'est une autre histoire...).

Vous êtes clairement dans le premier cas, et vos codes sont corrects. Mais si vous voulez que votre boucle s'exécute que la valeur initiale de RechercheAnnee soit ou non Nothing, choisissez la forme Do ... Loop Until.



Bonne soirée.


ℝOGER2327
#7629


Lundi 16 Haha 142 (Saint Vadrouille, emblème - fête Suprême Quarte)
30 Vendémiaire An CCXXIII, 6,3774h - tonneau
2014-W43-2T15:18:21Z
 
Dernière édition:

Sebast

XLDnaute Impliqué
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Re,

Merci de m’avoir consacré un peu de temps et d’avoir posté ces explications.

Vous écrivez
« si vous voulez que votre boucle s'exécutent indépendamment du fait que la valeur RechercheAnnee soit ou non Nothing, choisissez la forme Do ... Loop Until »

Ce que je ne comprends pas, c’est que quoi qu’il arrive, RechercheAnnee prend soit une valeur, soit nothing (c'est-à-dire l’année ne figure pas dans la base).

Dans mon fichier joint, que je saisisse une année présente ou pas dans la base, l’une comme l’autres des sub() fonctionne … donc y compris celle qui n’est pas do … loop until.



Qu’entendez-vous pas condition de sortie initialement vraie ? comment la condition peut-elle initialement avoir une valeur (nothing ou autre) si on ne l’a pas encore testée ?

Bonne soirée
 

ROGER2327

XLDnaute Barbatruc
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Re...


Testez donc ceci :​
Code:
Sub Selection_Annee_until_au_début()

Dim AnneeReponse As Long
Dim PlagedeRecherche As Range
Dim RechercheAnnee As Range
Dim dernlig As Long
    dernlig = Sheets("Source").Range("F" & Rows.Count).End(xlUp).Row
    Set PlagedeRecherche = Sheets("Source").Range("F2:F" & dernlig)

    Set RechercheAnnee = Sheets("Source").Range("A1")
    '... ce qui fait que RechercheAnnee n'est pas nothing et donc que
    'Not RechercheAnnee Is Nothing a la valeur VRAI.

    Do Until Not RechercheAnnee Is Nothing
        AnneeReponse = Application.InputBox("Indiquez l'année, SVP ", Type:=1)
        Set RechercheAnnee = PlagedeRecherche.Find(What:=AnneeReponse, LookAt:=xlWhole)
        If RechercheAnnee Is Nothing Then
            MsgBox "L'année indiquée ne figure pas dans la base, recommencez SVP"
        End If
    Loop
    MsgBox "l'année " & RechercheAnnee & " a été saisie, ici la suite du traitement ..."
End Sub


ℝOGER2327
#7630


Lundi 16 Haha 142 (Saint Vadrouille, emblème - fête Suprême Quarte)
30 Vendémiaire An CCXXIII, 7,0154h - tonneau
2014-W43-2T16:50:13Z
 

Sebast

XLDnaute Impliqué
Re : Pas de différence entre do … loop until … et do until … loop : pourquoi

Bonjour,

désolé pour cette réponse tardive, je n’avais pas accès à mon ordi …

Un grand merci pour ta patience et ta pédagogie : avec cet exemple très parlant, j’ai enfin compris ce qui se passe quand la condition est en fin de boucle plutôt qu’en début.

Encore merci pour l’aide fournie

Sebast
 

Discussions similaires

Réponses
16
Affichages
2 K

Statistiques des forums

Discussions
312 338
Messages
2 087 396
Membres
103 534
dernier inscrit
Kalamymustapha