loop for vbscript iteration next continue

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