Управляющие конструкции
Рассмотрим еще одну разновидность цикла For…Next, часто использующуюся в VBA при обработке объектов, составляющих массив или семейство однородных объектов. В этой разновидности цикла счетчик отсутствует, а тело цикла выполняется для каждого элемента массива или семейства объектов. Вот синтаксис такого цикла:
For
Each
<элемент>
In
<совокупность>
<блокОператоров>
Next
[<элемент>]
Где:
- <элемент> – это переменная, используемая для ссылки на элементы семейства объектов;
- <совокупность> – это имя массива или семейства.
Приведем пример использования подобного цикла. Следующая процедура предназначается для выдачи на печать списка всех полей для всех таблиц текущей открытой базы данных:
Public
Sub
EnumerateAllFields()
Dim
MyBase
As
Database
Dim
tdf
As
TableDef, fid
As
Field
Set
MyBase
= CurrentDb()
For
Each
tdf
In
MyBase
.TableDefs
Debug.Print
"Таблица: "
& tdf.Name
For
Each
fid
In
tdf.Fields
Debug.Print
" Поле: "
& fid.Name
Next
fid
Next
tdf
Set
MyBase
=
Nothing
End
Sub
Итак, в операторах Dim мы объявили переменную MyBase как объект "база данных DАО", переменные tdf и fid – как определение таблицы и поле таблицы, соответственно. Оператор Set назначает переменной MyBase текущую открытую базу данных. Далее для каждого определения таблицы выполняется вывод на печать названия таблицы, а затем вложенный цикл такого же типа печатает названия всех ее полей.
Приведем еще один пример использования подобного оператора цикла For Each…Next для обработки всех элементов многомерного массива. Пусть у нас имеется трехмерный числовой массив из 1000 элементов (размерами 10x10x10), который мы хотим заполнить случайными вещественными числами в диапазоне от 0 до 1. Если бы мы применяли обычные циклы For…Next со счетчиками, используя счетчики в качестве индексов элементов массива, то для решения этой задачи потребовалось бы написать три вложенных цикла For… Next:
Dim
tArray(9, 9, 9)
As
Single
Dim
i% , j% , k%
Randomize
For
i = 0
To
9
For
j = 0
To
9
For
k = 0
To
9
tArray(i, j, k) = Rnd()
Next
k
Next
j
Next
i
На самом же деле достаточно всего одного цикла, если вместо циклов со счетчиками воспользоваться циклом For Each… Next:
Dim
tArray(9, 9, 9)
As
Single
Dim
elem
As
Variant
Randomize
For
Each
elem
In
tArray
elem = Rnd()
Next
Еще раз порекомендуем использовать отступы при записи циклов, так же, как и при записи операторов ветвления.