Przechodź w pętli przez każdy wiersz zakresu w programie Excel

116

Jest to jedna z tych rzeczy, do których jestem pewien, że istnieje wbudowana funkcja (i być może mi to powiedziano w przeszłości), ale drapię się po głowie, aby to zapamiętać.

Jak przejść przez każdy wiersz zakresu wielokolumnowego za pomocą Excel VBA? Wszystkie samouczki, które przeszukiwałem, zdają się tylko wspominać o pracy z jednowymiarowym zakresem ...

Małgorzata
źródło

Odpowiedzi:

150
Dim a As Range, b As Range

Set a = Selection

For Each b In a.Rows
    MsgBox b.Address
Next
Mikrofon
źródło
149

Coś takiego:

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
źródło
8

Natknąłem się na to i pomyślałem, że zasugeruję swoje rozwiązanie. Zwykle lubię korzystać z wbudowanej funkcji przypisywania zakresu do tablicy o wielu przyciemnieniach (myślę, że jest to również programista JS we mnie).

Często piszę taki kod:

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

Przypisywanie zakresów do zmiennych to bardzo skuteczny sposób manipulowania danymi w języku VBA.

tc_NYC
źródło
podoba mi się ten sposób najbardziej!
athos
2
Dwie główne zalety, aby go faworyzować: 1) metoda tablica jest zawsze szybszy niż zapętlenie poprzez szereg, 2) nie jest to prosty i można go używać w obu kierunkach i pisać z tyłu tablicy po pewnych obliczeń: Range("A1:D4") = myarray. Uwaga: Dim myarray jako wariant; zwróć uwagę na fakt, że jest to domyślnie tablica 2dim oparta na 1
TM
7

W pętlach zawsze wolę używać Cellsklasy, używając metody referencyjnej R1C1, na przykład:

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

To pozwala mi szybko i łatwo pętli nad zakresem komórek w prosty sposób:

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
LimaNightHawk
źródło