Основы офисного программирования и язык VBA

       

Коллекции и конструкция For Each … Next


При работе с коллекциями довольно часто приходится организовывать цикл по всем элементам коллекции. До сих пор во всех наших примерах мы использовали обычные средства - цикл "For", где количество шагов цикла определялось свойством Count (его имеет каждая коллекция). Наша конструкция выглядела так:

With <объект> For i = 1 To .Count .Item(i) ' Доступ к i-му объекту и работа с ним Next i End With

VBA предлагает специальную конструкцию " For Each" для организации подобных циклов. Синтаксис конструкции таков:

For Each <Элемент> In <Группа> [<Операторы>] [Exit For] [<Операторы>] Next [<Элемент>]

где:

<Группа> - имя объекта-коллекции или массива.

<Элемент> - объект (переменная), совпадающий по классу с элементами коллекции, или имеющий тип Variant. Для массивов допустим только тип Variant. Нормально цикл заканчивается, когда переменная цикла получила все возможные значения и коллекция исчерпана. Но можно организовать досрочный выход. Для этого используется внутренняя конструкция Exit For. Обычно она помещается в Then-ветвь оператора If. Если условие выхода выполняется, следом выполняются Exit For и следующие за ним операторы, требуемые для корректного завершения цикла. После чего управление покидает цикл.

Цикл For Each не может использоваться для массивов с элементами, определенными пользователем. Последнее объясняется тем, что переменная типа Variant не может принимать пользовательский тип.

Приведем пример использования "старой" и "новой" конструкций:

With Documents For i = 1 To .Count For Each doc In Documents Debug.Print .Item(i) Debug.Print doc Next i Next doc End With

Преимущество "новой" очевидно: удобнее иметь сам элемент doc вместо индекса элемента i. Особенно это может быть важно, когда в ходе цикла приходится многократно обращаться к элементу doc.

При работе с коллекциями используйте, как правило, конструкцию For Each. Кроме всего прочего, она выполняется намного эффективнее по времени исполнения.



Содержание раздела