
- •Вопрос 8. Оператор цикла For Each. Назначение, правила синтаксиса и механизм выполнения. Коллекции объектов. Способы доступа к объектам коллекции.
- •Visual Basic вычисляет коллекцию только один раз — перед началом цикла. Если в блоке операторов изменяетсяelement или group, то эти изменения не оказывает влияния на повторение цикла.
- •Вопрос 9. Оператор цикла с параметром For. Назначение, правила синтаксиса и механизм выполнения. Коллекции объектов. Доступ к объектам коллекции с использованием For.
- •Вопрос 10. Оператор выбора по условию Select…Case. Назначение, правила синтаксиса и механизм выполнения. Правила записи условий. Отличие от условного оператора.
Вопрос 8. Оператор цикла For Each. Назначение, правила синтаксиса и механизм выполнения. Коллекции объектов. Способы доступа к объектам коллекции.
Повторяет группу операторов применительно к каждому элементу коллекции.
For Each element [ As datatype ] In group
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]
Термин |
Определение |
element |
Обязателен в операторе For Each. Необязателен в операторе Next. Переменная. Используется для циклического прохода (итерации) элементов коллекции. |
datatype |
Обязателен, если еще не объявлен элемент element. Тип данных element. |
group |
Обязательный. Объектная переменная. Указывает на коллекцию, применительно к элементам которой будут повторяться операторы statements. |
statements |
Необязательный. Один или несколько операторов, стоящих между операторами For Each и Next и выполняющихся применительно к каждому элементу group. |
Continue For |
Необязательный. Передача управления в начало цикла For Each. |
Exit For |
Необязательный. Передача управления из цикла For Each. |
Next |
Обязательный. Завершение определения цикла For Each. |
|
|
Цикл For Each...Next используется при необходимости повтора набора инструкций для каждого элемента коллекции или массива.
Visual Basic вычисляет коллекцию только один раз — перед началом цикла. Если в блоке операторов изменяетсяelement или group, то эти изменения не оказывает влияния на повторение цикла.
Когда переменной element будут присвоены все элементы коллекции, цикл For Each остановится и управление будет передано оператору, следующему за оператором Next.
Если element не был объявлен вне цикла, то его нужно объявить в операторе For Each. Можно объявить тип elementявным образом при помощи оператора As, или можно использовать определение типа для назначения типа. В этом случае областью действия element является основная часть цикла. В то же время нельзя определять element и внутри, и снаружи цикла.
Можно дополнительно указать element в инструкции Next. Это повышает удобочитаемость программы, особенно если в ней имеются вложенные циклы For Each. При этом следует указать ту же переменную, что и в соответствующем операторе For Each.
Можно избежать изменения значения element внутри цикла. Это может сделать его более сложным для чтения и отладку кода. Изменение значения group не влияет на коллекцию или ее элементы, которые были определены в начале цикла.
Очень часто в VBA требуется сделать какое-нибудь действие со всеми элементами коллекции или массива — перебрать все открытые документы, все листы Excel, все ячейки в определенном диапазоне и т. п. Для того чтобы пройти циклом по всем элементам коллекции, используется команда
For Each...Next: (Первый способ доступа к объектам коллекции)
For Each oWbk in Workbooks
MsgBox oWbk.Name
Next
При использовании этого приема можно очень просто найти и получить
ссылку на нужный нам объект:
For Each oWbk in Workbooks
If oWbk.Name = "Сводка.xls" Then
Set oMyWorkBook = oWbk
Exit For
End If
Next
В этом случае мы проходим циклом по всем элементам коллекции Workbooks (т. е. по открытым рабочим книгам в Excel), для каждой книги проверяем ее имя и, если нашли книгу с именем "Сводка.xls", получаем на нее ссылку и выходим из цикла. Коллекция рабочих книг — это специальная коллекция, которая умеет производить поиск в себе по имени элемента, поэтому, в принципе, можно было обойтись такой строкой: (Второй способ доступа к объектам коллекции)
Set oMyWorkBook = Workbooks("Сводка.xls")
Но для многих других коллекций без конструкции For Each...Next не обой-
тись.