23 abril, 2021

¿CÓMO REALIZAR UN BUCLE EN VBA?

Tras varios post con temas de formulación, hoy me gustaría volver a la programación y abordar varias peticiones que me llegaron como consulta a través de la web.

Estas consultas están relacionadas con los bucles y cómo se construyen en VBA. Me han pedido una explicación sencilla y práctica y con varios tipos de bucles.

Pues empecemos 🙂

Bien, comenzaré por el tipo de bucle que más utilizo, se trata de la instrucción For - Next. Veamos como podemos construir un ejemplo e ir confeccionado nuestro código.

Pongamos que tenemos una columna con una serie de datos, números. Y queremos indicar en la columna de al lado, lo siguiente:

CREAR UN BUCLE EN VBA1

Si los números de la columna "A" son mayores de 5 entonces los multiplicamos por 4 y si son igual o menor a 5 entonces dejamos la misma cifra. Los resultados los grabaremos en la columna "B" (For-Next), así:

CREAR UN BUCLE EN VBA2

Si queremos usar la instrucción For-Next, debemos utilizar una estructura como la siguiente, donde detectamos la longitud del rango que debemos recorrer con ese bucle, declaramos la variable que utilizaremos "i", y por último agregamos la condiciones o sentencia que vayamos a utilizar en el bucle por cada línea ("i") que recorramos.

Os lo explico detenidamente en la misma macro:

Sub FOR_NEXT()
'Definimos una variable para contener la información, yo suelo utilizar double.
Dim i As Double
With Sheets(1)
'Determinamos la longitud del rango de datos por los que vayamos a recorrer el blucle (Fin)
fin = Application.CountA(.Range("A:A"))
'Indicamos que para "i" es igual a 2 (tenemos datos de cabecera) hasta el final.
For i = 2 To fin
'introducimos la condición a aplicar, fijaros que la variable "i" sustituye a la fila, dado que será el proceso quien recorrerá el rango y quien determinará la siguiente fila.
If .Cells(i, 1) > 5 Then .Cells(i, 2) = .Cells(i, 1) * 4
If .Cells(i, 1) <= 5 Then .Cells(i, 2) = .Cells(i, 1)
'Una vez que pasamos la fila 2, la instrucción Next obliga a seguir con la siguiente i (fila).
Next
End With
End Sub

Esta es una forma muy sencilla de realizar esta instrucción, se podría complicar mucho más, es decir introducir otro bucle dentro del bucle principal, o varios! Pero esta explicación creo que basta para nuestro propósitos.

Existe otro tipo de instrucción que podemos utilizar y que también genera un bucle. Me refiero a las instrucciones Do - While o Do-Until, que vienen a ser "hacer mientras" y "hacer hasta". Efeectivamente, en ambos casos lo que hacemos es dar la orden de realizar cierta tarea mientras se de una determinada condición o hasta un determinado punto.

Siguiendo el ejemplo que tenemos, vamos a suponer que queremos hacer lo mismo, pero usando Do-While, para ello necesitamos el siguiente código y estructura:

Sub DO_WHILE()
Dim i As Double
'Definimos la variable para recorrer el bucle
With Sheets(1)
'Indicamos que el contador inicia en la segunda fila (tenemos datos de cabecera).
i = 2
'Indicamos que la condición se haga mientras en la columna 1 existan datos, es decir, sea distinto de vacío <> empty
Do While .Cells(i, 1) <> Empty
If .Cells(i, 1) > 5 Then .Cells(i, 3) = .Cells(i, 1) * 4
If .Cells(i, 1) <= 5 Then .Cells(i, 3) = .Cells(i, 1)
i = i + 1
'Una vez que pasamos la línea dos, incrementamos en +1 la línea a recorrer y luego repetimos el proceso (loop)
Loop
End With
End Sub

Este proceso ofrece el mismo resultado que el bucle for-next, exactamente el mismo. También se podría utilizar DO-UNTIL, es prácticamente igual al anterior (los cambios en rojo).

Sub DO_UNTIL()
Dim i As Double
With Sheets(1)
i = 2
Do Until .Cells(i, 1) = Empty
' Tan solo hay que decir que realice la condición hasta que el rango que recorre no tenga datos, es decir, sea "Empty"
If .Cells(i, 1) > 5 Then .Cells(i, 4) = .Cells(i, 1) * 4
If .Cells(i, 1) <= 5 Then .Cells(i, 4) = .Cells(i, 1)
i = i + 1
Loop
End With
End Sub

Para finalizar os dejo la posibilidad de trabajar adicionalemente con una variable booleana (nos devuelve verdadero o falso) y que vamos a llamar bData y declararla como Boolean.

Sub DO_WHILE_BOOLEANA()
Dim i As Double
'Creamos una variable Boolean (bData)
Dim bData As Boolean
With Sheets(1)
i = 2
Do While .Cells(i, 1) <> Empty
'Definimos la variable en verdadero
bData = (.Cells(i, 1) > 5)
'La incorporamos a la condición reduciendo así el código
If bData Then .Cells(i, 5) = .Cells(i, 1) * 4
If Not bData Then .Cells(i, 5) = .Cells(i, 1)
i = i + 1
Loop
End With
End Sub

Ahora os muestro el archivo después de haber aplicado las cuatro macros, como podéis observar el resultado es el mismo en todos los casos:

CREAR UN BUCLE EN VBA

Y estos son algunos ejemplos de cómo podéis montar un bucle utilizando varias instrucciones. En mi caso particular suelo utilizar muy a menudo la instrucción For-Next, pero cualquier alternativa será válida siempre que los datos y su disposición así lo permita.

Espero que os sirva de ayuda este pequeño tutorial, son ejemplos muy prácticos y sencillos de aplicar 🙂

Descarga el archivo de ejemplo pulsando en: ¿CÓMO REALIZAR UN BUCLE EN VBA?

Comparte este post

4 comentario en “¿CÓMO REALIZAR UN BUCLE EN VBA?

  1. Muchas gracias por la explicación. Tengo años tratando de entender los bucles de VBA y con tu ejemplo ha sido la mejor forma de entenderlos. Muchisimas gracias!

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies