Parcourez chaque ligne d'une plage dans Excel


117

C'est l'une de ces choses pour lesquelles je suis sûr qu'il existe une fonction intégrée (et on me l'a peut-être dit dans le passé), mais je me gratte la tête pour m'en souvenir.

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


Réponses:


151
Dim a As Range, b As Range

Set a = Selection

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

149

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

8

Je suis juste tombé dessus et j'ai pensé que je suggérerais ma solution. J'aime généralement utiliser la fonctionnalité intégrée d'attribution d'une plage à un tableau multi-dim (je suppose que c'est aussi le programmeur JS en moi).

J'écris fréquemment du code comme celui-ci:

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'attribution de plages à des variables est un moyen très puissant de manipuler des données dans VBA.


j'aime mieux cette façon!
athos

2
Deux principaux avantages pour favoriser le: 1) la méthode du tableau est toujours plus rapide que boucle à travers une gamme, 2) il de » la simple et vous pouvez l' utiliser dans les deux sens et écrire le dos du tableau après quelques calculs: Range("A1:D4") = myarray. Remarque: Dim myarray en variante; faites attention au fait qu'il s'agit d'un tableau 2dim basé sur 1 par défaut
TM

7

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

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

Cela me permet de boucler rapidement et facilement 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.