Boucle Do until

Attila451

XLDnaute Occasionnel
Bonjour,
J'ai une valeur en A1 et je cherche à faire une boucle qui passe en revue une plage de B1 à B3.
Je voudrais que la boucle tourne de B1 à B3 et que si aucune des 3 cellules n'est = à A1, j'ai un msgbox "pas de correspondance".
Par contre comment traduite tant que B1 n'est as = ? Le <> ne marche pas, et je ne sais pas traduire tant que B1 n'est pas = à A1

J'ai essayé de traduire par
Sub tt()
Dim test As String
Dim Num_Ligne As Long
test = Cells(1, 1) ' A1= A
Num_Ligne = 1
On Error Resume Next

Do Until Cells(Num_Ligne, 2) = test
MsgBox "pb"
Loop

End Sub


Mais ça ne passe pas car je ne sais pas traduire tant que B1=A1, tu boucles en B2 et si B2=A1, msgbox "ok", sinon tu boucles en B3 et si arrivé en b3, ni B1/B2/B3=a1, msgbox "pas de correspondance"

J'ai essayé avec un while/wend, mais dans ce cas, je ne sais pas non plus traduire tant que B1 n'est pas = a A1? Le <> ne marche pas, et je sais traduire des actions style tu rajoutes+1 ou tu mets en couleur la cellule, par contre, je ne sais pas traduire "tu ne fais rien".

Bref, j'ai l'impression d'être une mouche face à une vitre...

Merci d'avance !
 

Pièces jointes

  • pb boucle.xlsx
    8.2 KB · Affichages: 19

Dranreb

XLDnaute Barbatruc
Bonjour.
Et avec une formule, ça n'irait pas ?
Code:
=SI(ESTNA(EQUIV(A1;B1:B3;0));"Problème";"OK")
Sans parler des listes de validations…

Sinon si c'est juste une question abstraite de programmation dans tout cas semblable,
je déclare une variable Trouvé As Boolean, dans la boucle Trouvé = ValeurListe = ValeurCherchée: If Trouvé Then Exit Do ou Exit For. Pour une Boucle For L = 1 To N on peut s'en passer, et tester derrière If L <= N, L valant N+1 si la boucle est allé jusqu'au bout.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour,
Une autre façon avec find
VB:
Option Explicit
Sub test()
Dim c As Range
Set c = Range("B1:B" & [B65000].End(xlUp).Row).Find(Range("A1").Value)
If c Is Nothing Then
    MsgBox Range("A1") & " non trouvée"
Else
    MsgBox Range("A1") & " Existe"
End If
End Sub
 

Attila451

XLDnaute Occasionnel
Bonjour.
Et avec une formule, ça n'irait pas ?
Code:
=SI(ESTNA(EQUIV(A1;B1:B3;0));"Problème";"OK")
Sans parler des listes de validations…

Sinon si c'est juste une question abstraite de programmation dans tout cas semblable,
je déclare une variable Trouvé As Boolean, dans la boucle Trouvé = ValeurListe = ValeurCherchée: If Trouvé Then Exit Do ou Exit For. Pour une Boucle For L = 1 To N on peut s'en passer, et tester derrière If L <= N, L valant N+1 si la boucle est allé jusqu'au bout.
Bonsoir, merci pour vos réponses.

Dranreb, mon exemple était limités sur 3 cellules, auriez vous la gentillesse de developper votre exemples de boucle svp, j'ai essayé avec un while mais je galère et j'aimerais comprendre la solution...
Merci d'avance
 

Pièces jointes

  • pb boucle.xlsx
    8.2 KB · Affichages: 26

Dranreb

XLDnaute Barbatruc
Bonjour.
Alors un exemple avec test de dépassement du compteur de boucle :
VB:
Sub Exemple()
Dim T(), L&, V
T = Feuil1.[B1].Resize(Feuil1.Cells(&H100000, "B").End(xlUp).Row).Value
V = Feuil1.[A1].Value
For L = 1 To UBound(T, 1)
   If T(L, 1) = V Then Exit For
   Next L
MsgBox IIf(L > UBound(T, 1), "Problème", "OK")
End Sub
Mais encore une fois, c'est juste pour l'exemple algorithmique. Pas besoin d'écrire ça, y a les outils.
 

Attila451

XLDnaute Occasionnel
Bonjour.
Alors un exemple avec test de dépassement du compteur de boucle :
VB:
Sub Exemple()
Dim T(), L&, V
T = Feuil1.[B1].Resize(Feuil1.Cells(&H100000, "B").End(xlUp).Row).Value
V = Feuil1.[A1].Value
For L = 1 To UBound(T, 1)
   If T(L, 1) = V Then Exit For
   Next L
MsgBox IIf(L > UBound(T, 1), "Problème", "OK")
End Sub
Mais encore une fois, c'est juste pour l'exemple algorithmique. Pas besoin d'écrire ça, y a les outils.


Bonsoir,
Merci, je débute en vba avec comme seul formateur "vba pour les nuls ", l'appetit vient en mangeant mais je reste très souvent sur ma faim... J'ai à peu près compris les boucles et comme on devient forgeron en forgeant... j'essayais avec une while de ce type avant de lire votre réponse:
Sub testieme3()
Dim Num_Ligne As Variant
Dim Verifie As Variant
Num_Ligne = 1
While Cells(Num_Ligne, 2) <> Cells(1, 1)
Verifie = Cells(Num_Ligne + 1, 2)
Num_Ligne = Num_Ligne + 1
Wend

If Verifie = Cells(1, 1) Then
MsgBox "ok"
Else
MsgBox "Pas d'infos"
End If

End Sub

Par contre, si je mets A en A1 et que A n'est pas compris dans dans la plage b1:b3, la boucle tourne en rond... Si ce n'est pas trop compliqué de vos yeux d'expert, est ce que vous pouvez arranger cette boucle ou je cherche à me poignarder avec une pastèque en utilisant ma boucle while...
Merci d'avance !
 

Dranreb

XLDnaute Barbatruc
Ben, oui, je vous avais bien dit que ce n'était pas nécessaire de se farcir par code une recherche séquentielle et qu'il y avait des méthodes, Find, Worksheetfunction.Match qui le faisaient déjà.
Et je pensais que vous vouliez seulement savoir comment s'y prendre, dans un contexte abstrait, pour déterminer une condition globale dépendant d'un cas détecté sur au moins un seul élément d'un ensemble.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 325
Membres
102 862
dernier inscrit
Emma35400