vbscript - for - skip to next iteration vba
"Continuar"(a la siguiente iteraciĆ³n) en VBScript (7)
Un colega y yo estábamos tratando de encontrar una forma de hacer el equivalente de una instrucción "continuar" dentro de un ciclo "Para / Siguiente" de VBScript.
Dondequiera que buscábamos, descubrimos que las personas no tenían forma de hacerlo en VBScript sin tener malos anidados, lo cual no es una opción para nosotros, ya que es un ciclo bastante grande.
Salimos con esta idea. ¿Funcionaría solo como "continuar (hasta la próxima iteración)"? ¿Alguien tiene alguna mejor solución o sugerencia de mejora?
For i=1 to N
For workaroundloop = 1 to 1
[Code]
If Condition1 Then
Exit For
End If
[MoreCode]
If Condition2 Then
Exit For
End If
[MoreCode]
If Condition2 Then
Exit For
End If
[...]
Next
Next
Gracias por tus comentarios
Implementa la iteración como una función recursiva.
Function Iterate( i , N )
If i == N Then
Exit Function
End If
[Code]
If Condition1 Then
Call Iterate( i+1, N );
Exit Function
End If
[Code]
If Condition2 Then
Call Iterate( i+1, N );
Exit Function
End If
Call Iterate( i+1, N );
End Function
Comience con una llamada para iterar (1, N)
Intente utilizar declaraciones While / Wend y Do While / Loop ...
i = 1
While i < N + 1
Do While true
[Code]
If Condition1 Then
Exit Do
End If
[MoreCode]
If Condition2 Then
Exit Do
End If
[...]
Exit Do
Loop
Wend
Podemos usar una función separada para realizar un trabajo de declaración continua. supongamos que tiene el siguiente problema:
for i=1 to 10
if(condition) then ''for loop body''
contionue
End If
Next
Aquí utilizaremos una llamada de función para el cuerpo del bucle:
for i=1 to 10
Call loopbody()
next
function loopbody()
if(condition) then ''for loop body''
Exit Function
End If
End Function
loop continuará para la declaración de salida de la función ....
Su sugerencia funcionaría, pero usar un bucle Do podría ser un poco más legible.
Esto es realmente una expresión idiomática en C: en lugar de usar un goto, puede tener un ciclo do {} while (0) con una declaración de interrupción si desea abandonar el constructo antes de tiempo.
Dim i
For i = 0 To 10
Do
If i = 4 Then Exit Do
WScript.Echo i
Loop While False
Next
Como sugiere crush, parece un poco mejor si eliminas el nivel de indentación adicional.
Dim i
For i = 0 To 10: Do
If i = 4 Then Exit Do
WScript.Echo i
Loop While False: Next
Una opción sería poner todo el código en el bucle dentro de un Sub
y luego simplemente regresar de ese Sub
cuando quieras "continuar".
No es perfecto, pero creo que sería menos confuso que el bucle adicional.
Editar: O supongo que si eres lo suficientemente valiente como para usar un Goto
para saltar al principio del ciclo de alguna manera (asegurándote de que el contador se actualiza correctamente), creo que VBScript es compatible, pero tu reputación podría verse afectada si alguien descubre que estás usando Goto
en tu código :)
Una solución que decidí involucró el uso de una variable booleana para rastrear si el bucle for
debería procesar sus instrucciones o pasar a la siguiente iteración:
Dim continue
For Each item In collection
continue = True
If condition1 Then continue = False End If
If continue Then
''Do work
End If
Next
Descubrí que las soluciones de bucle anidado son algo confusas para la legibilidad. Este método también tiene sus propios inconvenientes ya que el ciclo no salta inmediatamente a la siguiente iteración después de encontrar continue
. Sería posible que una condición posterior revierte el estado de continue
. También tiene una construcción secundaria dentro del ciclo inicial, y requiere la declaración de una var adicional.
Oh, VBScript ... suspiro.
Además, si desea utilizar la respuesta aceptada, que no es tan mala legibilidad, podría combinarla con el uso de :
fusionar los dos bucles en lo que parece ser uno:
Dim i
For i = 0 To 10 : Do
If i = 4 Then Exit Do
WScript.Echo i
Loop While False : Next
Me pareció útil eliminar el nivel extra de sangría.
Utilizo mucho Do, Loop pero he empezado a usar un Sub o una Función de la que podría salir. Simplemente me pareció más limpio. Si alguna de las variables que necesita no es global, deberá pasarlas también al Sub.
For i=1 to N
DoWork i
Next
Sub DoWork(i)
[Code]
If Condition1 Then
Exit Sub
End If
[MoreCode]
If Condition2 Then
Exit Sub
End If
[MoreCode]
If Condition2 Then
Exit Sub
End If
[...]
End Sub