Passer à l'élément suivant à partir d'une boucle For-Next
Question
J'ai une boucle For-Next.Dans la boucle, je teste plusieurs critères différents et si un test échoue, je suis alors prêt à ignorer le reste du code dans la boucle et à passer à l'élément "suivant".La façon dont je gère actuellement cela consiste à utiliser une instruction GoTo qui m'amène à la ligne juste avant "Suivant".Je préférerais ne pas utiliser d'instruction GoTo, existe-t-il un autre moyen de passer à l'élément « suivant » à partir d'une boucle For-Next ?TIA !
For x = 1 to 10
Test 1
If Test 1 fails then
GoTo Line1
End if
Test 2
If Test 2 fails then
GoTo Line1
End if
.
.
.
If all tests pass then
add item to array
End if
Line1:
Next
La solution
Voici une solution de contournement en cas d'absence de continue
mot-clé:
For x = 1 to 10
Do
Test 1
If Test 1 fails then
Exit Do
End if
Test 2
If Test 2 fails then
Exit Do
End if
.
.
.
If all tests pass then
add item to array
End if
Loop While False
Next
Autres conseils
Malheureusement il n'y a pas continue
-comme une déclaration dans un for
boucle en vba.(La structure de contrôle associée Exit For
ça existe mais ça ne sert à rien ici).
Et c'est bien que vous ayez des réserves sur l'utilisation d'un GoTo
:ils rendent le code difficile à suivre.
Votre meilleur pari est de mettre le code dans la boucle dans une fonction distincte et d'utiliser Exit Function
au sein de cette fonction aux moments appropriés.Vous pouvez même ensuite relayer les codes d'erreur à l'appelant, aidant ainsi le code à évoluer.
Vous pouvez utiliser si sinon échelle:
For x = 1 to 10
if test 1
else if test 2
else if test 3
.
.
.
.
else
add item to array
end if
Next
Outre Goto, il n'y a pas de moyen direct de sauter entre votre code, J'espère que cela pourrait aider.
Si vous n'avez pas trop de tests, vous pourriez utiliser le Not
conditionner et construire un imbriqué If
déclaration.Cela devrait avoir presque le même effet que ce que vous demandez, puisque tout test échoué mettrait fin à cela. If
et déplacez le code vers le X suivant dans votre boucle sans exécuter les tests suivants.
Voici un exemple de ce que je veux dire : une boucle à deux tests qui construit un tableau contenant les nombres de 5 à 10 :
Sub TestConditionalPass()
Dim intX As Integer
Dim intArray() As Integer
ReDim intArray(1)
For intX = 1 To 10
If Not intX -2 < 1 Then
If Not intX * 2 < 10 Then
ReDim Preserve intArray(UBound(intArray) + 1)
intArray(UBound(intArray)) = intX
End If
End If
Next intX
End Sub
Depuis que vous préformez une action uniquement si tous les tests réussissent, alors effectuez l'instruction IF-AVEC. VBA ne fait pasCourt-circuit Les tests (c'est-à-dire qu'il évaluera chaque cas de test, même si le premier retourne faux.) Je suggérerais d'encapsuler chaque test dans une fonction qui renvoie un booléen à garder votre code rangé.
If Test1() and _
Test2() and _
testn() THEN
add item to array
End if
Une autre solution consiste à utiliser une variable booléenne dans votre code, comme celle-ci
Dim Success as Boolean
Success=True
Test 1
If Test 1 fails then
Success=false
End if
Test 2
If Test 2 fails then
Success=false
End if
.
.
.
If Success then
add item to array
End if
Si les tests sont chers, vous pouvez ajouter une vérification de l'instruction INTERNET si nous devons évaluer le prochain test comme celui-ci
If Success Then
If Test n fails then
Success=false
End If
End if