Recorra cada fila de un rango en Excel

116

Esta es una de esas cosas para las que estoy seguro de que hay una función incorporada (y es posible que me lo hayan dicho en el pasado), pero me estoy rascando la cabeza para recordarlo.

¿Cómo recorro cada fila de un rango de varias columnas usando Excel VBA? Todos los tutoriales que he estado buscando parecen solo mencionar el trabajo en un rango unidimensional ...

Margaret
fuente

Respuestas:

150
Dim a As Range, b As Range

Set a = Selection

For Each b In a.Rows
    MsgBox b.Address
Next
Miguel
fuente
149

Algo como esto:

Dim rng As Range
Dim row As Range
Dim cell As Range

Set rng = Range("A1:C2")

For Each row In rng.Rows
  For Each cell in row.Cells
    'Do Something
  Next cell
Next row
David Andres
fuente
8

Simplemente me topé con esto y pensé en sugerir mi solución. Por lo general, me gusta usar la funcionalidad incorporada de asignar un rango a una matriz de múltiples atenuaciones (supongo que también es el programador JS en mí).

Con frecuencia escribo código como este:

Sub arrayBuilder()

myarray = Range("A1:D4")

'unlike most VBA Arrays, this array doesn't need to be declared and will be automatically dimensioned

For i = 1 To UBound(myarray)

    For j = 1 To UBound(myarray, 2)

    Debug.Print (myarray(i, j))

    Next j

Next i

End Sub

Asignar rangos a variables es una forma muy poderosa de manipular datos en VBA.

tc_NYC
fuente
¡Me gusta más esta manera!
athos
2
Dos ventajas principales a lo favorecen: 1) el método de matriz es siempre más rápido que el bucle a través de un rango, 2)' s simple y se puede usar en ambas direcciones y escribir la parte posterior matriz después de algunos cálculos: Range("A1:D4") = myarray. Nota: Dim myarray como variante; preste atención al hecho de que es una matriz 2dim basada en 1 por defecto
TM
7

En Loops, siempre prefiero usar la Cellsclase, usando el método de referencia R1C1, así:

Cells(rr, col).Formula = ...

Esto me permite recorrer rápida y fácilmente un rango de celdas fácilmente:

Dim r As Long
Dim c As Long

c = GetTargetColumn() ' Or you could just set this manually, like: c = 1

With Sheet1 ' <-- You should always qualify a range with a sheet!

    For r = 1 To 10 ' Or 1 To (Ubound(MyListOfStuff) + 1)

        ' Here we're looping over all the cells in rows 1 to 10, in Column "c"
        .Cells(r, c).Value = MyListOfStuff(r)

        '---- or ----

        '...to easily copy from one place to another (even with an offset of rows and columns)
        .Cells(r, c).Value = Sheet2.Cells(r + 3, 17).Value


    Next r

End With
LimaNocheHalcón
fuente