Domanda

Ho un ciclo per il prossimo.All'interno del loop provamo diversi criteri e se qualsiasi test fallisce, allora sono pronto a quel punto per saltare il resto del codice nel loop e avanzare all'elemento "Avanti".Il modo in cui attualmente gestisco questo è con una dichiarazione goto che mi porta alla linea a destra prima di "Avanti".Preferirei non usare un'istruzione GOTO, c'è un altro modo per avanzare all'articolo "Avanti" da un ciclo per il prossimo ciclo?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
.

È stato utile?

Soluzione

Ecco una soluzione alternativa per la mancanza di una parola chiave continue:

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
.

Altri suggerimenti

Purtroppo non c'è nessuna dichiarazione continue in un ciclo for in VBA.(La relativa struttura di controllo Exit For esiste ma non è di aiuto qui).

Ed è bene che tu abbia prenotazioni sull'utilizzo di un GoTo: fanno il codice difficile da seguire.

La tua migliore scommessa è quella di inserire il codice nel ciclo in una funzione separata e utilizzare Exit Function entro tale funzione in punti appropriati.Puoi anche quindi riportare i codici di errore sul chiamante per aiutare il codice in scala.

Puoi usare se altrimenti ladder:

For x = 1 to 10
if test 1 
else if test 2
else if test 3
. 
.
.
.
else
  add item to array
end if
Next
.

oltre a goto non c'è nessun modo diretto per saltare tra il tuo codice, Spero che questo potrebbe aiutare.

Se non si dispone di troppi test, è possibile utilizzare la condizione Not e creare un'istruzione If nidificata.Ciò dovrebbe avere quasi lo stesso effetto di quello che stai chiedendo, poiché qualsiasi test non riuscito finisse l'istruzione If e sposta il codice alla successiva X nel loop senza eseguire i seguenti test.

Ecco un esempio di ciò che intendo - un ciclo di due test che costruisce un array contenente i numeri da 5 a 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
.

Dato che stai preformando un'azione solo se tutti i test hanno successo, quindi fai la dichiarazione IF con es. VBA noCortocircuito I test, (cioè valuterà ogni caso di prova, anche se il primo ritorna false.) Suggerirei di incapsulando ogni test in una funzione che restituisca un booleano per mantenere il tuo codice in ordine.

If Test1()  and _
   Test2()  and _
   testn()  THEN
    add item to array
End if
.

Un altro modo è utilizzare una variabile booleana nel tuo codice, come questa

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
.

Se i test sono costosi, è possibile aggiungere un controllo interiore se il controllo del controllo se necessario valutare il test successivo come questo

 If Success Then
    If Test n fails then
       Success=false
    End If
End if
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top