VBA – Ejemplos de For Each (Referencia Rápida)
In this Article
Este tutorial le mostrará ejemplos de uso del bucle For Each en VBA. Haga clic aquí para aprender más sobre los bucles en general.
Bucle For Each
El bucle For Each le permite recorrer cada objeto de una colección:
- Todas las celdas de un rango
- Todas las hojas de trabajo de un libro
- Todos los libros de trabajo abiertos
- Todas las formas de una hoja de trabajo
- Todos los elementos de una matriz
- y mucho más
For Each: Ejemplos Básicos
Estos ejemplos demostrarán cómo configurar los bucles For Each para recorrer diferentes tipos de objetos.
Bucle A Través de Celdas
Este procedimiento recorrerá cada celda del rango A1:A10, haciendo que la celda de la derecha sea igual a sí misma.
Sub ForEachCelda()
Dim Cell As Range
For Each Cell In Sheets("Hoja1").Range("A1:A10")
Cell.Offset(0, 1).value = Cell.value
Next Cell
End Sub
Bucle A Través de Hojas
Este procedimiento recorre cada una de las hojas de un Libro de Trabajo, desocultando cada una de ellas.
Sub ForEachHojas()
Dim ws As Worksheet
For Each ws in Sheets
ws.Visible = True
Next ws
End Sub
Bucle A Través de Libros de Trabajo
Este procedimiento recorrerá cada Libro de Trabajo, cerrando cada uno de ellos.
Sub ForEachWorkbooks()
Dim wb As Workbook
For Each wb in Workbooks
wb.Close
Next wb
End Sub
Bucle A Travpes de Formas
Este procedimiento recorrerá cada una de las formas de la Hoja1, borrando cada una de ellas.
Sub ForEachForma()
Dim Shp As Shape
For Each Shp In Sheets("Hoja1").Shapes
Shp.Delete
Next Shp
End Sub
Bucle A Través de Gráficos
Este procedimiento recorrerá cada gráfico de la Hoja1, eliminando cada uno de ellos.
Sub ForEachGrafico()
Dim cht As ChartObject
For Each cht In Sheets("Hoja1").ChartObjects
cht.Delete
Next cht
End Sub
Bucle A Través de Tablas Dinámicas
Este procedimiento recorrerá cada tabla dinámica de la Hoja1, borrando cada una de ellas
Sub ForEachTablaDinamica()
Dim pvt As PivotTable
For Each pvt In Sheets("Hoja1").PivotTables
pvt.ClearTable
Next pvt
End Sub
Bucle A Través de Tablas
Este procedimiento recorrerá cada Tabla de la Hoja1, borrando cada una de ellas.
Sub ForEachTablas()
Dim tbl As ListObject
For Each tbl In Sheets("Hoja1").ListObjects
tbl.Delete
Next tbl
End Sub
Bucle A Través de Elementos de una Matriz
Este procedimiento recorrerá cada elemento de una matriz y mostrará cada valor en un cuadro de texto,
Sub ForEachItemInArray()
Dim arrValue As Variant
Dim elemento As Variant
arrValue = Array("Artículo 1", "Artículo 2", "Artículo 3")
For Each elemento in arrValue
MsgBox elemento
Next elemento
End Sub
Bucle A Través de Números
Este procedimiento recorrerá cada número de una matriz y mostrará cada valor en un cuadro de texto,
Sub ForEachNumberInNumbers()
Dim arrNumber(1 To 3) As Integer
Dim num As Variant
arrNumber(1) = 10
arrNumber(2) = 20
arrNumber(3) = 30
For Each num in arrNumber
Msgbox num
Next num
End Sub
Constructor de Bucles For Each
Los ejemplos en este artículo fueron construidos con el Constructor de Bucles en nuestro Add-in VBA: AutoMacro.
El Generador de Bucles hace que sea muy fácil generar código para hacer bucles a través de objetos. AutoMacro también contiene muchos otros generadores de código, una extensa biblioteca de código y potentes herramientas de codificación.
For Each – If
También puede utilizar las sentencias If dentro de los bucles para comprobar si los objetos cumplen ciertos criterios, realizando sólo acciones en aquellos objetos que cumplen los criterios. Este es un ejemplo de bucle a través de cada celda en un rango:
For Each Celda en Rango – If
Sub Bucle_If()
Dim celda as Range
For Each celda in range("A2:A6")
If celda.Value > 0 Then
celda.Offset(0, 1).Value = "Positivo"
ElseIf celda.Value < 0 Then
celda.Offset(0, 1).Value = "Negativo"
Else
celda.Offset(0, 1).Value = "Cero"
End If
Next celda
End Sub
For Each Ejemplos Comunes
Cerrar Todos los Libros de Trabajo
Este procedimiento cerrará todos los libros de trabajo abiertos, guardando los cambios.
Sub CerrarTodosLibrosDeTrabajo()
Dim wb As Workbook
For Each wb In Workbooks
wb.Close SaveChanges:=True
Next wb
End Sub
Ocultar Todas las Hojas
Este procedimiento ocultará todas las hojas de trabajo.
Sub OcultarTodasLasHojas()
Dim ws As Worksheet
For Each ws In Sheets
ws.Visible = xlSheetHidden
Next ws
End Sub
Mostrar Todas las Hojas
Este procedimiento muestra todas las hojas de trabajo.
Sub MostrarTodasLasHojas()
Dim ws As Worksheet
For Each ws In Sheets
ws.Visible = xlSheetVisible
Next ws
End Sub
Proteger Todas las Hojas
Este procedimiento protegerá todas las hojas de trabajo.
Sub ProtegerTodasLasHojas()
Dim ws As Worksheet
For Each ws in Sheets
ws.Protect Password:="..."
Next ws
End Sub
Desproteger Todas las Hojas
Este procedimiento desprotegerá todas las hojas de trabajo.
Sub DesprotegerTodasLasHojas()
Dim ws As Worksheet
For Each ws in Sheets
ws.Unprotect Password:="..."
Next ws
End Sub
Borrar Todas las Formas en Todas las Hojas
Este procedimiento eliminará todas las formas de un libro de trabajo.
Sub EliminarTodasLasFormasEnTodasLasHojas()
Dim Sheet As Worksheet
Dim Shp As Shape
For Each ws in Sheets
For Each Shp in ws.Shapes
Shp.Delete
Next Shp
Next ws
End Sub
Actualizar Todas las Tablas Dinámicas
Este procedimiento actualizará todas las tablas dinámicas de una hoja.
Sub RefreshAllPivotTables()
Dim pvt As PivotTable
For Each pvt In Sheets("Hoja1").PivotTables
pvt.RefreshTable
Next pvt
End Sub
Uso de For Each en Access VBA
El bucle For Each funciona de la misma manera en Access VBA que en Excel VBA. El siguiente ejemplo eliminará todas las tablas de la base de datos actual.
Sub EliminarTablas()
Dim tdf As TableDef
Dim dbs As Database
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs
DoCmd.DeleteObject tdf.Name
Loop
Set dbs = Nothing
End Sub