Цикл for each vba примеры

Цикл for each vba примеры

Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.

К циклам VBA относятся:

Далее мы подробно рассмотрим каждый из этих циклов.

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1. Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.

Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

В приведённом примере условие iFib_Next

Цикл For Each. Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For Each. Next.

Цикл For Each. Next в VBA Excel предназначен для выполнения блока операторов по отношению к каждому элементу из группы элементов (диапазон, массив, коллекция). Этот замечательный цикл применяется, когда неизвестно количество элементов в группе и их индексация, в противном случае, более предпочтительным считается использование цикла For. Next.

Синтаксис цикла For Each. Next

В квадратных скобках указаны необязательные атрибуты цикла For Each. Next.

Компоненты цикла For Each. Next

Компонент Описание
element Обязательный атрибут в операторе For Each, необязательный атрибут в операторе Next. Представляет из себя переменную, используемую для циклического прохода элементов группы (диапазон, массив, коллекция), которая предварительно должна быть объявлена с соответствующим типом данных*.
group Обязательный атрибут. Группа элементов (диапазон, массив, коллекция), по каждому элементу которой последовательно проходит цикл For Each. Next.
statements Необязательный** атрибут. Операторы вашего кода.
Exit For Необязательный атрибут. Оператор выхода из цикла до его окончания.

*Если цикл For Each. Next используется в VBA Excel для прохождения элементов коллекции (объект Collection) или массива, тогда переменная element должна быть объявлена с типом данных Variant, иначе цикл работать не будет.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For Each. Next

Цикл для диапазона ячеек

На активном листе рабочей книги Excel выделите диапазон ячеек и запустите на выполнение следующую процедуру:

Читайте также:  Тест amd a10 6700

Информационное окно MsgBox выведет адреса выделенных ячеек и их содержимое, если оно есть. Если будет выбрано много ячеек, то полностью информация по всем ячейкам выведена не будет, так как максимальная длина параметра Prompt функции MsgBox составляет примерно 1024 знака.

Цикл для коллекции листов

Скопируйте следующую процедуру VBA в стандартный модуль книги Excel:

Информационное окно MsgBox выведет список наименований всех листов рабочей книги Excel по порядковому номеру их ярлычков, соответствующих их индексам.

Цикл для массива

Присвоим массиву список наименований животных и в цикле For Each. Next запишем их в переменную a. Информационное окно MsgBox выведет список наименований животных из переменной a.

Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each. Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each. Next.

Этот код, как и все остальные в этой статье, тестировался в Excel 2016.

Цикл для коллекции подкаталогов и выход из цикла

В этом примере мы будем добавлять в переменную a названия подкаталогов на диске C вашего компьютера. Когда цикл дойдет до папки Program Files, он добавит в переменную a ее название и сообщение: «Хватит, дальше читать не буду! С уважением, Ваш цикл For Each. Next.».

Информационное окно MsgBox выведет список наименований подкаталогов на диске C вашего компьютера до папки Program Files включительно и сообщение цикла о прекращении своей работы.

В результате работы программы будут выведены не только наименования подкаталогов, видимых при переходе в проводнике к диску C, но и скрытые и служебные папки. Для просмотра списка всех подкаталогов на диске C, закомментируйте участок кода от If до End If включительно и запустите выполнение процедуры в редакторе VBA Excel.

Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

Повторяет группу операторов применительно к каждому элементу коллекции.

Термин Определение
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 используется при необходимости повтора набора инструкций для каждого элемента коллекции или массива.

Совет

Оператор Оператор For. Next работает лучше, когда можно связать каждую итерацию цикла с управляющей переменной и определить ее начальное и конечное значения. Однако при работе с коллекцией, понятие начальных и окончательных значений не учитывается, и его обязательно неизвестен, сколько элементов коллекции имеется. В этом типе так, цикл For Each … Next часто является лучшим вариантом.

В следующем примере, выписка For Each … Next просматривает все элементы коллекции списка.

Дополнительные примеры см. в разделах Коллекции и Массивы.

Циклы For Each могут вкладываться друг в друга.

В следующем примере демонстрируется вложенные структуры For Each … Next .

При поместите циклы, каждый цикл должен иметь уникальное имя переменной element .

