Durchlaufen Sie jede Zeile eines Bereichs in Excel

116

Dies ist eines der Dinge, für die es sicher eine integrierte Funktion gibt (und die mir vielleicht schon in der Vergangenheit gesagt wurde), aber ich kratzte mir am Kopf, um mich daran zu erinnern.

Wie durchlaufe ich mit Excel VBA jede Zeile eines mehrspaltigen Bereichs? Alle Tutorials, die ich gesucht habe, scheinen nur die Arbeit in einem eindimensionalen Bereich zu erwähnen ...

Margaret
quelle

Antworten:

150
Dim a As Range, b As Range

Set a = Selection

For Each b In a.Rows
    MsgBox b.Address
Next
Mike
quelle
149

Etwas wie das:

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
quelle
8

Ich bin nur darauf gestoßen und dachte, ich würde meine Lösung vorschlagen. Normalerweise verwende ich gerne die integrierte Funktionalität zum Zuweisen eines Bereichs zu einem Multi-Dim-Array (ich denke, es ist auch der JS-Programmierer in mir).

Ich schreibe häufig Code wie folgt:

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

Das Zuweisen von Bereichen zu Variablen ist eine sehr leistungsstarke Methode zum Bearbeiten von Daten in VBA.

tc_NYC
quelle
Ich mag diesen Weg am liebsten!
Athos
2
Zwei Hauptvorteile, die es begünstigen: 1) Die Array-Methode ist immer schneller als das Durchlaufen eines Bereichs. 2) Sie ist einfach und Sie können sie in beide Richtungen verwenden und das Array nach einigen Berechnungen zurückschreiben : Range("A1:D4") = myarray. Hinweis: Dim myarray als Variante; Achten Sie darauf, dass es sich standardmäßig um ein 1- basiertes 2dim-Array handelt
TM
7

In Schleifen bevorzuge ich es immer, die CellsKlasse mit der R1C1-Referenzmethode wie folgt zu verwenden:

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

Dies ermöglicht es mir, schnell und einfach Schleife über einen Bereich von Zellen leicht:

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
quelle