Passa attraverso ogni riga di un intervallo in Excel


116

Questa è una di quelle cose per cui sono sicuro che ci sia una funzione incorporata (e forse me l'hanno già detto in passato), ma mi sto grattando la testa per ricordarmela.

Come faccio a scorrere ogni riga di un intervallo a più colonne utilizzando Excel VBA? Tutti i tutorial che ho cercato sembrano solo menzionare il lavoro attraverso un intervallo unidimensionale ...


Risposte:


150
Dim a As Range, b As Range

Set a = Selection

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

149

Qualcosa come questo:

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

Mi sono appena imbattuto in questo e ho pensato di suggerire la mia soluzione. In genere mi piace usare la funzionalità incorporata per assegnare un intervallo a un array multi-dim (immagino che sia anche il programmatore JS in me).

Scrivo spesso codice come questo:

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'assegnazione di intervalli alle variabili è un modo molto potente per manipolare i dati in VBA.


mi piace di più in questo modo!
athos

2
Due vantaggi principali per favorire: 1) il metodo array è sempre più veloce di loop attraverso una serie, 2)' s semplice e si può utilizzare in entrambe le direzioni e scrivere sul retro matrice dopo alcuni calcoli: Range("A1:D4") = myarray. Nota: Dim myarray come variante; prestare attenzione al fatto che per impostazione predefinita è un array 2dim basato su 1
TM

7

In Loops, preferisco sempre utilizzare la Cellsclasse, utilizzando il metodo di riferimento R1C1, in questo modo:

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

Questo mi consente di eseguire il loop rapidamente e facilmente su un intervallo di celle facilmente:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.