jueves, 5 de octubre de 2017

VBA: Un bucle FOR EACH inverso.

Todos conocemos el parámetro Step dentro de un bucle FOR...NEXT, con el que podemos controlar el sentido del recorrido al definirlo con un -1:
For x=10 to 1 Step -1
'nuestro código
Next c


Pero, ¿qué ocurre si nuestro bucle es un FOR EACH...NEXT???
Tenemos un problema ya que este bucle no admite el parámetro de salto o sentido Step... obligándonos el proceso a recorrer nuestro rango siempre en el mismo sentido de izquierda a derecha y de arriba abajo...
Nuestra meta: Recorrer el rango de derecha a izquierda y de abajo hacia arriba.


Para solucionar nuestro problema convertiremos nuestro bucle FOR EACH ...NEXT en un bucle FOR...NEXT, y para conseguir el recorrido inverso deseado usaremos la propiedad .Item del objeto Range.
Esta propiedad nos permite reconocer cada celda de un rango definido con un número índice único.


Veamos el efecto en los siguientes procedimientos:

Sub ForEach_INVERSO()
Dim lng As Long, x As Long
Dim rng As Range

'definimos el rango de estudio
Set rng = Range("A1:C5")
x = 0
For lng = rng.Cells.Count To 1 Step -1
    'rng(lng) es una forma abreviada para representar rng.Item(lng)
    'si el valor de la celda es par...
    If rng(lng).Value Mod 2 = 0 Then
        rng(lng).Interior.Color = vbRed
        'trasladamos la dirección a la columna E
        Cells(1 + x, "E").Value = rng(lng).Address
        x = x + 1
    End If
Next lng
End Sub
''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''
Sub ForEach_DIRECTO()
Dim lng As Long, x As Long
Dim rng As Range

'definimos el rango de estudio
Set rng = Range("A1:C5")
x = 0
For Each celda In rng
    'rng(lng) es una forma abreviada para rng.item(lng)
    'si el valor de la celda es par...
    If celda.Value Mod 2 = 0 Then
        celda.Interior.Color = vbRed
        'trasladamos la dirección a la columna F
        Cells(1 + x, "F").Value = celda.Address
        x = x + 1
    End If
Next celda
End Sub



Si ejecutamos ambos procedimientos, el DIRECTO y el INVERSO, veremos...

VBA: Un bucle FOR EACH inverso.



Comprobamos en las columnas E y F el sendero tomado por uno y otro procedimiento...

No hay comentarios:

Publicar un comentario