Loop através de cada linha de um intervalo no Excel


116

Essa é uma daquelas coisas para as quais tenho certeza de que há uma função incorporada (e posso muito bem ter ouvido isso no passado), mas estou coçando a cabeça para lembrar.

Como faço um loop em cada linha de um intervalo de várias colunas usando o Excel VBA? Todos os tutoriais que tenho pesquisado parecem apenas mencionar o trabalho através de uma gama unidimensional ...


Respostas:


150
Dim a As Range, b As Range

Set a = Selection

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

149

Algo assim:

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

Apenas tropecei nisso e pensei em sugerir minha solução. Eu normalmente gosto de usar a funcionalidade interna de atribuir um intervalo a uma matriz multi-dim (acho que também é o programador JS em mim).

Frequentemente escrevo códigos como este:

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

Atribuir intervalos a variáveis ​​é uma maneira muito poderosa de manipular dados no VBA.


eu gosto mais desse jeito!
athos

2
Duas principais vantagens para favorecê-lo: 1) o método de matriz é sempre mais rápido do que um loop através de um intervalo, 2) é simples e você pode usá-lo em ambas as direções e escrever a parte de trás matriz após alguns cálculos: Range("A1:D4") = myarray. Nota: Dim myarray como variante; preste atenção ao fato de que é um array 2dim baseado em 1 por padrão
TM

7

Em Loops, prefiro sempre usar a Cellsclasse, usando o método de referência R1C1, assim:

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

Isso me permite fazer um loop rápido e fácil em um intervalo de células:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.