Bucles VBA de Excel: Para Cada Uno, Para el Siguiente, Para Hacer Mientras, Anidados y Más
Para trabajar de manera efectiva en VBA, debe comprender los Bucles.
Bucles permiten repetir un bloque de código un número determinado de veces o repetir un bloque de código en cada objeto de un conjunto de objetos.
Primero le mostraremos algunos ejemplos para mostrarle de qué son capaces los bucles. Luego le enseñaremos todo sobre los bucles.
Ejemplos rápidos de bucle VBA
Para cada bucle
Para Cada bucle recorre cada objeto de una colección, como cada hoja de trabajo en el libro de trabajo o cada celda de un rango.
Bucle a Través de todas las Hojas del Libro
Este código creará un bucle a través de todas las hojas del libro, mostrar cada hoja:
1
2
3
4
5
6
7
8
|
Sub LoopThroughSheets()
Dim ws Como Hoja de cálculo
Para Cada ws En Hojas de cálculo
lr.Visible = True
Next
End Sub
|
Bucle a través de todas las celdas en el rango
Este código recorrerá un rango de celdas, probando si el valor de la celda es negativo, positivo o cero:
Para Bucles siguientes
Otro tipo de bucle «For» es el Bucle Siguiente Para. El bucle For Next le permite recorrer enteros en bucle.
Este código recorrerá los enteros del 1 al 10, mostrando cada uno con un cuadro de mensaje:
1
2
3
4
5
6
|
Sub ForLoop()
Dim i as Integer
For i = 1 To 10
MsgBox i
me
End Sub
|
¿Bucles while
Hacer Bucles while bucle mientras la condición se cumple. Este código también recorrerá los enteros del 1 al 10, mostrando cada uno con un cuadro de mensaje.
1
2
3
4
5
6
7
8
|
Sub DoWhileLoop()
Dim n as Integer
n = 1
Do while n < 11
MsgBox n
n = n + 1
Loop
End Sub
|
¿Hasta Bucles
por el Contrario, Hacer Hasta que los bucles se hagan hasta que se cumpla una condición. Este código hace lo mismo que los dos ejemplos anteriores.
1
2
3
4
5
6
7
8
|
Sub DoUntilLoop()
Dim n as Integer
n = 1
de Vuelta Hasta el n >= 10
MsgBox n
n = n + 1
Loop
End Sub
|
vamos a hablar de esto más adelante, pero debes tener mucho cuidado al crear bucles Do While o Do Until para que no crees un bucle interminable.
Constructor de bucles VBA
Esta es una captura de pantalla del «Constructor de bucles» de nuestro complemento VBA Premium: AutoMacro. El Generador de bucles le permite crear bucles de forma rápida y sencilla para recorrer diferentes objetos o números. Puede realizar acciones en cada objeto o seleccionar solo objetos que cumplan ciertos criterios.
El complemento también contiene muchos otros creadores de código, una extensa biblioteca de código VBA y una variedad de herramientas de codificación. Es imprescindible para cualquier desarrollador de VBA.
Ahora cubriremos los diferentes tipos de bucles en profundidad.
VBA Para el Siguiente Bucle
Bucle For Sintaxis
El Siguiente Bucle le permite repetir un bloque de código un número determinado de veces. La sintaxis es:
1
2
3
4
5
|
For Counter = Start to End
Next
|
Where the items in brackets are optional.
- – Declares the counter variable. Required if Option Explicit is declared at the top of your module.Contador
- – Una variable entera utilizada para contar
- Start-El valor de inicio (Ej. 1)
- End-El valor final (Ej. 10)
- – Le permite contar cada n enteros en lugar de cada 1 entero. También puede ir en sentido inverso con un valor negativo (ej. Paso -1)
- – El código que repetirá
- Siguiente-Declaración de cierre al bucle For Next. Puede incluir el Mostrador o no. Sin embargo, recomiendo encarecidamente incluir el contador, ya que hace que su código sea más fácil de leer.
Si eso es confuso, no te preocupes. Repasaremos algunos ejemplos:
Cuenta hasta 10
Este código contará hasta 10 usando un bucle For-Next:
1
2
3
4
5
6
7
8
|
Sub ForEach_CountTo10()
Dim n as Integer
Para n = 1 A 10
MsgBox n
Siguiente n
End Sub
|
Para el Paso del Bucle
Número 10 – Sólo Números
Este el código contará hasta 10 solo contando números pares:
1
2
3
4
5
6
7
8
|
Sub ForEach_CountTo10_Even()
Dim n as Integer
Para n = 2 A 10 Paso 2
MsgBox n
Siguiente n
End Sub
|
Observe que hemos añadido el «Paso 2». Esto le dice al Bucle For que «pase» por el contador en 2. También podemos usar un valor de paso negativo para avanzar en reversa:
Para Paso de bucle Inverso
Cuenta atrás desde 10
Este código contará desde 10:
1
2
3
4
5
6
7
8
9
|
Sub ForEach_Countdown_Inverse()
Dim n as Integer
Para n = 10 A 1 Paso -1
MsgBox n
Siguiente n
MsgBox «Lift Off»
End Sub
|
Eliminar Filas si la celda está en blanco
He utilizado con mayor frecuencia un paso negativo For-Loop para recorrer rangos de celdas, eliminando filas que cumplen con ciertos criterios. Si hace un bucle de las filas superiores a las filas inferiores, al eliminar filas, arruinará su contador.
Este ejemplo eliminará filas con celdas en blanco (comenzando desde la fila inferior):
Anidado Para Bucle
Puede «anidar» uno Para Bucle dentro de otro Para Bucle. Usaremos Bucles Anidados para crear una tabla de multiplicar:
1
2
3
4
5
6
7
8
9
10
11
|
Sub Nested_ForEach_MultiplicationTable()
Dim fila as Integer, col as Integer
Para la fila = 1 A 9
Para col = 1 A 9
las Células(fila + 1, col + 1).Valor = fila * col
Siguiente col
Siguiente fila
End Sub
|
Salida
La instrucción Exit For nos permite salir de una Para el Próximo ciclo de inmediato.
Normalmente usaría Exit For junto con una instrucción If, saliendo del bucle For Siguiente si se cumple una determinada condición.
Por ejemplo, puede usar un bucle For para encontrar una celda. Una vez que se encuentre esa celda, puede salir del bucle para acelerar su código.
Este código recorrerá las filas 1 a 1000, buscando «error» en la columna A. Si se encuentra, el código seleccionará la celda, le alertará del error encontrado y saldrá del bucle:
Importante: En el caso de Bucles For Anidados, Exit For solo sale del Bucle For actual, no de todos los Bucles activos.
Continuar Para
VBA no tiene el comando «Continuar» que se encuentra en Visual Basic. En su lugar, tendrá que usar «Exit».
VBA Para Cada Bucle
El VBA Para Cada Bucle para recorrer todos los objetos de una colección:
- Todas las celdas de un rango
- Todas las hojas de cálculo en un libro
- Todas las formas en una hoja de cálculo
- Todos los libros abiertos
también puede utilizar Anidada Para Cada uno de los Bucles:
- Todas las celdas de un rango en todas las hojas de trabajo
- Todas las formas en todas las hojas de trabajo
- Todas las hojas de todos los libros abiertos
- y así sucesivamente…
La sintaxis es:
1
2
3
|
For Each Object in Collection
Next
|
Where:
For Each Cell in Range
This code will loop through each cell in a range:
For Each Worksheet in Workbook
This code will loop through all worksheets in a workbook, unprotecting each sheet:
1
2
3
4
5
6
7
8
9
|
Sub ForEachSheet_inWorkbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Desproteger «contraseña»
Siguiente ws
End Sub
|
Para Abrir Cada Libro
Este código, guardar y cerrar todos los libros abiertos:
1
2
3
4
5
6
7
8
9
|
Sub ForEachWB_inWorkbooks()
Dim bm Como Libro
Para Cada wb En Libros
wb.Cerca De SaveChanges:=True
Siguiente wb
End Sub
|
Para Cada Forma de Hoja de cálculo
Este código va a eliminar todas las formas de la hoja activa.
1
2
3
4
5
6
7
8
9
|
Sub ForEachShape()
Dim shp Como Forma
Para Cada shp En ActiveSheet.Formas
shp.Eliminar
Siguiente shp
End Sub
|
Para Cada Forma en Cada Hoja de cálculo en el Libro
también Se pueden anidar Para Cada uno de los Bucles. Aquí vamos a recorrer todas formas en todas las hojas del libro activo:
1
2
3
4
5
6
7
8
9
10
11
|
Sub ForEachShape_inAllWorksheets()
Dim shp Como la Forma, el lr, de la Hoja de cálculo
Para Cada ws En Hojas de cálculo
Para Cada shp En ws.Formas
shp.Eliminar
Siguiente shp
Siguiente ws
End Sub
|
Para Cada uno – SI Loop
Como hemos mencionado antes, puede utilizar una sentencia If dentro de un bucle, la realización de acciones sólo si se cumplen ciertos criterios.
Este código ocultará todas las filas en blanco en un rango:
Bucle VBA Hacer mientras
El bucle VBA Hacer mientras y Hacer Hasta (consulte la siguiente sección) son muy similares. Repetirán un bucle mientras (o hasta) que se cumpla una condición.
El bucle Do While repetirá un bucle mientras se cumple una condición.
Aquí es el Hacer, Mientras que la Sintaxis:
1
2
3
|
Do while Condición
Loop
|
Donde:
- Condición – que La condición de prueba
- – El bloque de código a repetir
también puede configurar un bucle Do while con la Condición al final del bucle:
1
2
3
|
Do
Loop While Condition
|
We will demo each one and show how they differ:
Do While
Here is the Do While loop example we demonstrated previously:
1
2
3
4
5
6
7
8
|
Sub DoWhileLoop()
Dim n as Integer
n = 1
Do while n < 11
MsgBox n
n = n + 1
Loop
End Sub
|
Bucle while
Ahora vamos a ejecutar el mismo procedimiento, excepto que vamos a mover la condición al final del bucle:
1
2
3
4
5
6
7
8
|
Sub DoLoopWhile()
Dim n as Integer
n = 1
Atrás
MsgBox n
n = n + 1
Bucle while n < 11
End Sub
|
VBA Bucle Do Until
de Regreso Hasta Los bucles repetirán un bucle hasta que se cumpla una determinada condición. La sintaxis es esencialmente la misma que la de Hacer bucles while:
1
2
3
|
Do Until Condición
Loop
|
y, de igual modo que la condición puede ir al inicio o al final del bucle:
1
2
3
|
Do
Loop Until Condition
|
Do Until
This do Until loop will count to 10, like our previous examples
1
2
3
4
5
6
7
8
|
Sub DoUntilLoop()
Dim n as Integer
n = 1
de Vuelta Hasta el n > 10
MsgBox n
n = n + 1
Loop
End Sub
|
Bucle Hasta
Este Bucle Hasta que el ciclo se contar hasta 10:
1
2
3
4
5
6
7
8
|
Sub DoLoopUntil()
Dim n as Integer
n = 1
Atrás
MsgBox n
n = n + 1
Bucle Hasta que n > 10
End Sub
|
Salir del Bucle Do
Similar a la utilización de Salida Para salir de un Bucle For, utilice el comando Exit Do para salir de un Bucle Do inmediatamente
1
|
Exit Do
|
este es un ejemplo de la Salida que Hacer:
Final o Romper el Bucle
Como hemos mencionado anteriormente, puede utilizar la Salida o Exit Do para salir de los bucles:
1
|
Exit For
|
1
|
Exit Do
|
However, these commands must be added to your code before you run tu bucle.
Si está intentando «romper» un bucle que se está ejecutando actualmente, puede intentar presionar ESC o CTRL + Pausa en el teclado. Sin embargo, esto puede no funcionar. Si no funciona, tendrá que esperar a que finalice el bucle o, en el caso de un bucle sin fin, usar CTRL + ALT + Supr para forzar el cierre de Excel.
Esta es la razón por la que intento evitar Hacer bucles, es más fácil crear accidentalmente un bucle sin fin que lo obligue a reiniciar Excel, lo que podría perder su trabajo.
Más ejemplos de bucle
Bucle a través de filas
Esto recorrerá todas las filas de una columna:
Loop A través de columnas
Esto loop a través de todas las columnas en una fila:
Loop a través de archivos en una carpeta
Este código loop a través de todos los archivos en una carpeta, creando una lista:
Loop a través de Array
Este código loop a través de la matriz ‘arrList’:
1
2
3
|
For i = LBound(arrList) To UBound(arrList)
MsgBox arrList(i)
me
|
La función LBound obtiene el «límite inferior» de la matriz y UBound obtiene el «límite superior».
Bucles en Access VBA
La mayoría de los ejemplos anteriores también funcionarán en Access VBA. Sin embargo, en Access, recorremos el Objeto Conjunto de registros en lugar del Objeto Rango.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Sub LoopThroughRecords()
On Error Resume Next
Dim dbs Como Base de datos
Dim primera Como el conjunto de registros
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(«tblClients», dbOpenDynaset)
With rst
.MoveLast
.MoveFirst
Do Until .EOF = True
MsgBox (rst.Fields(«ClientName»))
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub
|