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.
Sub SetArrayValue()
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
End Sub
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.
Cree un módulo de clase en el VBE (Editor de Visual Basic) y cámbiele el nombre a CustomCollection.cc1
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
Exporte este módulo a un archivo y almacénelo de manera local.cc2
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
En el editor de texto, quite el carácter
'
de la primera línea debajo del textoProperty Get NewEnum() As IUnknown
en el archivo. Guarde el archivo modificado.En el VBE, quite la clase que creó de su proyecto de VBA y no lo exporte cuando se le solicite.cc3
Importe el archivo del que quitó el carácter
'
nuevamente al VBE.cc4Ejecute 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.