Loops o Bucles en VBA

Estamos seguros de que este tutorial lo visitarás más de una vez, no solo por la frecuencia del uso de los lazos cerrados o loops en la programación sino por la importancia que tiene entender claramente el potencial de estas funciones en un programa.

¿Qué es un loop, bucle o lazo en programación?

Un loop es básicamente la repetición cíclica de una actividad, acotada en un número finito de repeticiones. El loop puede romperse ya sea por agotar el número de repeticiones pre-establecidas o por el cumplimento de alguna otra condición (puedes repasar los conceptos básicos de los condicionales en nuestro tutorial de Condicionales en VBA).

Figura 1. Definición de un Loop en programación.

Tipos de loop en VBA

En VBA existen esencialmente dos estructuras para hacer los lazos cerrados: For / Next y Do / Loop. Cada una tiene sus características particulares que la pueden hacer más adecuada que la otra para ser usada en ciertos escenarios. Es común toparnos con situaciones en las que sea posible utilizar cualquiera de las dos estructuras, por ello en este tutorial utilizaremos un mismo ejemplo para explicar ambas opciones, para que así tú puedas decidir cual se adapta mejor a tu lógica de programación.

Estructura For Next

Esta modalidad permite hacer una actividad repetitiva desde un número inicial (NI) hasta un número final de repeticiones (NF). Si deseamos hacer, por ejemplo, diez repeticiones, podríamos hacerlos bajo una infinidad de combinaciones:

NI NF Total de repeticiones
1 10 10
10 19 10
81 91 10

El número de repeticiones o ciclos deben estar definidos por números enteros (puedes repasar los conceptos básicos en nuestro tutorial de Variables).

La estructura For Next requiere del empleo de una variable entera, que va a ir aumentando progresivamente desde un NI hasta (To) NF, según un paso (Step) predefinido, de la siguiente manera:

For Variable = NI To NF Step incremento Declaración del lazo
   Actividad repetitiva Actividad
Next Declaración del lazo

El paso incremento debe se un entero positivo o negativo.

Ejemplos del bucle For Next en VBA

Tomemos el ejemplo de una actividad muy común cuando hacemos un programa en VBA: encontrar la última celda ocupada en un rango determinado. Si queremos encontrar el número de la última fila cuya celda está ocupada podemos usar un condicional que evalúe si la celda está vacía, y en caso de ser negativo, avanzar hasta la próxima fila.

En el siguiente ejemplo podemos observar que existen varios nombres escritos en la columna A, siendo el último nombre "Ana", ubicado en la fila 6. De esta manera, si nuestra función es correcta, debe poder identificar que la fila 6 contiene la última celda ocupada.

Sub Tutorial5a_Loops()
For i = 1 To 10
  If Cells(i + 1, 1) = "" Then
    Ultima_fila = i 
    Exit For
  End If
Next
MsgBox ("Ultima fila: " & Ultima_fila)
End Sub

VBA ofrece distintos métodos para referirnos a las celdas y rangos, en este caso elegimos la opción de manejarla como elemento de una matriz bajo la forma Cells(i+1,1). Como inicialmente el valor de i=1, la evaluación de celda vacía en un principio se hace sobre el elemento Cells(2,1), que equivale a la celda “A2”. Luego cuando el programa llega a la instrucción Next, la variable i pasa a ser igual a 2 (debido a que el paso o incremento "Step" lo definimos como 1), evaluando entonces el elemento Cells(3,1) que equivale a “A3”. La rutina del ejemplo está diseñada para que la evaluación se repita hasta que i=10. Sin embargo, cuando i=6 el programa detecta que la fila i+1 ( “A7” ) está vacía y sale del lazo.

Estructura Do Loop

La traducción literal es hacer (Do) el lazo (Loop). Esta estructura no cuenta con la particularidad de la forma For Next de aumentar automáticamente la variable entera que mide el número de repeticiones, pero sí nos ofrece 3 modalidades que nos dan un amplio espectro de alcance:

Modalidad fundamental: Do

Bajo esta forma, sólo debemos declarar la estructura y especificar bajo que condición saldremos del lazo; es una especie de lazo infinito, por ello debemos manejarla con cuidado si no queremos colgar nuestro computador 🙂

Do Declaración del lazo
   Actividad repetitiva Actividad
   Variable=Variable+1 Control del numero de repetición
Loop Declaración del lazo

Ejemplos del bucle Do Loop en VBA

Para el ejemplo anterior de la última fila ocupada en una hoja de Excel, la estructura Do podría emplearse de la siguiente manera:

Figura 3. Ejemplo estructura Do.
Sub Tutorial5b_Loops()
i = 2
Do
  If Cells(i, 1) = "" Then
    Ultima_fila = i - 1
    Exit Do
  End If
  i = i + 1
Loop
MsgBox ("Ultima fila: " & Ultima_fila)
End Sub

Modalidad Do While

La diferencia de esta forma con respecto a la anterior es que en ella se declara una instrucción adicional: While, que significa que el lazo o Loop se hará mientras se cumpla con una condición que declares dentro de la misma estructura:

Do While Condición Declaración del lazo
   Actividad repetitiva Actividad
   Variable=Variable+1 Control del numero de repetición
Loop Declaración del lazo

Ejemplos de Do While en VBA

El ejemplo que venimos desarrollando podría definirse de la siguiente manera:

Figura 4. Estructura Do While.
Sub Tutorial5c_Loops()
i = 2
Do While Cells(i, 1) <> ""
  'Actividad repetitiva
  i = i + 1
Loop
Ultima_fila = i - 1
MsgBox ("Ultima fila: " & Ultima_fila)
End Sub

En este caso la instrucción Do While se ejecutará mientras las celdas de la columna A no estén vacías (<>""); al aparecer la primera celda vacía el lazo se romperá.

Modalidad Do Until

Esta es muy similar a la modalidad anterior, con la diferencia de que este lazo se ejecutará hasta que una condición pre-establecida se cumpla. Tiene las mismas ventajas, bondades y limitaciones que la modalidad Do While, sólo que se hace un enfoque diferente a la condición que se desea cumplir. El esquema de esta instrucción es el siguiente:

Do Until Condición Declaración del lazo
   Actividad repetitiva Actividad
   Variable=Variable+1 Control del numero de repetición
Loop Declaración del lazo

Ejemplos de Do Until en VBA

En nuestro ejemplo, la instrucción Do Until podría ser adaptada de la siguiente manera:

Figura 5. Ejemplo estructura Do Until.
Sub Tutorial5c_Loops()
i = 2
Do Until Cells(i, 1) = ""
  'Actividad repetitiva
  i = i + 1
Loop
Ultima_fila = i - 1
MsgBox ("Ultima fila: " & Ultima_fila)
End Sub

Como puedes observar, el lazo se ejecutará hasta que se encuentre la primera celda vacía.

Con lo que hemos aprendido en este tutorial podrás usar sin dificultad cualquiera de las estructuras de lazos. Nuestra recomendación es evitar en lo posible la modalidad fundamental Do por las implicaciones que ella puede tener. En su lugar puedes usar las intrucciones For Next, Do While o Do Until.

 

Quieres saber más? Contáctanos...

Loops o Bucles en VBA

También te puede interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *