web-dev-qa-db-fra.com

Boucle à travers chaque ligne d'une plage dans Excel

Je suis sûr que cette fonction est intégrée à une de ces fonctions (on me l'a peut-être déjà dit par le passé), mais je me gratte la tête pour m'en souvenir.

Comment puis-je parcourir chaque ligne d'une plage multi-colonnes à l'aide d'Excel VBA? Tous les tutoriels que j'ai recherchés ne semblent que mentionner le fait de travailler dans une plage unidimensionnelle ...

103
Margaret
Dim a As Range, b As Range

Set a = Selection

For Each b In a.Rows
    MsgBox b.Address
Next
139
Mike

Quelque chose comme ça:

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
135
David Andres

Je suis tombé sur ça et j'ai pensé que je proposerais ma solution. En général, j'aime bien utiliser la fonctionnalité intégrée d'attribution d'une plage à un tableau multi-dim (je suppose que c'est également le programmeur JS en moi).

J'écris souvent le code comme ceci:

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

L'affectation de plages à des variables est un moyen très puissant de manipuler des données dans VBA.

7
tc_NYC

Dans Loops, je préfère toujours utiliser la classe Cells, en utilisant la méthode de référence R1C1, comme ceci:

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

Cela me permet de rapidement et facilement boucle sur une Plage de cellules facilement:

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
6
LimaNightHawk