Также можно вложить друг в друга различные виды управляющих структур. Для получения дополнительной информации см. Вложенные структуры управления.

Выполнение причин выписки Оставьте для, чтобы отключить цикл For … Next и управление передач на инструкцию, которая следует за выписка Next .

Читайте также:  Ошибка 0х80070091 как исправить

Оператор Continue For передает управление непосредственно следующей итерации цикла. Для получения дополнительной информации см. Оператор Continue.

В следующем примере показано, как используются операторы Continue For и Exit For .

Любое число операторов Exit For можно разместить в цикле For Each . При использовании вложенных циклов For Each оператор Exit For вызывает выход из самого внутреннего цикла и передает управление следующему уровню вложения.

Exit For часто используется после оценки некоторого условия, например в структуре If . Then . Else . Можно использовать Exit For при следующих условиях:

Продолжать выполнение итераций не нужно или невозможно. Это может быть вызвано ошибочным значением или запросом на прерывание.

Исключение перехватывается в Try . Catch . Finally . Можно использовать Exit For в конце блока Finally .

Там бесконечный цикл, то есть цикл, которые может быть запущен большое или даже бесконечное количество раз. При обнаружении таких условий для выхода из цикла можно использовать Exit For . Дополнительные сведения см. в разделе Оператор Do. Loop.

Используется итератор, чтобы выполнять пользовательскую итерации по коллекции. Итератор может быть функцией или доступом Get . Он использует оператора Yield для получения каждого элемента коллекции по одному.

Следует вызвать итератор выписки с помощью For Each. Next . Каждая итерация цикла For Each вызывает итератор. При достижении выписка Yield в итераторе, возвращается выражение в инструкцию Yield , и текущего расположения в коде сохраняются. При следующем вызове итератора выполнение возобновляется с этого места.

В следующем примере используется функция итератора. Функция итератора имеет оператора Yield , внутри цикла For… Next. В методе ListEvenNumbers на каждую итерацию тела выписки For Each создает вызов функции итератора, которая переходит на следующую инструкцию Yield .

Дополнительные сведения см. в разделах Итераторы, Оператор Yield и Итератор.

Когда выписка 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 не влияет на коллекцию или элементы, которые были определены при цикл сначала был введен.

Если циклы вложения, если выписка Next внешнего уровень вложенности обнаружении перед Next внутреннего уровня, компилятор сигнализирует об ошибке. При этом компилятор может обнаружить эту ошибку только в том случае, если в каждой инструкции Next указан element .

Если код зависит от переместить коллекцию в определенном порядке, цикл For Each … Next нет рекомендуемые варианта, если не требуется знать характеристики объекта перечислителя коллекции предоставляет. Порядок обхода не определен Visual Basic, но методом MoveNext объекта перечислителя. Это означает, что пользователь не может задать, какой элемент должен быть первым записан в element , или какой элемент должен следовать за каким-либо элементом. С помощью другой циклической структуры, например For . Next или Do . Loop , можно добиться более надежных результатов.

Тип данных element должен быть таким, чтобы тип данных элементов в group мог быть преобразован к нему.

Тип данных group должен быть ссылочным типом, который ссылается на коллекцию или массив, который доступен для перечисления. Чаще всего это означает, что group ссылается на объект, реализующий интерфейс IEnumerable из пространства имен System.Collections или интерфейс IEnumerable из пространства имен System.Collections.Generic . System.Collections.IEnumerable задает метод GetEnumerator, который возвращает объект перечислителя для коллекции. Объект перечислителя реализует интерфейс System.Collections.IEnumerator пространства имен System.Collections , а также имеет свойство Current, методы Reset и MoveNext. Visual Basic использует их для перемещения по коллекции.

Читайте также:  Asrock n68c s ucc cpusocket

Сужающие преобразования

Если Option Strict равно On , сужающее преобразование обычно вызывает ошибки компилятора. Однако в операторе For Each преобразования из элементов group в element оцениваются и выполняются во время выполнения и ошибка компилятора, вызванная сужающим преобразованием, может быть подавлена.

В следующем примере, назначения m как начальное значение для n не будет компилироваться при Option Strict , поскольку преобразование Long в Integer сужающее преобразование. В операторе For Each однако, не ошибка компилятора сообщается, даже несмотря на то, что присвоение number требует того же преобразования из Long в Integer . В операторе For Each , содержащем большое число, то во время выполнения возникает ошибка, когда к большому числу применяется ToInteger.

