Usar instrucciones For Each…Next

Las instrucciones For Each...Next repiten un bloque de instrucciones en cada objeto de una colección o en cada elemento de una matriz. Visual Basic establece automáticamente una variable cada vez que se ejecuta el bucle. Por ejemplo, el siguiente procedimiento agrega 10 al valor de cada celda del rango A1 a A10.

Sub Add10ToAllCellsInRange()
    Dim rng As Range
    For Each rng In Range("A1:A10")
        rng.Value = rng.Value + 10
    Next
End Sub

El siguiente código recorre los elementos de una matriz y establece el valor de cada uno en el valor de la variable de índice I.

Dim TestArray(10) As Integer, I As Variant 
For Each I In TestArray 
 TestArray(I) = I 
Next I 

Recorrer un rango de celdas

Use un bucle For Each...Next para recorrer las celdas de un rango. El siguiente procedimiento recorre el rango A1:D10 en Hoja1 y establece cualquier número cuyo valor absoluto sea menor que un intervalo de 0,01 a 0 (cero).

Sub RoundToZero() 
 For Each rng in Range("A1:D10") 
 If Abs(rng.Value) < 0.01 Then rng.Value = 0 
 Next 
End Sub

Salir de un bucle For Each...Next antes de que acabe

Puede salir de un bucle For Each...Next con la instrucción Exit For. Por ejemplo, cuando se produce un error, use la instrucción Exit For en el bloque de instrucciones True de una instrucción If...Then...Else o bien de una instrucción Select Case que busque específicamente el error. Si el error no se produce, la instrucción If…Then…Else tiene el valor False y el bucle continúa ejecutándose según lo esperado.

En el siguiente ejemplo se realiza una prueba de la primera celda del rango A1:B5 que no contiene un número. Si se encuentra esa celda, se muestra un mensaje y Exit For sale del bucle.

Sub TestForNumbers() 
 For Each rng In Range("A1:B5") 
  If IsNumeric(rng.Value) = False Then 
   MsgBox "Cell " & rng.Address & " contains a non-numeric value." 
   Exit For 
  End If 
 Next rng 
End Sub

Usar un bucle For Each…Next para procesar una iteración en una clase VBA

Para cada... Los bucles siguientes no solo recorren en iteración matrices e instancias del objeto Collection . Los bucles For Each...Next también pueden procesar iteraciones en una clase VBA que usted haya escrito.

A continuación, encontrará un ejemplo que muestra cómo hacerlo.

  1. Cree un módulo de clase en el VBE (Editor de Visual Basic) y cámbiele el nombre a CustomCollection.cc1

  2. Agregue el siguiente código al módulo recién creado.

    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  3. Exporte este módulo a un archivo y almacénelo de manera local.cc2

  4. Después de exportar el módulo, abra el archivo exportado con un editor de texto (el Bloc de notas de Windows debería ser suficiente). El contenido del archivo debería parecerse a lo siguiente.

    VERSION 1.0 CLASS
    BEGIN
    MultiUse = -1  'True
    END
    Attribute VB_Name = "CustomCollection"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = False
    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  5. En el editor de texto, quite el carácter ' de la primera línea debajo del texto Property Get NewEnum() As IUnknown en el archivo. Guarde el archivo modificado.

  6. En el VBE, quite la clase que creó de su proyecto de VBA y no lo exporte cuando se le solicite.cc3

  7. Importe el archivo del que quitó el carácter ' nuevamente al VBE.cc4

  8. Ejecute el siguiente código para verificar que ahora puede procesar la iteración de la clase VBA personalizada que escribió mediante un editor de texto y VBE.

    Dim Element
    Dim MyCustomCollection As New CustomCollection
    For Each Element In MyCustomCollection
    MsgBox Element
    Next
    
Notas al pie Descripción
[cc1] Elija Módulo de clase en el menú Insertar para crear un módulo de clase. Para cambiar el nombre de un módulo de clase, modifique sus propiedades en la ventana Propiedades.
[cc2] Para activar el cuadro de diálogo Exportar archivo, elija Exportar archivo en el menú Archivo.
[cc3] Para quitar un módulo de clase de VBE, elija Quitar elemento en el menú Archivo.
[cc4] Para importar un archivo de módulo de clase externo, active el cuadro de diálogo Importar archivo (elija Importar archivo en el menú Archivo).

Vea también

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.