Цикл For. Next
Предположим, нужно вывести все числа от 1 до 100 по одному на строке. Обычным способом пришлось бы писать 100 строк кода:
При помощи циклов то же действие можно выполнить гораздо проще:
Иными словами, циклы позволяют выполнить одни и те же инструкции многократно.
Цикл For. Next имеет следующий формат:
Здесь присутствуют следующие конструкции:
- <Переменная> — переменная-счетчик, которой на каждой итерации цикла будет присваиваться новое значение в диапазоне от <Начало> до <Конец> включительно с шагом <Шаг> ;
- <Начало> — начальное значение;
- <Конец> — конечное значение;
- <Шаг> — задает приращение значения на каждой итерации цикла. Если параметр не указан, то по умолчанию он имеет значение 1 . Значение может быть как положительным, так и отрицательным;
- <Инструкции внутри цикла> — блок, который будет многократно выполняться.
Выведем все числа от 100 до 1:
Выведем все четные числа от 0 до 100:
Выведем значения всех элементов массива в прямом и обратном порядке:
Умножим значения всех элементов массива на 2:
Один цикл можно вложить в другой цикл. В качестве примера выведем значения всех элементов многомерного массива:
Цикл For Each. Next
Цикл For Each. Next предназначен для перебора элементов коллекций и массивов. Формат цикла:
На каждой итерации цикла переменной <Переменная> будет присваиваться значение текущего элемента коллекции или массива. Обратите внимание на то, что переменная будет содержать копию значения элемента массива, поэтому любое изменение этой переменной внутри цикла не затронет значение самого элемента. Следует также учитывать, что переменная <Переменная> при переборе массивов должна быть объявлена с типом Variant . Тип Variant не может хранить данные пользовательских типов, следовательно цикл For Each. Next нельзя использовать для перебора массивов, содержащих значения пользовательских типов.
Выполним перебор элементов массива:
Теперь выведем названия всех листов в текущей рабочей книге:
Инструкция Exit For
Инструкция Exit For позволяет прервать выполнение циклов For. Next и For Each. Next досрочно. Для примера произведем поиск элемента в массиве. При нахождении первого элемента, соответствующего критериям поиска, прервем цикл (листинг 4.5).
Листинг 4.5. Инструкция Exit For
Цикл Do. Loop и инструкция Exit Do
Цикл Do. Loop предназначен для выполнения инструкций неопределенное количество раз. Формат цикла:
Внутри тела цикла необходимо предусмотреть условие, при котором цикл должен завершиться, иначе цикл будет бесконечным. Завершить выполнение цикла позволяет инструкция Exit Do . Инструкция Exit Do прерывает выполнение цикла, а не программы, т. е. далее будет выполнена инструкция, следующая сразу за циклом.
Цикл Do. Loop совместно с инструкцией Exit Do удобно использовать для получения неопределенного заранее количества данных от пользователя. В качестве примера просуммируем неопределенное количество чисел (листинг 4.6).
Листинг 4.6. Суммирование неопределенного количества чисел
Циклы Do While. Loop и Do Until. Loop
Выполнение инструкций в цикле Do While. Loop продолжается до тех пор, пока логическое выражение истинно. Формат цикла:
Последовательность работы цикла Do While. Loop :
- Переменной-счетчику присваивается начальное значение.
- Проверяется условие, если оно истинно, выполняются инструкции внутри цикла, иначе выполнение цикла завершается.
- Переменная-счетчик изменяется на величину, указанную в параметре <Приращение> .
- Переход к пункту 2.
Выведем все числа от 1 до 100, используя цикл Do While. Loop (листинг 4.7).
Листинг 4.7. Вывод чисел от 1 до 100
Выполнение инструкций в цикле Do Until. Loop продолжается до тех пор, пока логическое выражение ложно. Формат цикла:
Выведем все числа от 100 до 1, используя цикл Do Until. Loop (листинг 4.8).
Листинг 4.8. Вывод чисел от 100 до 1
С помощью циклов Do While. Loop и Do Until. Loop можно создать бесконечный цикл, указав в параметре <Условие> значение True или False соответственно. Выведем все числа от 1 до 100, используя бесконечный цикл (листинг 4.9).
Листинг 4.9. Вывод чисел от 1 до 100
Обратите внимание на условие, оно не содержит операторов сравнения. Проверка на равенство выражения значению True выполняется по умолчанию.
Циклы Do. Loop While и Do. Loop Until
Выполнение инструкций в цикле Do. Loop While продолжается до тех пор, пока логическое выражение истинно. Но в отличие от цикла Do While. Loop условие проверяется не в начале цикла, а в конце. По этой причине инструкции внутри цикла Do. Loop While выполнятся минимум один раз. Цикл имеет следующий формат:
Последовательность работы цикла Do. Loop While :
- Переменной-счетчику присваивается начальное значение.
- Выполняются выражения внутри цикла.
- Переменная-счетчик изменяется на величину, указанную в параметре <Приращение> .
- Проверяется условие, если оно истинно, происходит переход к п. 2, а если нет — выполнение цикла завершается.
Выведем все числа от 1 до 100, используя цикл Do. Loop While :
Цикл Do. Loop Until аналогичен циклу Do. Loop While , но выполнение инструкций продолжается до тех пор, пока логическое выражение ложно. Инструкции внутри цикла Do. Loop Until выполнятся минимум один раз. Цикл имеет следующий формат:
Выведем все числа от 1 до 100, используя цикл Do. Loop Until :
Цикл While. Wend
Выполнение инструкций в цикле While. Wend продолжается до тех пор, пока логическое выражение истинно. Формат цикла:
Последовательность работы цикла While. Wend :
- Переменной-счетчику присваивается начальное значение.
- Проверяется условие, если оно истинно, выполняются инструкции внутри цикла, иначе выполнение цикла завершается.
- Переменная-счетчик изменяется на величину, указанную в параметре <Приращение> .
- Переход к пункту 2.
Выведем все числа от 1 до 100, используя цикл While. Wend (листинг 4.11).
Листинг 4.10. Вывод чисел от 1 до 100
Оператор GoTo
С помощью оператора безусловного перехода GoTo можно передать управление в любое место программы. Оператор имеет следующий формат:
Значение в параметре <Метка> должно быть допустимым идентификатором. Место в программе, в которое передается управление, помечается одноименной меткой, после которой указывается двоеточие. В качестве примера имитируем цикл и выведем числа от 1 до 100 :
Статьи по Visual Basic for Applications (VBA)
Помощь сайту
Yandex-деньги: 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов
VBA Excel. Цикл Do While… Loop
Цикл Do While… Loop в VBA Excel предназначен для повторения блока операторов пока выполняется заданное условие (возвращается значение True). Синтаксис этого цикла аналогичен синтаксису цикла Do Until… Loop, который повторяется до тех пор, пока условие не выполняется (возвращается значение False).
Синтаксис цикла Do While… Loop
Синтаксис цикла Do While… Loop существует в двух вариантах, определяющих, когда проверяется условие.
Условие проверяется до выполнения операторов:
Условие проверяется после выполнения операторов:
В квадратных скобках указаны необязательные атрибуты цикла Do While… Loop.
Компоненты цикла Do While… Loop
| Компонент | Описание |
|---|---|
| condition | Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean. |
| statements | Необязательный* атрибут. Операторы вашего кода. |
| Exit Do | Необязательный атрибут. Оператор выхода** из цикла до его окончания. |
*Если не использовать в цикле свой код, смысл применения цикла теряется.
**Очень полезный оператор для цикла Do While… Loop, так как при некоторых обстоятельствах он может стать бесконечным. Если такой риск существует, следует предусмотреть возможность выхода из бесконечного цикла VBA с помощью оператора Exit Do.
Примеры циклов Do While… Loop
Простейшие циклы
Цикл Do While… Loop с условием до исполняемых операторов:
Цикл Do While… Loop с условием после исполняемых операторов:
В обоих случаях окно MsgBox выведет число 10. Когда значение переменной a будет равно 10, проверяемое условие выдаст значение False, и цикл будет остановлен.
Проход по строкам листа
У двух белок дупла расположены напротив друг друга. В каждом дупле по 100 шишек. В свободное время они бросают шишки в дупло напротив, попадают не всегда. Ниже, в таблице, указано количество шишек, брошенных каждой белкой, и сколько их попало в цель.
| Дни | Игрок | Брошено | Попало в цель |
|---|---|---|---|
| 1 день | Белка 1 | 15 | 6 |
| 1 день | Белка 2 | 12 | 7 |
| 2 день | Белка 1 | 14 | 8 |
| 2 день | Белка 2 | 16 | 7 |
| 3 день | Белка 1 | 20 | 9 |
| 3 день | Белка 2 | 14 | 6 |
| 4 день | Белка 1 | 26 | 10 |
| 4 день | Белка 2 | 13 | 5 |
| 5 день | Белка 1 | 17 | 4 |
| 5 день | Белка 2 | 21 | 7 |
Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле. Для этого необходимо вычесть из 100 шишек количество выброшенных Белкой 1 и прибавить шишки, заброшенные в ее дупло Белкой 2. Вычисления начинаем со второй строки (в первой заголовки) и в условии для цикла Do While… Loop указываем «первая ячейка текущей строки не является пустой». Таблица должна начинаться с первой ячейки рабочего листа «A1», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.
Break out of a While. Wend loop
![]()
Another option would be to set a flag variable as a Boolean and then change that value based on your criteria.
The best way is to use an And clause in your While statement
What about setting the ‘While’ test perameters in the loop so that the loop ends on the next iteration. For example.
Ok, that’s a totally pointless example but it shows the principle.
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Все циклы VBA

