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
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top