Puede utilizar sentencias Do...Loop para ejecutar un bloque de sentencias un número indefinido de veces. Las sentencias se repiten mientras una condición es True o hasta que una condición se convierte en True.
Repetición de sentencias mientras una condición es True
Utilice la palabra clave While para comprobar una condición en una sentencia Do...Loop. Puede comprobar la condición antes de iniciar el bucle (como se muestra en el siguiente ejemplo de ChkFirstWhile), o bien puede comprobarla después de que el bucle se haya ejecutado al menos una vez (como se muestra en el ejemplo de ChkLastWhile). En el procedimiento ChkFirstWhile, si myNum se define en 9 en lugar de 20, las sentencias incluidas en el bucle nunca se ejecutarán. En el procedimiento ChkLastWhile, las sentencias del bucle se ejecutan solo una vez porque la condición ya es False.
En los siguientes ejemplos se muestra el uso de while:
Ejemplo 1:
Sub ChkFirstWhile()
Dim counter, myNum
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
'This loop made 10 repetitions."
End Sub
Ejemplo 2:
Sub ChkFirstWhile()
Dim counter, myNum
counter = 0
myNum = 9
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
'This loop made 0 repetitions.
End Sub
Ejemplo 3:
Sub ChkLastWhile()
Dim counter, myNum
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
'This loop made 1 repetition.
End Sub
Ejemplo 4:
Sub ExampleWithDoWhile()
Dim counter, myNum
counter = 0
myNum = 15
Do While myNum > 10
myNum = myNum - 2
counter = counter + 1
Loop
' This loop reduced myNum to 9 and made 3 repetitions
End Sub
Ejemplo 5:
Sub ExampleWithDoLoopWhile()
Dim counter, myNum
counter = 0
myNum = 5
Do
myNum = myNum + 1
counter = counter + 1
Loop While myNum < 10
' This loop increased myNum to 10 and made 5 repetitions.
End Sub
Ejemplo 6:
Sub ChkLastWhile()
Dim counter, myNum
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
'This loop made 1 repetition.
End Sub
Repetición de una sentencia hasta que una condición se convierte en True
Hay dos formas de utilizar la palabra clave Until para comprobar una condición en una sentencia Do...Loop. Puede comprobar la condición antes de iniciar el bucle (como se muestra en el siguiente ejemplo de ChkFirstUntil), o bien puede comprobarla después de que el bucle se haya ejecutado al menos una vez (como se muestra en el ejemplo de ChkLastUntil). Siempre que la condición sea False, se produce el bucle.
En los siguientes ejemplos se muestra el uso de until:
Ejemplo 1:
Sub ChkFirstUntil()
Dim counter, myNum
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
'This loop made 10 repetitions.
End Sub
Ejemplo 2:
Sub ChkLastUntil()
Dim counter, myNum
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
'This loop made 9 repetitions.
End Sub
Ejemplo 3:
Sub ExampleWithDoUntil()
Dim counter, myNum
counter = 0
myNum = 20
Do Until myNum < 15
myNum = myNum - 2
counter = counter + 1
Loop
'This loop reduced myNum to 14 and made 3 repetitions.
End Sub
Ejemplo 4:
Sub ExampleWithDoLoopUntil()
Dim counter, myNum
counter = 0
myNum = 5
Do
myNum = myNum + 2
counter = counter + 1
Loop Until myNum >= 15
'This loop increased myNum to 15 and made 5 repetitions.
End Sub
Salida de una sentencia Do...Loop desde dentro del bucle
Puede salir de Do...Loop mediante la sentencia Exit Do. Debido a que normalmente desea salir solo en determinadas situaciones, como para evitar un bucle infinito, debe utilizar la sentencia Exit Do en el bloque de sentencias True de una sentencia If...Then...Else. Si la condición es False, el bucle se ejecuta como de costumbre.
En el siguiente ejemplo, a myNum se le asigna un valor que crea un bucle infinito. La sentencia If...Then...Else comprueba esta condición, evitando la repetición sin fin.
En los siguientes ejemplos se muestra el uso de la sentencia Do...Loop:
Ejemplo 1:
Sub ExitExample()
Dim counter, myNum
counter = 0
myNum = 9
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
If myNum < 10 Then Exit Do
Loop
'This loop made 1 repetition.
End Sub
Ejemplo 2:
Sub PreventEndlessLoop()
Dim counter, myNum
counter = 1
myNum = 0
Do
myNum = myNum + 1
counter = counter + 1
If counter > 10 Then
Exit Do ' Avoids endless loop by exiting after 10 iterations.
End If
Loop
'This loop made 11 repetitions.
End Sub
Ejemplo 3:
Sub ExampleWithDoWhile()
Dim counter, myNum
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 2
counter = counter + 1
If myNum < 15 Then Exit Do ' Exit the loop early if myNum is less than 15.
Loop
'This loop reduced myNum to 14 and made 3 repetitions.
End Sub
Ejemplo 4:
Sub NestedLoopsExample()
Dim i, j
For i = 1 To 3
j = 0
Do
j = j + 1
If j > 2 Then Exit Do ' Exit inner loop after 2 iterations.
Loop
Next
End Sub