Цикл каждой ячейки в диапазоне ячеек, когда дан объект Range - PullRequest
51 голосов
/ 06 октября 2010

Допустим, у меня есть следующий код:

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 объекты вручную, но я надеюсь, что есть более прямойспособ, который не включает разбор строки.

Ответы [ 4 ]

82 голосов
/ 06 октября 2010
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
13 голосов
/ 06 октября 2010

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

Вот как вы можете изменить пример Дика для работы с 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 голосов
/ 06 октября 2010

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

См. Следующее для дальнейшего обсуждения:

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

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

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

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

0 голосов
/ 09 декабря 2015

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

Do Until Selection.Value = ""
  Rem Do things here...
Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...