Avanzar al siguiente elemento desde dentro de un bucle For-Siguiente
Pregunta
Tengo un bucle For-Next.Dentro del ciclo pruebo varios criterios diferentes y, si alguna prueba falla, entonces estoy listo en ese punto para omitir el resto del código en el ciclo y avanzar al "siguiente" elemento.La forma en que manejo esto actualmente es con una declaración GoTo que me lleva a la línea justo antes de "Siguiente".Preferiría no utilizar una instrucción GoTo. ¿Existe otra forma de avanzar al elemento "siguiente" desde un bucle For-Next?TÍA!
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
Solución
Aquí hay una solución para la falta de una palabra clave 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
Otros consejos
Desafortunadamente no hay continue
-como declaración en un for
bucle en vba.(La estructura de control relacionada Exit For
existe pero eso no sirve de nada aquí).
Y es bueno que tengas reservas sobre el uso de un GoTo
:hacen que el código sea difícil de seguir.
Su mejor opción es poner el código en el bucle en una función separada y usar Exit Function
dentro de esa función en los puntos apropiados.Incluso puede transmitir códigos de error a la persona que llama para ayudar a que el código se escale.
Puedes usarlo en el otro lado de la escalera:
For x = 1 to 10
if test 1
else if test 2
else if test 3
.
.
.
.
else
add item to array
end if
Next
además de goto No hay ninguna manera directa de saltar entre su código, Espero que esto pueda ayudar.
Si no tienes demasiadas pruebas, puedes usar el Not
acondicionar y construir un anidado If
declaración.Esto debería tener casi el mismo efecto que lo que estás pidiendo, ya que cualquier prueba fallida terminaría con eso. If
declaración y mueva el código a la siguiente X en su bucle sin ejecutar las siguientes pruebas.
Aquí hay un ejemplo de lo que quiero decir: un bucle de dos pruebas que crea una matriz que contiene los números del 5 al 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
Dado que está preformando una acción solo si todas las pruebas tienen éxito, haz la declaración if-with y. vba noCortocircuito Las pruebas, (es decir, evaluará cada caso de prueba, incluso si la primera devuelve False). Sugeriría encapsular cada prueba en una función que devuelva un booleano para mantener su código ordenado.
If Test1() and _
Test2() and _
testn() THEN
add item to array
End if
Otra forma es hacer uso de una variable booleana en su código, como este
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 las pruebas son caras, puede agregar una comprobación de instrucciones internas de IF para ver si necesitamos evaluar la siguiente prueba como esta
If Success Then
If Test n fails then
Success=false
End If
End if