Проведіть цикл через кожен рядок діапазону в Excel


116

Це одна з тих речей, про які я впевнений, що є вбудована функція (і я, можливо, про це вже говорив раніше), але я чухаю голову, щоб пам'ятати про це.

Як я проходжу цикл через кожен рядок діапазону багато стовпців за допомогою Excel VBA? Усі підручники, які я шукав, здаються лише згадками про роботу в одновимірному діапазоні ...


Відповіді:


150
Dim a As Range, b As Range

Set a = Selection

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

149

Щось на зразок цього:

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

Просто натрапив на це і подумав, що запропонує своє рішення. Я, як правило, люблю використовувати вбудовану функціональність присвоєння діапазону багатомагнітному масиву (я думаю, це також програміст JS в мені).

Я часто пишу такий код:

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

Призначення діапазонів змінним є дуже потужним способом маніпулювання даними в VBA.


мені найкраще цей спосіб подобається!
афон

2
Два основних переваги на користь його: 1) метод масиву завжди швидше , ніж цикл через ряд, 2) це просто »s , і ви можете використовувати його в обох напрямках і записати назад масив після деяких обчислень: Range("A1:D4") = myarray. Примітка: Dim myarray як варіант; звернути увагу на те , що це 1на 2 dim масиву за замовчуванням
TM

7

У циклі я завжди вважаю за краще використовувати Cellsклас, використовуючи еталонний метод R1C1, наприклад:

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

Це дозволяє мені швидко і легко петлю над Діапазон осередків легко:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.