Цикл VBA While существует, чтобы сделать его совместимым со старым кодом. Однако Microsoft рекомендует использовать цикл Do Loop, поскольку он более «структурирован и гибок». Оба этих цикла рассматриваются в этом посте.
Для быстрого ознакомления с этими циклами перейдите к таблице быстрого руководства ниже.
Если вы ищете что-то конкретное, вы можете посмотреть содержание ниже.
Краткое руководство по VBA While Loops
| Формат цикла | Описание | Пример |
| Do While … Loop | Запускается 0 или более раз, пока условие выполняется | Do While result = «Верно» Loop |
| Do … Loop While | Запускается 1 или более раз, пока условие выполняется | Do Loop While result = «Верно» |
| Do Until … Loop | Запускается 0 или более раз, пока условие не будет выполнено | Do Until result <> «Верно» Loop |
| Do … Until Loop |
Введение
Если вы никогда ранее не использовали циклы, тогда вы можете прочитать «Что такое циклы и зачем они вам нужны» из моего поста в журнале For Loop.
Я собираюсь сосредоточиться в основном на Do Loop в этой статье. Как я упоминал выше, мы видели, что цикл While Wend считается устаревшим. Для полноты информации я все равно его включил в эту статью.
Итак, во-первых, зачем нам нужны циклы Do While, когда у нас уже есть циклы For?
Цикл For против цикла Do While
Когда мы используем цикл For Loop, мы заранее знаем, сколько раз мы хотим его запустить. Например, мы можем захотеть запустить цикл один раз для каждого элемента в коллекции, массиве или словаре.
В следующем примере кода мы видим в начале каждого цикла, сколько раз он будет выполняться.
Цикл Do другой. Он работает:
- В то время как условие верно
- Пока условие не будет выполнено
Другими словами, количество циклов в большинстве случаев не имеет значения.
Итак, что такое условие и как мы их используем?
Условия
Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как >, <, <>,> =, =.
Ниже приведены примеры условий
| Условие | Истина, когда… |
| x < 5 | x меньше 5 |
| x <= 5 | x меньше либо равен 5 |
| x > 5 | x больше 5 |
| x >= 5 | x больше либо равен 5 |
| x = 5 | x равен 5 |
| x <> 5 | x не равен 5 |
| x > 5 And x < 10 | x больше 5 И меньше 10 |
| x = 2 Or x >10 | x равен 2 ИЛИ больше 10 |
| Range(«A1») = «Иван» | Ячейка A1 содержит текст «Иван» |
| Range(«A1») <> «Иван» | Ячейка A1 не содержит текст «Иван» |
Вы могли заметить x = 5 как условие. Его следует путать с х = 5, при использовании в качестве назначения.
В следующей таблице показано, как «=» используется в условиях и назначениях.
| Использование «=» | Тип | Имеется в виду |
| Loop Until x = 5 | Условие | x равен 5? |
| Do While x = 5 | Условие | x равен 5? |
| If x = 5 Then | Условие | x равен 5? |
| For x = 1 To 5 | Присваивание | Установите значение x = 1, затем = 2 и т.д. |
| x = 5 | Присваивание | Установите значение x=5 |
| b = 6 = 5 | Присваивание и условие |
Присвойте b результату условия 6 = 5 |
| x = MyFunc(5,6) | Присваивание | Присвойте х значение, возвращаемое функцией |
Формат цикла Do
Цикл Do можно использовать четырьмя способами, и это часто вызывает путаницу. Однако в каждом из этих четырех способов есть только небольшая разница.
Do всегда в начале первой строки, а Loop всегда в конце последней строки.
Мы можем добавить условие после любой строки.
Условию предшествует While или Until, которое дает нам эти четыре возможности
Давайте посмотрим на некоторые примеры, чтобы прояснить это.
Примеры цикла Do
Представьте, что вы хотите, чтобы пользователь ввел список элементов. Каждый раз, когда пользователь вводит элемент, вы печатаете его в «Immediate Window». Когда пользователь вводит пустую строку, вы хотите, чтобы приложение закрывалось.
В этом случае цикл For не подойдет, поскольку вы не знаете, сколько элементов будет вводить пользователь. Пользователь может ввести пустую строку первым или с сотой попытки. Для этого типа сценария вы бы использовали цикл Do.
Следующий код показывает это
Код входит в цикл и продолжается до тех пор, пока не достигнет строки «Loop While». На этом этапе он проверяет, оценивается ли условие как истинное или ложное.
Если условие оценивается как ложное, то код выходит из цикла и продолжается.
Если условие оценивается как истинное, то код возвращается к строке Do и снова проходит через цикл.
Разница между наличием условия на линии Do и на линии Loop очень проста.
Когда условие находится в строке Do, цикл может вообще не работать. Так что он будет работать ноль или более раз.
Когда условие находится на линии Loop, цикл всегда будет запущен хотя бы один раз. Так что он будет запущен один или несколько раз.
В нашем последнем примере условие находится в строке Loop, потому что мы всегда хотим получить хотя бы одно значение от пользователя. В следующем примере мы используем обе версии цикла. Цикл будет выполняться, пока пользователь не введет букву «н».
В приведенном выше примере оба цикла будут вести себя одинаково.
Однако, если мы установим для sCommand значение «н» до запуска цикла «Do While», код не войдет в цикл.
Второй цикл в вышеприведенном примере (то есть Loop While) всегда будет запускаться хотя бы один раз.
While против Until
При использовании Do Loop условию должно предшествовать Until или While.
Until и While, по сути, противоположны друг другу. Они используются в VBA аналогично тому, как они используются в английском языке.
- Оставьте одежду, пока не пойдет дождь
- Оставь одежду, пока не идет дождь
- Оставайся в постели, пока не станет светло
- Оставайся в постели, пока темно
Еще один пример:
- повторять, пока число не станет больше или равно десяти
- повторить пока счет меньше десяти
Как видите, использование Until и While — это просто противоположный способ написания одного и того же условия.
Примеры Until и While
Следующий код показывает циклы «While» и «Until» рядом. Как видите, единственная разница в том, что условие полностью изменено.
Примечание: знаки <> означают «не равно».
- Первый цикл: запускается только в том случае, если sCommand не равен ‘н’.
- Второй цикл: запускается только в том случае, если sCommand не равен ‘н’.
- Третий цикл: будет запущен хотя бы один раз перед проверкой sCommand.
- Четвертый цикл: будет запущен хотя бы один раз перед проверкой sCommand.
Пример: проверка объектов
Примером использования Until и While является проверка объектов. Когда объект не был назначен, он имеет значение Nothing.
Поэтому, когда мы объявляем переменную книги в следующем примере, она имеет значение Nothing, пока мы не назначим ее Workbook.
Противоположностью Nothing не является Nothing, что может сбить с толку.
Представьте, что у нас есть две функции: GetFirstWorkbook и GetNextWorkbook, которые возвращают некоторые объекты книги. Код будет печатать имя рабочей книги до тех пор, пока функции больше не вернут действительную рабочую книгу.
Вы можете увидеть пример кода здесь:
Написание этого кода с использованием Do While было бы более запутанным, так как условие Not Is Nothing
Это делает код более понятным, и наличие четких условий — всегда хорошо. Честно говоря, разница маленькая, и выбор между «While» и «Until» действительно сводится к личному выбору.
Цикл Exit Do
Мы можем выйти из любого цикла Do с помощью оператора Exit Do.
Следующий код показывает пример использования Exit Do
В этом случае мы выходим из цикла Do Loop, если ячейка содержит текст «Найдено».
While Wend
Этот цикл в VBA, чтобы сделать его совместимым со старым кодом. Microsoft рекомендует использовать циклы Do, поскольку они более структурированы.
Из MSDN: «Оператор Do… Loop обеспечивает более структурированный и гибкий способ выполнения циклов».
Формат цикла VBA While Wend
Цикл VBA While имеет следующий формат:
While Wend против Do
Разница между циклами VBA While и VBA Do заключается в следующем:
- While может иметь условие только в начале цикла.
- While не имеет версии Until.
- Не существует оператора для выхода из цикла While, как Exit For или Exit Do.
Условие для цикла VBA While такое же, как и для цикла VBA Do While. Два цикла в приведенном ниже коде работают точно так же.
Бесконечный цикл
Даже если вы никогда не писали код в своей жизни, я уверен, что вы слышали фразу «Бесконечный цикл». Это цикл, в котором условие никогда не будет выполнено. Обычно это происходит, когда вы забыли обновить счетчик.
Следующий код показывает бесконечный цикл
В этом примере cnt установлен в 1, но он никогда не обновляется. Поэтому условие никогда не будет выполнено — cnt всегда будет меньше 5.
В следующем коде cnt обновляется каждый раз, поэтому условие будет выполнено.
Как вы можете видеть, использование For Loop безопаснее для подсчета, поскольку оно автоматически обновляет счет в цикле. Ниже приведен тот же цикл с использованием For.
Это явно лучший способ сделать это. Цикл For устанавливает начальное значение, условие и счет в одну строку.
Конечно, можно использовать бесконечный цикл, используя For — это потребует немного больше усилий
Работа с бесконечным циклом
Когда у вас бесконечный цикл — VBA не выдаст ошибку. Ваш код будет продолжать работать, а редактор Visual Basic не будет отвечать.
Раньше вы могли выйти из цикла, просто нажав Ctrl и Break. В настоящее время разные ноутбуки используют разные комбинации клавиш. Полезно знать, как это настроено в вашем ноутбуке, чтобы в случае возникновения бесконечного цикла вы могли легко остановить код.
Вы также можете выйти из цикла, убив процесс. Нажмите Ctrl + Shift + Esc. На вкладке Процессы найдите Excel / Microsoft Excel. Щелкните правой кнопкой мыши по этому и выберите «Завершить процесс». Это закроет Excel, и вы можете потерять часть работы — так что гораздо лучше использовать Ctrl + Break или его эквивалент.
Использование функций Worksheet вместо циклов
Иногда вы можете использовать функцию листа вместо цикла.
Например, представьте, что вы хотите добавить значения в список ячеек. Вы можете сделать это с помощью цикла, но было бы более эффективно использовать функцию таблицы Sum. Это быстрее и экономит много кода.
Использовать функции рабочего листа очень просто. Ниже приведен пример использования Sum и Count.
В следующем примере используется цикл для выполнения того же действия. Как видите, это гораздо более длинный способ достижения той же цели.