Прокрутите каждую строку диапазона в Excel

Это одна из тех вещей, для которых, я уверен, есть встроенная функция (и, возможно, мне говорили об этом в прошлом), но я ломаю голову, чтобы вспомнить об этом.

Как пройти через каждую строку многоколоночного диапазона с помощью Excel VBA? Все учебники, которые я искал, похоже, упоминают только работу с одномерным диапазоном ...


person Margaret    schedule 22.09.2009    source источник
comment
codevba.com/excel/for_each_cell_in_range.htm#.Xyd8qCgzaUk   -  person Frank Myat Thu    schedule 03.08.2020


Ответы (3)


Что-то вроде этого:

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
person David Andres    schedule 22.09.2009

Просто наткнулся на это и подумал, что предлагаю свое решение. Обычно мне нравится использовать встроенную функцию присвоения диапазона многомерному массиву (я думаю, это также JS Programmer во мне).

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

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.

person tc_NYC    schedule 09.12.2015
comment
мне этот способ нравится больше всего! - person athos; 20.03.2017
comment
Два основных преимущества в его пользу: 1) метод массива всегда быстрее, чем цикл по диапазону, 2) он прост и вы можете использовать его в обоих направлениях и запишите массив обратно после некоторых вычислений: Range("A1:D4") = myarray. Примечание: Dim myarray как вариант; обратите внимание на то, что по умолчанию это массив 1based 2dim - person T.M.; 08.10.2017

В циклах я всегда предпочитаю использовать класс 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
person LimaNightHawk    schedule 20.08.2015