Salut à tous !
j'ai un petit souci avec VBA : je souhaiterais mettre plusieurs conditions dans une condition While. J'ai écrit ceci :
Merci d'avance !!Code:
1
2
3
4
5 While k="toto" or k="tata" instructions... Wend
laloune
Version imprimable
Salut à tous !
j'ai un petit souci avec VBA : je souhaiterais mettre plusieurs conditions dans une condition While. J'ai écrit ceci :
Merci d'avance !!Code:
1
2
3
4
5 While k="toto" or k="tata" instructions... Wend
laloune
bonjour,
et quel est ton problème exactement ?
ooops, en me relisant je viens de me rendre compte que ce n'était en effet pas très clair :p
en fait ce que je souhaite faire, c'est effectuer une boucle avec un while qui prend en compte 2 conditions : tant que k="toto" ou tant que k="tata", alors on exécute les instructions...
j'ai essayé la syntaxe ci-dessus mais il me génère une erreur...
ma question est donc : est-il possible de mettre plusieurs conditions dans un while ?
Merci
laloune
euh, quelle erreur est générée stp ?
"1004 - Erreur définie par l'application ou par l'objet"
j'ai testé mes 2 conditions indépendamment, et elles fonctionnent...
merci
est-ce que ta variable k est un string ?
ce code fonctionne :
Code:
1
2
3
4
5
6
7
8
9
10 Sub test() Dim k As String k = "toto" While k = "toto" Or k = "tata" Debug.Print "instructions..." k = "tati" Wend End Sub
Bonjour,
Cela devrait fonctionner, à condition que k soit modifié dans la boucle. Sinon, le résultat du test ne risque pas de changer, et si k était égal à toto" ou à "tata", le traitement ne sortira jamais de la boucle.
Toutefois, évite les boucles
Emploie plutôtCode:
1
2
3 While k="toto" or k="tata" instructions... Wend
L’intérêt est que la seconde syntaxe permet de sortir de la boucle si nécessaire evec unCode:
1
2
3 Do While k="toto" or k="tata" instructions... Loop
Par exemple, en phase de test, tu peux employer (à adapter bien sûr, s’il est normal de passer 1 000 fois dans la boucle) :Code:Exit Do
Code:
1
2
3
4
5
6
7
8 Do While k="toto" or k="tata" instructions... i = i + 1 If i = 1000 Then MsgBox "Apparemment, bug, déjà 1000 passages dans la boucle !" Exit Do If i = 1000 Then Loop
En résumé, Do While ... Loop permet de faire tout ce que fait While ... Wend, mais avec plus de souplesse 8-)
Cordialement,
Re,
Schématiquement, une erreur 1004 survient lorsque VBA demande à Excel de faire quelque chose qui est impossible, ou qui se traduirait par l’affichage dans Excel d’un message d’erreur si on essayait de faire la même chose manuellement, indépendamment de VBA :
Par exemple
n’ a rien de choquant, maisCode:Range("A" & NumLigne).Select
va générer une erreur 1004, car 2 puissance 21 = 2 097 152, ce qui est supérieur au nb de lignes d’une feuillle Excel, même avec la version 2007.Code:
1
2
3
4
5 Sub Test() Dim NumLigne As Long NumLigne = 2 ^ 21 Range("A" & NumLigne).Select End Sub
En l’occurrence, l’instruction
est correcte, mais va provoquer "l’ire” d’Excel si NumLigne ne désigne pas un numéro de ligne correct.Code:Range("A" & NumLigne).Select
Par conséquent ton problème n’a rien à voir avec ton test, mais avec l’une des instructions, à l’intérieur de la boucle.
Que se passe-t-il si tu cliques sur le bouton Débogage, quand survient l’erreur ? Quelle instruction est surlignée ?
Cordialement,
j'en doute, étant donné que les instructions sont correctement executées lorsque j'exécute le code avec une seule des deux conditions. Pour moi les instructions sont correctes, seulement la boucle ne se déclenche pas correctementCitation:
Par conséquent ton problème n’a rien à voir avec ton test, mais avec l’une des instructions, à l’intérieur de la boucle.
la ligne surlignée est celle de la condition While, ou plutôt Do maintenant.Citation:
Que se passe-t-il si tu cliques sur le bouton Débogage, quand survient l’erreur ? Quelle instruction est surlignée ?
Lorsque j'utilise l'opérateur Xor (càd true + false>true / false + true>true). En fait mes conditions sont du type :
donc du coup, je veux que mon code s'exécute tant que k est différent de "toto" ou de "tata". Mais qu'il s'exécute quand même lorsque l'un des deux est faux (ce qui est identique qu'avec or).Code:Do while k<>"toto" xor k<>"tata"
POURTANT ! avec xor mon code s'exécute (plus ou moins bien, mais ce n'est pas le souci pour l'instant), et avec or il me génère une erreur 8O
Merci en tous cas
C'est pas très clairCitation:
donc du coup, je veux que mon code s'exécute tant que k est différent de "toto" ou de "tata". Mais qu'il s'exécute quand même lorsque l'un des deux est faux
OR (inclusif) la condition est vrai si l'une des 2 conditions est vrai, ou les 2
XOR (ou exclusif) la condition est vrai si l'une des 2 condition est vrai, mais pas les 2
J'ai l'impression que dans ton cas il te faut plutôt un AND
je vois pas bien comment
and(k="toto";k="tata") pourrait devenir vrai
d'un autre côté cela supprimera le bug (la condition sera toujours fausse).
Il as pas mis égal mais différent
Bonjour,
Si c'est possible met ta macro, ont pourras la tester.
L'erreur 1004 peut aussi être une erreur qui dépend tu contexte.
A+
Au début du post il mettais égal et dans son dernier message il met different :
Effectivement la même chose avec OR serais toujours VRAI, d'ou peut-être l'erreurCitation:
Code:Do while k<>"toto" xor k<>"tata"
Bref c'est pas clair ce qu'uil veux
Peux-tu nous indiquer plus précisément ce que sont les 2 conditions, et ce k représente ?
voilà mon fichier incluant mon code.
Merci pour votre aide précieuse en tous cas
laloune
tu fait tout un tas de tests sur une feuille SourceSheet mais qui, dans le fichier passé est vide ? . De ce fait impossible de passer par ton While.
SAlut
Sans données ca va etre compliquer
J'ai juste remarquer une amelioration de la syntaxe, bien que ca ne changera rien a ton probleme
[Edit]Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 'Repérage de la dernière cellule 'LastCell = .Range("A65536").End(xlUp).Address 'LastCell = .Cells(Rows.Count, "A").End(xlUp).Address '///////////// 'Définition de la plage 'Set PlageATraiter = .Range("A1:" & CStr(LastCell)) Set PlageATraiter = .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) '///////////// For Each Cellule In PlageATraiter 'Extraction de la famille If Trim(ExtractElement(Cellule, ":", 1)) = "Famille de formules" Or Trim(ExtractElement(Cellule, ":", 1)) = "Set of formulas" Then VarFamille = Left(ExtractElement(Cellule, ":", 2), Len(ExtractElement(Cellule, ":", 2)) - 1) '////// 'End If ElseIf Trim(ExtractElement(Cellule, ":", 1)) = "Formule manuelle" Or Trim(ExtractElement(Cellule, ":", 1)) = "Manual formula" Then
Par contre ca ne changera peut etre rien mais je mettrais des parentheses, je crois quil y a quelmque chose qui ne va pas sinon
Il me semble .. mais c'est peut etre dans ma tete que dans un cas If A = B Xor C = D Then Vb peut craker et comprendre If A = (B Xor C) = D Then Je crois avoir vu ca quelque part mais n'en suis pas totalement sur, je prend qd meme le risque de me ridiculiser si ca n'est pas le cas :DCode:Do While (ExtractElement(Cellule.Offset(IndexParametres, 0), ";", 1) <> "Apply to breakdown") Xor (ExtractElement(Cellule.Offset(IndexParametres, 0), ";", 1) <> "Appliquer sur les détails")
[/Edit]
A++
Qwaz