Подтвердить что ты не робот

Цикл через каждую ячейку в диапазоне ячеек при задании объекта Range

Скажем, у меня есть следующий код:

Sub TestRangeLoop()
    Dim rng As Range
    Set rng = Range("A1:A6")

    ''//Insert code to loop through rng here
End Sub

Я хочу иметь возможность выполнять итерацию через набор объектов Range для каждой ячейки, указанной в rng. Концептуально, я хотел бы сделать это так:

For Each rngCell As Range in rng
     ''//Do something with rngCell
Next

Я знаю, что могу решить эту проблему путем разбора rng.Address и создания объектов Range вручную, но я надеюсь, что существует более прямой способ, который не включает синтаксический анализ строк.

4b9b3361

Ответ 1

Sub LoopRange()

    Dim rCell As Range
    Dim rRng As Range

    Set rRng = Sheet1.Range("A1:A6")

    For Each rCell In rRng.Cells
        Debug.Print rCell.Address, rCell.Value
    Next rCell

End Sub

Ответ 2

Вы можете использовать Range.Rows, Range.Columns или Range.Cells. Каждая из этих коллекций содержит объекты Range.

Здесь вы можете изменить пример Dick, чтобы работать с Rows:

Sub LoopRange()

    Dim rCell As Range
    Dim rRng As Range

    Set rRng = Sheet1.Range("A1:A6")

    For Each rCell In rRng.Rows
        Debug.Print rCell.Address, rCell.Value
    Next rCell

End Sub

И Columns:

Sub LoopRange()

    Dim rCell As Range
    Dim rRng As Range

    Set rRng = Sheet1.Range("A1:A6")

    For Each rCol In rRng.Columns
        For Each rCell In rCol.Rows
            Debug.Print rCell.Address, rCell.Value
        Next rCell
    Next rCol

End Sub

Ответ 3

Чтобы сделать заметку о Дике, это правильно, но я бы не рекомендовал использовать цикл For Each. Для каждого создается временная ссылка на COM-ячейку за кулисами, к которым у вас нет доступа (что вам нужно, чтобы избавиться от нее).

Подробнее см. ниже:

Как правильно очистить объекты взаимодействия Excel?

Чтобы проиллюстрировать эту проблему, попробуйте пример для каждого примера, закройте приложение и посмотрите на Диспетчер задач. Вы должны увидеть, что экземпляр Excel по-прежнему работает (поскольку все объекты не были удалены должным образом).

Более чистый способ справиться с этим - запросить таблицу с помощью ADO:

http://technet.microsoft.com/en-us/library/ee692882.aspx

Ответ 4

Я воскрешаю мертвых здесь, но потому, что диапазон можно определить как "A: A", используя a для каждого цикла, заканчивается потенциальным бесконечным циклом. Решение, насколько мне известно, заключается в использовании цикла Do Until.

Do Until Selection.Value = ""
  Rem Do things here...
Loop