Bucles y bucles de salida en VBA

Glen Alfaro 30 enero 2023
  1. Bucle For de VBA
  2. Bucle VBA Do Until
  3. Bucle Do While de VBA
  4. Utilizando el comando Exit para forzar la detención del bucle en VBA
Bucles y bucles de salida en VBA

Los bucles en la programación de computadoras son muy importantes. Permiten ejecutar tareas repetitivas con un mínimo de líneas de código. La necesidad de loops en las computadoras surge por varias razones dependiendo de las tareas a realizar.

A pesar de que son tan poderosos, son simples en contexto y sintaxis.

En VBA, hay tres bucles que se pueden utilizar.

  1. Bucle For - Bucle dentro de límites predefinidos o fijos
  2. Bucle Do While: realiza un bucle mientras la condición es True.
  3. Bucle Do Until: bucles hasta que la condición sea True.

Bucle For de VBA

Sintaxis:

For [ counter ] = [start] To [end]  Step [ step ]
    [ statements ]
    [ Exit For ]
Next [ counter ]

Parámetros:

[ counter ] Requerido. Por lo general, una variable entera o larga que contiene el valor actual del contador
[ start ] Requerido. El valor inicial del contador.
[end] Requerido. El valor final del contador.
[ statements ] El bloque de código para ejecutar dentro del bucle
[ Exit For ] Opcional. Forzar el bucle para detenerse y salir del bloque de código de bucle
[ step ] Opcional. El incremento del contador en cada iteración. Si no se declara, el valor es 1.

El ejemplo del bucle For:

Este bloque de código aceptará un valor entero como su número inicial, luego disminuirá el número hasta cero usando un bucle For. Imprimirá el resultado de cada iteración.

Sub ReduceToZero(numStart As Integer)

Dim i As Integer

For i = numStart To 0 Step -1


    Debug.Print "The number is now " & i
    If i = 0 Then

        Debug.Print ("Done!")

    End If

Next i

End Sub

Sub testSub()

Call ReduceToZero(10)

End Sub

Producción :

The number is now 10
The number is now 9
The number is now 8
The number is now 7
The number is now 6
The number is now 5
The number is now 4
The number is now 3
The number is now 2
The number is now 1
The number is now 0
Done!

Bucle VBA Do Until

Sintaxis:

Do Until [condition]
    [statements]
    [Exit Do]
Loop

Parámetros:

[condition] Requerido. La condición de que, una vez verdadera, saldrá del bloque de código.
[statements] Requerido. El bloque de código a ejecutar.
[Exit Do] Opcional. Forzar el bucle para que se detenga y salga del bloque de código

Ejemplo de bucle Do Until:

Este bloque de código aceptará un valor entero como su número inicial, luego aumentará el número hasta diez usando un bucle Do Until. Imprimirá el resultado de cada iteración.

Sub IncrementToTen(numStart As Integer)

Dim i As Integer

i = numStart

Do Until i = 10 + 1

    Debug.Print "The number is now " & i
    i = i + 1
Loop

End Sub

Sub testSub()

Call IncrementToTen(-5)

End Sub

Salida testSub:

The number is now -5
The number is now -4
The number is now -3
The number is now -2
The number is now -1
The number is now 0
The number is now 1
The number is now 2
The number is now 3
The number is now 4
The number is now 5
The number is now 6
The number is now 7
The number is now 8
The number is now 9
The number is now 10
Done!

Bucle Do While de VBA

Sintaxis:

Do while [condition]
    [statements]
    [Exit Do]
Loop

Parámetros:

[condition] Requerido. La condición que debe ser verdadera para ejecutar el bloque de código.
[statements] Requerido. El bloque de código a ejecutar.
[Exit Do] Opcional. Forzar el bucle para que se detenga y salga del bloque de código

El ejemplo del bucle Do While:

Este bloque de código aceptará un valor entero como su número inicial, luego aumentará el número hasta diez usando un bucle Do While. Imprimirá el resultado de cada iteración.

Sub IncrementToTen(numStart As Integer)

Dim i As Integer
i = numStart
Do While i < 10 + 1

Debug.Print "The number is now " & i
i = i + 1
Loop
Debug.Print "Done!"
End Sub

Sub testSub()

Call IncrementToTen(-9)

End Sub

Salida testSub:

The number is now -9
The number is now -8
The number is now -7
The number is now -6
The number is now -5
The number is now -4
The number is now -3
The number is now -2
The number is now -1
The number is now 0
The number is now 1
The number is now 2
The number is now 3
The number is now 4
The number is now 5
The number is now 6
The number is now 7
The number is now 8
The number is now 9
The number is now 10
Done!

Utilizando el comando Exit para forzar la detención del bucle en VBA

Cuando se trata de bucles, están sujetos a condiciones que el bucle seguirá ejecutando cuando se cumpla. Sin embargo, un escenario común es que necesitamos salir del bucle, incluso si las condiciones aún se cumplen. Una aplicación típica para esto es cuando se trata de métodos de Error-handling, la técnica Stop-when-search. Se necesita una salida inmediata del bucle para evitar más errores o ahorrar tiempo de ejecución.

A continuación, los bloques de código demostrarán el uso del comando Exit para forzar la parada del bucle en un bucle Do.

Este bloque de código tiene como objetivo detener el bucle cuando el cociente de dos números es uno. Estos dos números se generan aleatoriamente entre los valores enteros upperbound y lowerbound, los parámetros de la subrutina. Si el divisor generado (divis) es cero, entonces se produciría un error ya que no se permite la división por cero. Para evitar que ocurra, usaremos el comando Exit para terminar el bucle.

Sub StopWhenQuotientIsOne(upperbound As Integer, lowerbound As Integer)

Dim divid As Integer
Dim divis As Integer
Dim isOne As Boolean

divid = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
divis = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

Do Until isOne = True

    If divis = 0 Then
        Debug.Print "Illegal divisor. Exiting the Loop"
        Exit Do
    End If

Debug.Print divid / divis

If divid / divis = 1 Then

    isOne = True
    Debug.Print "Done! One is achieved."

End If

divid = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
divis = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

Loop


End Sub

Sub testSub()

Call StopWhenQuotientIsOne(4, -4)

End Sub

Salida testSub (primera prueba):

-4 
-0 
-0.666666666666667 
Illegal divisor. Exiting the Loop

Salida testSub (4ª prueba):

-2 
 0 
-3 
 1 
Done! One is achieved.

El siguiente bloque de código demostrará el uso del comando Exit para forzar la parada del bucle en un bucle For.

En este ejemplo, la subrutina StopWhenNegative requiere dos parámetros. Primero está el startNum y luego EndNum. El bucle iterará desde startNum hasta EndNum. Si el contador se vuelve negativo, el bucle se terminará con el comando Salir.

Sub StopWhenNegative(startNum As Integer, EndNum As Integer)

Dim i As Integer
 
For i = startNum To EndNum Step -1
 
    If i < 0 Then
        Debug.Print "Opps, negative values detected. Exiting loop."
        Exit For
    End If
Debug.Print "The current number is :" & i
Next i

End Sub

Sub testSub()

Call StopWhenNegative(10, -5)

End Sub

Salida testSub:

The current number is :10
The current number is :9
The current number is :8
The current number is :7
The current number is :6
The current number is :5
The current number is :4
The current number is :3
The current number is :2
The current number is :1
The current number is :0
Opps, negative values detected. Exiting loop.