Вызовы IEnumerator

В начале выполнения цикла For Each . Next Visual Basic проверяет, на допустимую ли коллекцию объектов ссылается group . Если это не так, то создается исключение. В противном случае вызывается метод MoveNext и свойство Current объекта перечислителя, возвращающее первый элемент. Если MoveNext указывает, что следующий элемент отсутствует, то есть коллекция пуста, то цикл For Each останавливается и управление передается оператору, следующему за оператором Next . В противном случае Visual Basic присваивает element значение первого элемента и выполняет блок операторов.

Каждый раз, обнаруживая инструкцию Next , Visual Basic возвращается на инструкцию For Each . Снова для получения следующего элемента вызывается метод MoveNext и свойство Current , и снова в зависимости от результата либо выполняется блок, либо цикл останавливается. Этот процесс продолжается до тех пор, пока метод MoveNext не укажет на отсутствие следующего элемента, или пока не встретится оператор Exit For .

Изменение коллекции. Возвращает объект перечислителя GetEnumerator обычно не позволяет изменять коллекцию путем добавления, удаления и переупорядочивания заменить все элементы. Если пользователь изменит коллекцию после запуска цикла For Each . Next , то объект перечислителя станет недействительным, и следующая попытка обращения к элементу коллекции вызовет исключение InvalidOperationException.

Однако эта блокировка изменения не указана, Visual Basic, а реализацией интерфейса IEnumerable. Можно реализовать IEnumerable таким образом, чтобы сделать изменение коллекции во время итерации возможным. Если планируется производить такие динамические изменения, то необходимо определить характер реализации IEnumerable используемой коллекции.

Изменение элементов коллекции. Свойство объекта перечисления Current имеет модификатор ReadOnly и возвращает локальную копию каждого элемента коллекции. Это означает, что в цикле For Each . Next нельзя изменить сами элементы. Любые изменения, сделанные влияет только на локальную копию из Current и обратно не отражены в базовую коллекцию. Тем не менее, если элемент имеет ссылочный тип, то можно изменять члены экземпляра, на который он указывает. Следующий пример изменяет элемент BackColor каждого элемента thisControl . Нельзя изменить, однако сам оператор thisControl .

В предыдущем примере можно изменить член BackColor каждого элемента thisControl , несмотря на то, что нельзя изменить сам thisControl .

Обход массива. Поскольку класс Array реализует интерфейс IEnumerable, все массивы имеют метод GetEnumerator. Это означает, что с помощью цикла For Each . Next можно перебирать и массивы. Тем не менее, элементы массива можно только считывать. Это изменить нельзя.

В следующем примере перечислены все папки в папке C: с помощью класса DirectoryInfo.

Следующий пример демонстрирует процедуру сортировки коллекции. Пример сортирует экземпляры класса Car , хранящихся в List . Класс Car реализует интерфейс IComparable , который требует, чтобы метод CompareTo был реализован.

Каждый вызов метода CompareTo делает одно сравнение, используется для сортировки. Написанный пользователем код в методе CompareTo возвращает значение для каждого сравнения текущего объекта с другим объектом. Возвращаемое значение меньше нуля, если текущий объект меньше другого объекта, больше нуля, если текущий объект больше другого объекта, а также равняется нулю, если объекты равны. Это позволяет указать в коде условие для отношения "больше", "меньше" и "равно".

Ссылка на основную публикацию
Хочу создать группу в контакте
Приветствую вас, дорогие читатели. Социальные сети уже давно вошли в нашу жизнь, поэтому всем владельцам абсолютно любого бизнеса, как традиционного,...
Установка mac os transmac
В сети сейчас полно копипастов, по сути одной и той же статьи, про установку MacOS X на хакинтош примерно с...
Установка op com на windows 10
Всем привет! Очень многие вектроводы заказывают с Китая OP-COM и сталкиваются с проблемами установки драйверов самого OP-COM на различных системах...
Хром для андроид тв приставок
Всем привет! Предлагаю очередной раз поднять больную тему браузеров для Android TV. В разделе «вопрос – ответ» уже много раз...
Adblock detector