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:
Si ejecutamos ambos procedimientos, el DIRECTO y el INVERSO, veremos...
Comprobamos en las columnas E y F el sendero tomado por uno y otro procedimiento...
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...
Comprobamos en las columnas E y F el sendero tomado por uno y otro procedimiento...
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.