Utilizar instrucciones For Each...Next

Microsoft VBA

Utilizar instrucciones For Each...Next

   

Las instrucciones For Each...Next repiten un bloque de instrucciones para cada uno de los objetos de una colección o para cada elemento de una matriz. Visual Basic asigna valor automáticamente a una variable cada vez que se ejecuta el bucle. Por ejemplo, el siguiente procedimiento cierra todos los formularios excepto el que contiene al procedimiento que se está ejecutando.

Sub CierraFormul()
    For Each frm In Application.Forms
        If frm.Caption <> Screen.ActiveForm.Caption Then frm.Close
    Next
End Sub

El siguiente código recorre todos los elementos de una matriz e introduce en cada uno de ellos el valor de la variable índice I.

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

Recorrer un conjunto de celdas

Se puede usar el bucle For Each...Next para recorrer las celdas pertenecientes a un rango determinado. El siguiente procedimiento recorre las celdas del rango A1:D10 de la Página1 y convierte cualquier valor absoluto menor de 0,01 en 0 (cero).

Sub RedondeoACero()
    For Each miObjeto in miColeccion
        If Abs(miObjeto.Value) < 0.01 Then miObjeto.Value = 0
    Next
End Sub

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

Se puede salir de un bucle For Each...Next mediante la instrucción Exit For. Por ejemplo, cuando se produce un error se puede usar la instrucción Exit For en el bloque de instrucciones True de una instrucción If...Then...Else o Select Case que detecte específicamente el error. Si el error no se produce, la instrucción If…Then…Else es False y el bucle se seguirá ejecutando normalmente.

El siguiente ejemplo detecta la primera celda del rango A1:B5 que no contiene un número. Si se encuentra una celda en esas condiciones, se presenta un mensaje en pantalla y Exit For abandona el bucle.

Sub BuscaNumeros()
    For Each miObjeto In MiColeccion
        If IsNumeric(miObjeto.Value) = False Then
            MsgBox "El objeto contiene un valor no numérico."
            Exit For
        End If
    Next c
End Sub