souci avec do until

chatounet

XLDnaute Nouveau
Bonjour à vous
Jusqu'à ce jour j'ai cru que la boucle do until avait deux syntaxes
Do until condition
code
loop

ou

do
code
loop until condition

La seule différence que je voyais était que dans le second cas, la boucle se faisait au moins une fois.

Or dans un bout de vba je me suis aperçu que la différence semble aller au-delà.

mon code :

Sub truc()
Dim pl As Range
Set pl = Range("a1:h34")
h = 0
For i = 1 To pl.Count
pl(i) = Int(Rnd() * 1000)
Next i
b = pl.Value
For i = 1 To UBound(b, 1)
For j = 1 To UBound(b, 2)
Rnd (b(i, j))
If b(i, j) Mod 3 = 1 Then
With Cells(i, j)
.Interior.ColorIndex = 34
.Font.ColorIndex = 3
End With
End If
Next j
Next i
Range("a1").CurrentRegion = b
End Sub
Sub CaMarche()
For Each c In Range("a1:h34")
Do Until c.Interior.ColorIndex = 34
truc
h = h + 1
Loop
Next
MsgBox h
End Sub
Sub CaNeMarchePas()
For Each c In Range("a1:h34")
Do
truc
h = h + 1
Loop Until c.Interior.ColorIndex = 34
Next
MsgBox h
End Sub

Merci pour votre attention. Je vous joins le classeur.
 

Pièces jointes

  • boucle until.xlsm
    13.2 KB · Affichages: 48

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir
Vite fait , un truc bizarre !! il y a des variables inter Sub penses tu que les valeurs soient conservées ??
sont elles déclarées "Public" ? dans les modules ?
> A tester en debug > track en "pas à pas" tu verras quoi , principalement pour C
A mon avis dans ton Do... avec cette variable cela ne doit pas fonctionner
je laisse la suite ....à d'autres
 

eriiic

XLDnaute Barbatruc
Bonjour,

ça veut dire quoi "ça marche pas" ?
Les 2 boucles fonctionnent et agissent telles que tu les as écrites.
Comme dit au-dessus, tes variables h sont locales, donc indépendantes.
Et si tu pouvais utiliser les balises code (sur l'icone Insérer) que ce soit plus lisible stp.
eric
 

chatounet

XLDnaute Nouveau
Bonjour à tous
ça veut dire quoi "ça marche pas" ?
. Je me suit très ma exprimé. Elle fonctionne comme tu l''as dit Eric, mais elle ne me donnait pas le résultat escompté (celui de la deuxième macro).
Comme tu l'as aussi remarqué elle fonctionne telle que je l'ai écrite. Maintenant ça me paraît évident (ma réponse est dans ma question intiale). Dans la Sub CaMarche le programme a pour 1ère consigne la condition, ensuite il appel essi. Ainsi pour un ultime tour il se rend compte que la condition est remplie alors il arrête la boucle. Pour CaNeMarche pas, d'emblée il appelle déjà essi, la boucle s'effectue donc autant de fois qu'il y a de cellules dans la range. Dans le premier cas la condition dit qu'elle est remplie, ce qui a pour effet l'arrêt de la boucle, aux alentours de 17 fois versus 272 pour CaNeMarche pas.
Est-ce que mon raisonnement est correct?
 

Discussions similaires

Réponses
11
Affichages
360

Statistiques des forums

Discussions
312 540
Messages
2 089 408
Membres
104 163
dernier inscrit
Lolo37