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
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top