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).
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:
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:
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:
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...