Скажем, у меня есть следующий код:
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
вручную, но я надеюсь, что существует более прямой способ, который не включает синтаксический анализ строк.
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
Вы можете использовать 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
Range
такими как те, что вы упомянули, и я не могу понять, как их использовать, чтобы дать мне необходимую информацию.
Чтобы сделать заметку о Дике, это правильно, но я бы не рекомендовал использовать цикл For Each. Для каждого создается временная ссылка на COM-ячейку за кулисами, к которым у вас нет доступа (что вам нужно, чтобы избавиться от нее).
Подробнее см. ниже:
Как правильно очистить объекты взаимодействия Excel?
Чтобы проиллюстрировать эту проблему, попробуйте пример для каждого примера, закройте приложение и посмотрите на Диспетчер задач. Вы должны увидеть, что экземпляр Excel по-прежнему работает (поскольку все объекты не были удалены должным образом).
Более чистый способ справиться с этим - запросить таблицу с помощью ADO:
Я воскрешаю мертвых здесь, но потому, что диапазон можно определить как "A: A", используя a для каждого цикла, заканчивается потенциальным бесконечным циклом. Решение, насколько мне известно, заключается в использовании цикла Do Until
.
Do Until Selection.Value = ""
Rem Do things here...
Loop
.range(.cells(1, 1), .cells(.rows.count, 1).end(xlup))
), используйте метод Intersect с полный столбец и свойство .UsedRange рабочего листа (например, Intersect(.columns(1), .usedrange)
) или, возможно, свойство Range.CurrentRegion (например, .cells(1, 1).currentregion.columns(1)
) достаточно эффективно ,
Cells
- просто объектRange
. Фактически, я удалил.Cells
изrRng
в строкеFor Each
и он все еще работал. Как насчетRange
делает его похожим на коллекциюRange
s? Большое спасибо за Вашу помощь!