VBA – Ejemplos de For Each (Referencia Rápida)

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on agosto 14, 2022

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.

vba loop builder

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

Bucle If VBA

 

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
vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples