Anticipo al prossimo oggetto da un ciclo per il prossimo anello
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
. 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
.