Выход из цикла for vba: VBA Excel. Цикл For… Next
VBA Excel. Цикл For… Next
Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.
Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла – счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.
Синтаксис цикла For… Next
For counter = start To end [ Step step ] [ statements ] [ Exit For ] [ statements ] Next [ counter ] |
For счетчик = начало To конец [ Step шаг ] [ операторы ] [ Exit For ] [ операторы ] Next [ счетчик ] |
В квадратных скобках указаны необязательные атрибуты цикла For… Next.
Компоненты цикла For… Next
Компонент | Описание |
counter | Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла. |
start | Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика. |
end | Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика. |
Step* | Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла. |
step | Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным. |
statements | Необязательный** атрибут. Операторы вашего кода. |
Exit For | Необязательный атрибут. Оператор выхода из цикла до его окончания. |
Next [ counter ] | Здесь counter – необязательный атрибут. Это то же самое имя управляющей переменной цикла, которое можно здесь не указывать. |
*Если атрибут Step отсутствует, цикл For… Next выполняется с шагом по умолчанию, равному 1.
**Если не использовать в цикле свой код, смысл применения цикла теряется.
Примеры циклов For… Next
Вы можете скопировать примеры циклов в свой модуль VBA, последовательно запускать их на выполнение и смотреть результаты.
Простейший цикл
Заполняем десять первых ячеек первого столбца активного листа Excel цифрами от 1 до 10:
Sub test1() Dim i As Long For i = 1 To 10 Cells(i, 1) = i Next End Sub |
Простейший цикл с шагом
В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:
Sub test2() Dim i As Long For i = 1 To 10 Step 3 Cells(i, 2) = i Next End Sub |
Цикл с отрицательными аргументами
Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:
Sub test3() Dim i As Long For i = 0 To -9 Step -1 Cells(i + 10, 3) = i + 10 Next End Sub |
Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:
Sub test4() Dim i As Long For i = 0 To -9 Step -3 Cells(i + 10, 4) = i + 10 Next End Sub |
Вложенный цикл
Внешний цикл последовательно задает индексы первых десяти строк активного листа, а вложенный цикл складывает числа в первых четырех ячейках строки с текущем индексом и записывает сумму в ячейку пятого столбца. Перед запуском вложенного цикла с накопительным сложением, пятую ячейку соответствующей строки обнуляем, чтобы в случае нахождения в ней какого-либо числа, оно не прибавилось к итоговой сумме.
Sub test5() Dim i1 As Long, i2 As Long For i1 = 1 To 10 ‘Пятой ячейке в строке i1 присваиваем 0 Cells(i1, 5) = 0 For i2 = 1 To 4 Cells(i1, 5) = Cells(i1, 5) + Cells(i1, i2) Next Next End Sub |
Выход из цикла
В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For… Next:
Sub test6() Dim i As Long For i = 1 To 10 Cells(i, 6) = Choose(i, «Медведь», «Слон», «Жираф», «Антилопа», _ «Крокодил», «Зебра», «Тигр», «Ящерица», «Лев», «Бегемот») Next End Sub |
Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».
Sub test7() Dim i As Long For i = 1 To 10 If Cells(i, 6) = «Крокодил» Then Cells(i, 7) = «Он съел галоши» Exit For Else Cells(i, 7) = «Здесь был цикл» End If Next End Sub |
Результат работы циклов For… Next из примеров:
Результат работы циклов For… Next
Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For… Next.
Цикл с дробными аргументами
Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:
For i = 1 To 20 Step 2 For i = a To b Step c For i = a — 3 To 2b + 1 Step c/2 |
В результате вычисления значения переменной вне цикла или выражения внутри его может получиться дробный результат. VBA Excel округлит его до целого числа, используя бухгалтерское округление:
‘Значения атрибутов до округления For i = 1.5 To 10.5 Step 2.51 ‘Округленные значения атрибутов For i = 2 To 10 Step 3 |
Старайтесь не допускать попадания в тело цикла For… Next неокругленных значений аргументов, чтобы не получить непредсказуемые результаты его выполнения. Если без дробных чисел не обойтись, а необходимо использовать обычное округление, применяйте в коде VBA функцию рабочего листа WorksheetFunction.Round для округления числа перед использованием его в цикле For… Next.
VBA Excel. Циклы
Циклы в VBA Excel предназначены для повторения одного и того же блока операторов. Количество итераций может быть задано явно, зависеть от условия или количества элементов, содержащихся в обрабатываемом объекте.
Цикл For… Next
Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное счетчиком – специальной переменной цикла. После выполнения каждой итерации значение счетчика увеличивается или уменьшается на единицу или на число, указанное с помощью оператора Step. Предусмотрен принудительный выход из цикла с помощью оператора Exit For. Перейти к подробному описанию …
Цикл Do While… Loop
Цикл Do While… Loop в VBA Excel предназначен для повторения блока операторов до тех пор, пока выполняется заданное условие (возвращается значение True). Этот цикл позволяет проверять условие как до, так и после выполнения операторов. Предусмотрен принудительный выход из цикла с помощью оператора Exit Do. Перейти к подробному описанию …
Цикл While… Wend
Цикл While… Wend в VBA Excel предназначен для выполнения блока операторов до тех пор, пока выполняется заданное условие (возвращается значение True). Этот цикл позволяет проверять условие только до выполнения операторов. Принудительный выход из цикла с помощью оператора Exit Do не предусмотрен. Перейти к подробному описанию …
Цикл Do Until… Loop
Цикл Do Until… Loop в VBA Excel предназначен для повторения блока операторов пока не выполняется заданное условие (возвращается значение False). Этот цикл позволяет проверять условие как до, так и после выполнения операторов. Предусмотрен принудительный выход из цикла с помощью оператора Exit Do. Перейти к подробному описанию …
Цикл For Each… Next
Цикл For Each… Next в VBA Excel предназначен для выполнения блока операторов по отношению к каждому элементу из группы элементов (диапазон, массив, коллекция). Предусмотрен принудительный выход из цикла с помощью оператора Exit For. Перейти к подробному описанию …
VBA Excel. Цикл Do While… Loop
Цикл Do While… Loop в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла Do While… Loop.
Цикл Do While… Loop в VBA Excel предназначен для повторения блока операторов пока выполняется заданное условие (возвращается значение True). Синтаксис этого цикла аналогичен синтаксису цикла Do Until… Loop, который повторяется до тех пор, пока условие не выполняется (возвращается значение False).
Синтаксис цикла Do While… Loop
Синтаксис цикла Do While… Loop существует в двух вариантах, определяющих, когда проверяется условие.
Условие проверяется до выполнения операторов:
Do While condition [ statements ] [ Exit Do ] [ statements ] Loop |
Условие проверяется после выполнения операторов:
Do [ statements ] [ Exit Do ] [ statements ] Loop While condition |
В квадратных скобках указаны необязательные атрибуты цикла Do While… Loop.
Компоненты цикла Do While… Loop
Компонент | Описание |
condition | Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean. |
statements | Необязательный* атрибут. Операторы вашего кода. |
Exit Do | Необязательный атрибут. Оператор выхода** из цикла до его окончания. |
*Если не использовать в цикле свой код, смысл применения цикла теряется.
**Очень полезный оператор для цикла Do While… Loop, так как при некоторых обстоятельствах он может стать бесконечным. Если такой риск существует, следует предусмотреть возможность выхода из бесконечного цикла VBA с помощью оператора Exit Do.
Примеры циклов Do While… Loop
Простейшие циклы
Цикл Do While… Loop с условием до исполняемых операторов:
Sub test1() Dim a As Byte Do While a < 10 a = a + 1 Loop MsgBox a End Sub |
Цикл Do While… Loop с условием после исполняемых операторов:
Sub test2() Dim a As Byte Do a = a + 1 Loop While a < 10 MsgBox a End Sub |
В обоих случаях окно 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», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.
Sub test3() Dim i As Long, n As Long i = 2 n = 100 Do While Cells(i, 1) <> «» If Cells(i, 2) = «Белка 1» Then n = n — Cells(i, 3) Else n = n + Cells(i, 4) End If i = i + 1 Loop MsgBox n End Sub |
Результат, выведенный в информационном сообщении MsgBox, будет равен 40. Вы можете скопировать таблицу на рабочий лист книги Excel и поэкспериментировать с кодом VBA.
Бесконечный цикл и Exit Do
Пример бесконечного цикла:
Sub test4() Dim a As Byte Do While a < 10 a = a + 1 If a = 9 Then a = 0 End If Loop End Sub |
При запуске этой процедуры цикл Do While… Loop начинает выполняться бесконечно. Мне приходилось останавливать бесконечные циклы VBA в Excel 2000 и Excel 2016. В Excel 2000 помогло сочетание клавиш Ctrl+Break, а в Excel 2016 при закрытии редактора VBA крестиком появляется окно:
Информационное окно «Microsoft Excel не отвечает»
Ожидать отклика программы нет смысла, поэтому нажимаем «Перезапустить программу» или «Закрыть программу».
Совет: перед запуском процедуры с циклом Do While… Loop, который может стать бесконечным, обязательно сохраните книгу, иначе, при принудительном закрытии редактора VBA ваши изменения будут утеряны. Кроме того, при принудительном закрытии редактора VBA, Excel может отключить макросы. Включите их в окне «Центр управления безопасностью», открыть которое можно по ссылке «Безопасность макросов» на ленте в разделе «Разработчик». Подробнее о включении макросов в разных версиях Excel читайте в статье: Как разрешить выполнение макросов в Excel?.
Пример использования оператора Exit Do:
Sub test5() Dim a As Byte, n As Long Do While a < 10 a = a + 1 n = n + 1 If a = 9 Then a = 0 End If If n = 1000 Then Exit Do End If Loop MsgBox n End Sub |
Когда число итераций цикла дойдет до 1000, он будет завершен, и информационное сообщение MsgBox выведет на экран число повторений цикла Do While… Loop из этого примера.
VBA Excel. Цикл For Each… Next
Цикл For Each… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For Each… Next.
Цикл For Each… Next в VBA Excel предназначен для выполнения блока операторов по отношению к каждому элементу из группы элементов (диапазон, массив, коллекция). Этот замечательный цикл применяется, когда неизвестно количество элементов в группе и их индексация, в противном случае, более предпочтительным считается использование цикла For…Next.
Синтаксис цикла For Each… Next
For Each element In group [ statements ] [ Exit For ] [ statements ] Next [ element ] |
В квадратных скобках указаны необязательные атрибуты цикла 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 выделите диапазон ячеек и запустите на выполнение следующую процедуру:
Sub test1() Dim element As Range, a As String a = «Данные, полученные с помощью цикла For Each… Next:» For Each element In Selection a = a & vbNewLine & «Ячейка » & element.Address & _ » содержит значение: » & CStr(element.Value) Next MsgBox a End Sub |
Информационное окно MsgBox выведет адреса выделенных ячеек и их содержимое, если оно есть. Если будет выбрано много ячеек, то полностью информация по всем ячейкам выведена не будет, так как максимальная длина параметра Prompt функции MsgBox составляет примерно 1024 знака.
Цикл для коллекции листов
Скопируйте следующую процедуру VBA в стандартный модуль книги Excel:
Sub test2() Dim element As Worksheet, a As String a = «Список листов, содержащихся в этой книге:» For Each element In Worksheets a = a & vbNewLine & element.Index _ & «) » & element.Name Next MsgBox a End Sub |
Информационное окно MsgBox выведет список наименований всех листов рабочей книги Excel по порядковому номеру их ярлычков, соответствующих их индексам.
Цикл для массива
Присвоим массиву список наименований животных и в цикле For Each… Next запишем их в переменную a. Информационное окно MsgBox выведет список наименований животных из переменной a.
Sub test3() Dim element As Variant, a As String, group As Variant group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь») ‘или можно присвоить массиву значения диапазона ячеек ‘рабочего листа, например, выбранного: group = Selection a = «Массив содержит следующие значения:» & vbNewLine For Each element In group a = a & vbNewLine & element Next MsgBox a End Sub |
Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each… Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each… Next.
Sub test4() Dim element As Variant, a As String, group As Variant group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь») ‘или можно присвоить массиву значения диапазона ячеек ‘рабочего листа, например, выделенного: group = Selection a = «Массив содержит следующие значения:» & vbNewLine For Each element In group element = «Попугай» a = a & vbNewLine & element Next MsgBox a End Sub |
Этот код, как и все остальные в этой статье, тестировался в Excel 2016.
Цикл для коллекции подкаталогов и выход из цикла
В этом примере мы будем добавлять в переменную a названия подкаталогов на диске C вашего компьютера. Когда цикл дойдет до папки Program Files, он добавит в переменную a ее название и сообщение: «Хватит, дальше читать не буду! С уважением, Ваш цикл For Each… Next.».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Sub test5() Dim FSO As Object, myFolders As Object, myFolder As Object, a As String ‘Создаем новый FileSystemObject и присваиваем его переменной «FSO» Set FSO = CreateObject(«Scripting.FileSystemObject») ‘Извлекаем список подкаталогов на диске «C» и присваиваем ‘его переменной «myFolders» Set myFolders = FSO.GetFolder(«C:\») a = «Папки на диске C:» & vbNewLine ‘Проходим циклом по списку подкаталогов и добавляем в переменную «a» ‘их имена, дойдя до папки «Program Files», выходим из цикла For Each myFolder In myFolders.SubFolders a = a & vbNewLine & myFolder.Name If myFolder.Name = «Program Files» Then a = a & vbNewLine & vbNewLine & «Хватит, дальше читать не буду!» _ & vbNewLine & vbNewLine & «С уважением,» & vbNewLine & _ «Ваш цикл For Each… Next.» Exit For End If Next Set FSO = Nothing MsgBox a End Sub |
Информационное окно MsgBox выведет список наименований подкаталогов на диске C вашего компьютера до папки Program Files включительно и сообщение цикла о прекращении своей работы.
В результате работы программы будут выведены не только наименования подкаталогов, видимых при переходе в проводнике к диску C, но и скрытые и служебные папки. Для просмотра списка всех подкаталогов на диске C, закомментируйте участок кода от If до End If включительно и запустите выполнение процедуры в редакторе VBA Excel.
Работа с циклами в VBA:loop, for each, for next
Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. В общем случае операторы выполняются последовательно: сначала выполняется первый оператор в функции, затем второй и т. Д.
Языки программирования предоставляют различные структуры управления, которые обеспечивают более сложные пути выполнения.
Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз. Ниже приведен общий вид оператора цикла в VBA.
VBA предоставляет следующие типы циклов для обработки требований циклирования. Нажмите следующие ссылки, чтобы проверить их детали.
for цикл
Цикл for — это структура управления повторением, которая позволяет разработчику эффективно писать цикл, который необходимо выполнить определенное количество раз.
Синтаксис
Ниже приведен синтаксис цикла for в VBA.
For counter = start To end [Step stepcount] [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] .... [statement n] Next
Диаграмма потока
Ниже приведен поток управления в режиме Loop —
- Первый шаг выполняется. Этот шаг позволяет инициализировать любые переменные управления контурами и увеличивать переменную счетчика шагов.
- Во-вторых, условие оценивается. Если это правда, выполняется тело цикла. Если оно ложно, тело цикла не выполняется, и поток управления переходит к следующему оператору сразу после цикла For.
- После выполнения цикла цикла For поток управления переходит к следующему оператору. Этот оператор позволяет вам обновлять любые переменные управления циклом. Он обновляется на основе значения счетчика шагов.
- Условие теперь оценивается снова. Если это правда, цикл выполняется, и процесс повторяется (тело цикла, затем увеличивают шаг, а затем снова условие). После того, как условие становится ложным, цикл For заканчивается.
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 MsgBox "The value is i is : " & i Next End Sub
Когда приведенный выше код компилируется и выполняется, он производит следующий результат.
The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 6
The value is i is : 8
The value is i is : 10
Выполняет последовательность операторов несколько раз и сокращает код, управляющий переменной цикла.
for … loop
Для каждого цикла используется для выполнения оператора или группы операторов для каждого элемента в массиве или коллекции.
Для каждого цикла аналогичен For Loop; однако цикл выполняется для каждого элемента в массиве или группе. Следовательно, счетчик шагов не будет существовать в этом типе цикла. Он в основном используется с массивами или используется в контексте объектов файловой системы, чтобы работать рекурсивно.
Синтаксис
Ниже приведен синтаксис цикла For Each в VBA.
For Each element In Group [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] Next
пример
Private Sub Constant_demo_Click() 'fruits is an array fruits = Array("apple", "orange", "cherries") Dim fruitnames As Variant 'iterating using For each loop. For Each Item In fruits fruitnames = fruitnames & Item & Chr(10) Next MsgBox fruitnames End Sub
Когда вышеуказанный код выполняется, он печатает все имена фруктов с одним элементом в каждой строке.
apple
orange
cherries
Это выполняется, если в группе есть хотя бы один элемент и повторяется для каждого элемента в группе.
while..wend loop
В цикле While While … Wend , если условие равно True, все операторы выполняются до тех пор, пока не встретится ключевое слово Wend.
Если условие ложно, цикл завершается, и элемент управления переходит к следующему оператору после ключевого слова Wend .
Синтаксис
Ниже приведен синтаксис цикла While..Wend в VBA.
While condition(s) [statements 1] [statements 2] ... [statements n] Wend
Диаграмма потока
пример
Private Sub Constant_demo_Click() Dim Counter : Counter = 10 While Counter < 15 ' Test value of Counter. Counter = Counter + 1 ' Increment Counter. msgbox "The Current Value of the Counter is : " & Counter Wend ' While loop exits if Counter Value becomes 15. End Sub
Когда вышеуказанный код выполняется, он выводит следующее в поле сообщения.
The Current Value of the Counter is : 11
The Current Value of the Counter is : 12
The Current Value of the Counter is : 13
The Current Value of the Counter is : 14
The Current Value of the Counter is : 15
Это проверяет условие перед выполнением тела цикла.
Цикл do..while
Do … while цикл используется, когда мы хотим повторить набор операторов, пока условие истинно. Условие может быть проверено в начале цикла или в конце цикла.
Синтаксис
Ниже приведен синтаксис цикла Do … While в VBA.
Do While condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop
Диаграмма потока
пример
В следующем примере используется цикл Do … while для проверки состояния в начале цикла. Операторы внутри цикла выполняются, только если условие становится True.
Private Sub Constant_demo_Click() Do While i < 5 i = i + 1 msgbox "The value of i is : " & i Loop End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 1
The value of i is : 2
The value of i is : 3
The value of i is : 4
The value of i is : 5
Альтернативный синтаксис
Существует также альтернативный синтаксис для Do … while loop, который проверяет состояние в конце цикла. Основное различие между этими двумя синтаксисами объясняется в следующем примере.
Do [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop While condition
пример
В следующем примере используется цикл Do … while для проверки состояния в конце цикла. Заявления внутри цикла выполняются хотя бы один раз, даже если условие False.
Private Sub Constant_demo_Click() i = 10 Do i = i + 1 MsgBox "The value of i is : " & i Loop While i < 3 'Condition is false.Hence loop is executed once. End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 11
Операторы do..While будут выполняться до тех пор, пока условие равно True. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет False.
do..intil loop
Do … intil цикл не будет использован, когда мы хотим повторить набор операторов, пока условие ложно. Условие может быть проверено в начале цикла или в конце цикла.
Синтаксис
Ниже приведен синтаксис цикла Do..Until в VBA.
Do Until condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop
Диаграмма потока
пример
В следующем примере используется Do … До цикла, чтобы проверить условие в начале цикла. Операторы внутри цикла выполняются только в том случае, если условие ложно. Он выходит из цикла, когда условие становится истинным.
Private Sub Constant_demo_Click() i = 10 Do Until i>15 'Condition is False.Hence loop will be executed i = i + 1 msgbox ("The value of i is : " & i) Loop End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 11
The value of i is : 12
The value of i is : 13
The value of i is : 14
The value of i is : 15
The value of i is : 16
Альтернативный синтаксис
Существует также альтернативный синтаксис Do … До цикла, который проверяет условие в конце цикла. Основное различие между этими двумя синтаксисами объясняется следующим примером.
Do [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop Until condition
Диаграмма потока
пример
В следующем примере используется Do … До цикла, чтобы проверить условие в конце цикла. Операторы внутри цикла выполняются хотя бы один раз, даже если условие равно True.
Private Sub Constant_demo_Click() i = 10 Do i = i + 1 msgbox "The value of i is : " & i Loop Until i more15 'Condition is True.Hence loop is executed once. End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 11
Операторы do..Until будут выполняться до тех пор, пока условие False. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет истинным.
Записи управления циклом
Операторы управления циклом изменяют исполнение из своей обычной последовательности. Когда выполнение выходит из области действия, все остальные операторы цикла не выполняются.
Контрольное заявление и описание
Выход для оператора
Выход for используется , когда мы хотим , чтобы выйти из For Loop на основе определенных критериев. Когда Exit For выполняется, управление переходит к следующему оператору сразу после цикла For Loop.
Синтаксис
Ниже приведен синтаксис Exit For Statement в VBA.
Диаграмма потока
пример
В следующем примере используется Exit For . Если значение счетчика достигает 4, цикл For Loop завершается, и управление переходит к следующему утверждению сразу после цикла For Loop.
Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 'i is the counter variable and it is incremented by 2 MsgBox ("The value is i is : " & i) If i = 4 Then i = i * 10 'This is executed only if i=4 MsgBox ("The value is i is : " & i) Exit For 'Exited when i=4 End If Next End Sub
Когда вышеуказанный код выполняется, он печатает следующий вывод в окне сообщений.
The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 40
Завершает оператор цикла For и передает выполнение в оператор сразу после цикла
Exit Do
Exit Do Заявление используется , когда мы хотим , чтобы выйти из Do Loops на основе определенных критериев. Он может использоваться как в Do Do … While, так и Do … До циклов.
Когда Exit Do выполняется, управление переходит к следующему оператору сразу после Do Loop.
Синтаксис
Ниже приведен синтаксис выражения Exit Do в VBA.
пример
В следующем примере используется Exit Do . Если значение счетчика достигает 10, выходная линия Do завершается, и управление переходит к следующему оператору сразу после цикла For Loop.
Private Sub Constant_demo_Click() i = 0 Do While i <= 100 If i > 10 Then Exit Do ' Loop Exits if i>10 End If MsgBox ("The Value of i is : " & i) i = i + 2 Loop End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The Value of i is : 0
The Value of i is : 2
The Value of i is : 4
The Value of i is : 6
The Value of i is : 8
The Value of i is : 10
Завершает оператор Do While и передает выполнение в оператор сразу после цикла
С уважением, авторы сайта Компьютерапия
Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!
Циклы в Visual Basic.NET
Циклы
Последнее обновление: 30.10.2015
Еще одним видом управляющих конструкций являются циклы. В VB.NET используется несколько видов циклов.
For…Next
For Each…Next
While
Do
Цикл For…Next
В этом цикл выполняется определенное число раз, причем это число задается счетчиком:
For i As Integer = 1 To 9 Console.WriteLine("Квадрат числа {0} равен {1}", i, i * i) Next
Здесь переменная i выполняет роль счетчика. После слова To мы помещаем максимальное значение счетчика. При каждом цикле значение счетчика увеличивается
на единицу. И это значение сравнивается со значением после To. Если эти два значения равны, то цикла прекращает свою работу.
При работе с циклами мы можем увеличивать значение счетчика при каждом проходе не только на единицу, но и вообще на любое число. Для этого
нужно либо использовать ключевое слово Step и после него указать шаг цикла, на который будет увеличиваться значение счетчика, либо можно
увеличивать счетчик непосредственно в цикле:
For i As Integer = 1 To -9 Step -1 For j As Integer = 1 To 9 Console.WriteLine("Произведение чисел i и j равно {0}", i * j) j += 1 Next Next
Обратите внимание, что в качестве шага в первом цикле выбрано отрицательное значение и значение счетчика с каждым проходом уменьшается на единицу.
Во внутреннем цикле счетчик j при каждом проходе увеличивается на 2, так как он по умолчанию увеличивается на единицу, и еще мы явным образом увеличиваем его в цикле на единицу.
В итоге внутренний цикл отрабатывает пять раз, а внешний девять, то есть фактически получается 45 циклов.
Цикл For Each…Next
Цикл For Each осуществляет перебор элементов в определенной группе, например, в массиве или в коллекции. Предположим у нас есть некоторый массив
типа Integer и нам надо инициализировать этот массив случайными значениями и затем вывести все его элементы на экран:
'Создаем массив из пяти чисел Dim nums(4) As Integer Dim r As New Random() 'инициализируем массив For i As Integer = 0 To nums.Length - 1 nums(i) = r.Next(100) Next 'Выводим элементы массива For Each i As Integer In nums Console.Write("{0} ", i) Next
В выражении For Each мы сначала указываем переменную, которая будет принимать значения элементов массива. А после ключевого слова In
указываем группу, в которой надо перебрать все элементы.
Цикл While
В цикл While выполняется до тех пор, пока соблюдается определенное условие, указанное после слова While:
Dim j As Integer = 10 While j > 0 Console.WriteLine(j) j -= 1 End While
Цикл Do
Цикл Do, также как и цикл While, выполняется, пока соблюдается определенное условие. Однако он имеет разные формы. Так, в следующем примере
сначала проверяется условие, а затем выполняется блок кода, определенный в цикле:
Dim j As Integer = 10 Do While j > 0 Console.WriteLine(j) j -= 1 Loop
В данном случае цикл выполняется, пока значение j больше нуля. Но есть еще одна запись, где вместо слова While используется слово
Until, а цикл выполняется пока не соблюдено определенное условие, то есть пока значение j не станет меньше нуля:
Dim j As Integer = 10 Do Until j < 0 Console.WriteLine(j) j -= 1 Loop
Если изначально условие, заданное в цикле, неверно, то цикл не будет работать. Но мы можем определить проверку в конце цикла, и таким образом,
наш цикл как минимум один раз отработает:
Dim j As Integer = -1 Do Console.WriteLine(j) j -= 1 Loop Until j < 0 'либо Do Console.WriteLine(j) j -= 1 Loop While j > 0
Операторы Continue и Exit
Нередко возникает необходимость не дожидаться окончания цикла, а сразу же выйти из цикла, в случае соблюдения определенного условия. Для
этого используют оператор Exit, после которого указывают тип цикла, из которого осуществляется выход, например, Exit Do (Exit While)
:
Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 To 100 num -= 1 If num < 50 Then Exit For Next Console.WriteLine(num)
Существует и другая задача — осуществить выход не из цикла, а из текущего прохода или итерации и перейти к следующему. Для этого используют
оператор Continue, после которого указывают тип цикла, из которого осуществляется выход, например, Continue While
:
Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 To 10 num -= 7 If num < 50 AndAlso num > 25 Then Continue For End If Console.WriteLine(num) Next
В данном случае мы в каждом проходе цикла вычитаем из num число 7 и затем смотрим, не принадлежит ли число num интервалу от 25 до 50.
И если принадлежит, переходим к новой итерации цикла, а если нет, то выводим его на экран.
Vba прервать цикл for
Выходит из процедуры или блока и немедленно передает управление оператору после вызова процедуры или определения блока. Exits a procedure or block and transfers control immediately to the statement following the procedure call or the block definition.
Синтаксис Syntax
Операторы Statements
Exit Do
Немедленно выходит из цикла Do , в котором он отображается. Immediately exits the Do loop in which it appears. Выполнение продолжится с оператора, следующего за оператором Loop . Execution continues with the statement following the Loop statement. Exit Do можно использовать только в цикле Do . Exit Do can be used only inside a Do loop. При использовании внутри вложенных циклов Do Exit Do выходит из внутреннего цикла и передает управление следующему более высокому уровню вложенности. When used within nested Do loops, Exit Do exits the innermost loop and transfers control to the next higher level of nesting.
Exit For
Немедленно выходит из цикла For , в котором он отображается. Immediately exits the For loop in which it appears. Выполнение продолжится с оператора, следующего за оператором Next . Execution continues with the statement following the Next statement. Exit For можно использовать только в цикле For . Next или For Each . Next . Exit For can be used only inside a For . Next or For Each . Next loop. При использовании внутри вложенных циклов For Exit For выходит из внутреннего цикла и передает управление следующему более высокому уровню вложенности. When used within nested For loops, Exit For exits the innermost loop and transfers control to the next higher level of nesting.
Exit Function
Немедленно завершает работу Function процедуры, в которой она отображается. Immediately exits the Function procedure in which it appears. Выполнение продолжится с оператора, следующего за инструкцией, вызвавшей Function процедуру. Execution continues with the statement following the statement that called the Function procedure. Exit Function можно использовать только внутри процедуры Function . Exit Function can be used only inside a Function procedure.
Чтобы указать возвращаемое значение, можно присвоить значение имени функции в строке перед оператором Exit Function . To specify a return value, you can assign the value to the function name on a line before the Exit Function statement. Чтобы присвоить возвращаемое значение и выйти из функции в одной инструкции, можно использовать оператор return. To assign the return value and exit the function in one statement, you can instead use the Return Statement.
Exit Property
Немедленно завершает работу Property процедуры, в которой она отображается. Immediately exits the Property procedure in which it appears. Выполнение продолжится с оператора, вызвавшего Property процедуру, то есть с инструкцией, запрашивающей или задавая значение свойства. Execution continues with the statement that called the Property procedure, that is, with the statement requesting or setting the property’s value. Exit Property можно использовать только внутри Get или Set процедуры свойства. Exit Property can be used only inside a property’s Get or Set procedure.
Чтобы указать возвращаемое значение в Get процедуре, можно присвоить значение имени функции в строке перед инструкцией Exit Property . To specify a return value in a Get procedure, you can assign the value to the function name on a line before the Exit Property statement. Чтобы присвоить возвращаемое значение и выйти из процедуры Get в одном операторе, можно использовать инструкцию Return . To assign the return value and exit the Get procedure in one statement, you can instead use the Return statement.
В Set ной процедуре инструкция Exit Property эквивалентна инструкции Return . In a Set procedure, the Exit Property statement is equivalent to the Return statement.
Exit Select
Немедленно завершает работу блока Select Case , в котором он отображается. Immediately exits the Select Case block in which it appears. Выполнение продолжится с оператора, следующего за оператором End Select . Execution continues with the statement following the End Select statement. Exit Select можно использовать только внутри инструкции Select Case . Exit Select can be used only inside a Select Case statement.
Exit Sub
Немедленно завершает работу Sub процедуры, в которой она отображается. Immediately exits the Sub procedure in which it appears. Выполнение продолжится с оператора, следующего за инструкцией, вызвавшей Sub процедуру. Execution continues with the statement following the statement that called the Sub procedure. Exit Sub можно использовать только внутри процедуры Sub . Exit Sub can be used only inside a Sub procedure.
В Sub ной процедуре инструкция Exit Sub эквивалентна инструкции Return . In a Sub procedure, the Exit Sub statement is equivalent to the Return statement.
Exit Try
Немедленно завершает работу Try или Catch блока, в котором он отображается. Immediately exits the Try or Catch block in which it appears. Выполнение продолжится в блоке Finally , если таковой имеется, или с оператором, который следует в противном случае с оператором End Try . Execution continues with the Finally block if there is one, or with the statement following the End Try statement otherwise. Exit Try можно использовать только в блоке Try или Catch , а не в блоке Finally . Exit Try can be used only inside a Try or Catch block, and not inside a Finally block.
Exit While
Немедленно выходит из цикла While , в котором он отображается. Immediately exits the While loop in which it appears. Выполнение продолжится с оператора, следующего за оператором End While . Execution continues with the statement following the End While statement. Exit While можно использовать только в цикле While . Exit While can be used only inside a While loop. При использовании внутри вложенных циклов While Exit While передает управление циклу, который является одним вложенным уровнем над циклом, где происходит Exit While . When used within nested While loops, Exit While transfers control to the loop that is one nested level above the loop where Exit While occurs.
Заметки Remarks
Не путайте Exit инструкции с операторами End . Do not confuse Exit statements with End statements. Exit не определяет конец инструкции. Exit does not define the end of a statement.
Пример Example
В следующем примере условие цикла останавливает цикл, если index ая переменная больше 100. In the following example, the loop condition stops the loop when the index variable is greater than 100. Однако оператор If в цикле приводит к тому, что инструкция Exit Do останавливает цикл, когда переменная индекса больше 10. The If statement in the loop, however, causes the Exit Do statement to stop the loop when the index variable is greater than 10.
Пример Example
В следующем примере возвращаемое значение присваивается имени функции myFunction , а затем для возврата из функции используется Exit Function . The following example assigns the return value to the function name myFunction , and then uses Exit Function to return from the function:
Пример Example
В следующем примере оператор return используется для назначения возвращаемого значения и выхода из функции: The following example uses the Return Statement to assign the return value and exit the function:
Циклы в VBA
Смотрите также = «списать» Next Do While (ZКазанский n = n выйти вон.Сам много раз: Спасибо! совсем хорошо (вернее, как только не GoTo 1 ‘ЕслиЦипихович Эндрю
Однако, как было показано
- бы не выполнялся
- выводятся последовательно числа
- объектов. В следующем
В приведённом выше примереВстречаются ситуации, когда от i Next j
Оператор цикла «For» в Visual Basic
— 0.001) >: + j ZKirill Gureev слышал, что использованиеЦипихович Эндрю не работает, хотя вводил этот шаг Х=2 If 3: ну или GoTo в примерах цикла
Цикл «For … Next»
ни разу. Фибоначчи не превышающие примере при помощи шаг приращения цикла программы VBA требуется End SubВопрос: как 0 j =sheill = m *: Понятно, спасибо. этого считается вероломным!
: может я что-то вроде алгоритм тот Это для комментария * X - и метка куда
Do WhileДругой способ реализовать цикл 1000: цикла не указан, поэтому совершить несколько раз прописать что бы j + 1, i ^ 2Думаю, что правильныеFor i=1 to не допонимаю, но же, но шаг (на русском «,» 6 = 3 надо, в некоторых ситуациях
Do While’Процедура Sub выводитFor Each для пошагового увеличения подряд один и при первом выполнении n = nЯ просто привел * n * GOTO, наверное, оптимальный 10 for j=1 если указанное писать меньше). Он почему-то а на англ Then Label5.Caption =Novichek =) нужно, чтобы цикл– поместить условие числа Фибоначчи, не
выполняется перечисление всех переменной тот же набор условия If не + j Z
пример, зачем ты 4.5 / ((i вариант. to 10 for оно тут же пролетает Х=2 и «.») X: GoTo 1: был выполнен хотя не в начале,
превышающие 1000 Sub листов в текущейi действий (то есть
продолжался перебор i = m * пишешь 0.001 * j) ^Максим Зеленский
k=1 to 10 превращается в Const Х=3, и лейблахСпасибо за совет! ‘Если Х=1 NextКазанский бы один раз, а в конце
Цикл «For Each»
Fibonacci() Dim i рабочей книге Excel:от 1 до повторить несколько раз при j=1 а i ^ 2У тебя цикл 3) Next j: Можно выпрыгивать на for m=1 to Z = 0.0000000001 4 и 5Ципихович Эндрю X End Sub, : Exit For не зависимо от цикла. В этом As Integer ‘счётчикDim wSheet As
10 по умолчанию один и тот сразу начинался перебор * n * должен прерваться когда Next i MsgBox
Оператор прерывания цикла «Exit For»
2 и более 10 If Intcor_k_int()А наскоько я возвращает 10,1 (10: может попробовать 110. Ципихович Эндрю он получается совсем первоначального результата условного случае цикл будет для обозначения позиции Worksheet For Each используется приращение же блок кода). по следующему значению 4.5 / ((i Z чему равно? (Z) End SubНО уровней вверх при = True Then понимаю 0.0000000001 и я задавал какКазанский
: Вы просите из цикла выходит? выражения. В таком выполнен хотя бы элемента в последовательности wSheet in Worksheets1 Это может быть j * j) ^sheill
проблема в том, помощи такой конструкции a=a+1 else ‘здесь 0.1 это разные конец интервала).: Не пойму, ва поднимаете метку
Цикл «Do While» в Visual Basic
Label.Caption так и случае условное выражение раз, не зависимо Dim iFib As MsgBox «Найден лист:. Однако, в некоторых сделано при помощиПомогите пожалуйста понять 3) Loop Next: В задание лишь что второй цикл (без использования GoTo): бы хотелось перейти вещи
Novichek =) чем проблема. Если Выше цикла остались пустыми. нужно поместить в от того, выполняется Integer ‘хранит текущее » & wSheet.Name случаях требуется использовать циклов VBA. если не сложно. i MsgBox (Z) указано что нужно должен идти доFro j = на новый витокKirill Gureev: Завис Эксель. Попробовал лейблы не заполняются,надо ниже циклаPrivate Sub CommandButton1_Click() конце цикла, вот ли условие. значение последовательности Dim Next wSheet другие значения приращенияК циклам VBA относятся:Ts.Soft End Subно при вычислить с точностью бесконечности, вернее пока 1 To 10 k, например, а: Прошу подсказки. покопался, с шагом 0,5 значит, условие не или ‘Решения уравнения в так:Схематично такой цикл iFib_Next As IntegerОператор для цикла. ЭтоЦикл For: If Cells(i, 1).Value выполнении выдается пустое e=0.001, я понял значение Z не For k=1 to может витка j но внятного решения работает, а вот выполняется. Что без
Novichek =) форме Dim X1Do . LoopDo While ‘хранит следующее значениеExit For можно сделать приЦикл Do While = Cells(j, 5).Value окно. Во-первых — объявление
так что выполнять достигнет точности e, 10 For m=1 next k ‘ТАК не нашёл. 0,1 не хочет. выхода из цикла,: Private Sub CommandButton1_Click() As Double Dim Until IsEmpty(Cells(iRow, 1))с проверяемым условием
последовательности Dim iStepприменяется для прерывания помощи ключевого словаЦикл Do Until Then Cells(i, 2).Value
переменных. действие пока сумма а как это
Цикл «Do Until» в Visual Basic
to 10 If НЕЛЬЗЯ? end ifКак оформляется следующееКазанский что с выходом. ‘Решения уравнения в X2 As DoubleУрок подготовлен для Вас в конце будет As Integer ‘хранит цикла. Как толькоStepДалее мы подробно рассмотрим = «списать»:Exit ForВо-вторых, зачем писать не станет равна реализовать я не Intcor_k_int() = True next m next действие: есть множество: Это связано сПоставьте точку останова форме Dim X1 Dim X3 As
командой сайта office-guru.ru выглядеть вот так: размер следующего приращения в коде встречается, как показано в каждый из этихForve (Z — 0.001)
0.001. пойму. Помогите разобраться Then a=a+1 Else k next j вложенных циклов, например, конечной точностью вычисления ( As Double Dim Double Dim EИсточник: http://www.excelfunctions.net/VBA-Loops.htmlDo . Loop
‘инициализируем переменные i этот оператор, программа следующем простом примере. циклов.: Ts.Soft, Благодарю, что > 0sheill кому не сложно! bExitK = True next i 4. дробных чисел. ПоставьтеF9 X2 As Double
As Double X1Перевел: Антон Андронов
Выход из цикла на месте выполнения условия
то совсем туплюКогда проще написать: Выполнять действие покаsheill ‘ флаг дляособенно эта ситуацияТребуется при условии такой эксперимент: Sub) перед циклом, запустите Dim X3 As = Val(TextBox1.Text) ‘НачалоАвтор: Антон Андронов 1000 = 1 iFib_Next и переходит к 0 To 10Forвидать перегрелся Z > 0.001 очередной член не: выхода из цикла становится актуальной, если невыполнения какой-либо части bb() Dim x форму, после останова Double Dim E интервала X2 =Novichek =)Цикл = 0 ‘цикл выполнению операторов, находящихся Step 0.1 dTotalв Visual BasicОксана33Ну и третье, станет меньше 0.001.
sheill по k Exit на нескольких циклах перейти на новый For x = пройдите по шагам
As Double X1 Val(TextBox2.Text) ‘конец интервала: Private Sub CommandButton3_Click()Do Until
Do While будет в коде сразу = dTotal + может быть организована: Помогите пож дописать цикл не станетТолько я не, цикл можно задать
For ‘ здесь идёт какая-то проверка. виток, напримет. For 1 To 3.2 ( = Val(TextBox1.Text) ‘Начало E = Val(TextBox3.Text) ‘Решения уравнения вочень похож на выполняться до тех после данного цикла. d Next d в одной из макрос! Нужно найти выполняться, потому что понял, что такое бесконечным, в теле выход из циклаvikttur i=1 to 10 Step 0.1 Debug.PrintF8 интервала X2 = ‘шаг равен 0,1 форме Dim X1 цикл пор, пока значение Это можно использовать,
Так как в приведённом
двух форм: как номер позиции первой изначально Z равна
i во второй цикла проверять какое-то по m End: Так нельзя. for j=1 to x, x -), посмотрите, что происходит. Val(TextBox2.Text) ‘конец интервала For X = As Double DimDo While ‘текущего числа Фибоначчи например, для поиска выше примере задан цикл буквы кириллицы в нулю. сумме значение, и если If Next mВложенные циклы - 10 for k=1 Round(x, 1), 3Novichek =) E = Val(TextBox3.Text) X1 To X2 X2 As Double: блок кода в
не превысит 1000 определённого значения в
шаг приращения равныйFor … Next
строке как напримерПопробуй так:
sheill оно совпало - If bExitK Then тоже ужасы to 10 for * x -: Спасибо! В итоге ‘шаг равен 0,1 Step E If Dim X3 As теле цикла выполняется Do While iFib_Next массиве. Для этого0.1или как цикл mom мамаDim Z As, точность и сумма выйти из цикла Exit For ‘Стройте логику по-другому. m=1 to 10 6 Next End получилось. Как приятно For X = 3 * X Double Dim E раз за разом 0.001 ‘Вычисления по k в Wend и Do хотелось перейти на быть, и значение ‘Решения уравнения в — 6 = For ‘Если Х=2 Val(TextBox4.Text) ‘конец интервала выражения равен последовательности iStep = просматривать остальные нет 0.0, 0.1, 0.2,использует переменную, которая 1) ‘MsgBox M >
As Double Dim = X: GoTo X — 6 ‘шаг равен 0,1). В следующей процедуре
0 Else ‘сохраняем прерывается. 10.0. из заданного диапазона. lett Like «[а-я]» 0 For i знает что должна: Получается вот так, по нормальному завершению: Из цикла m витка j next что число x2 As Double 1 ‘Если Х=2 = 3 Then For X =Sub размер следующего приращения
Применение оператораДля определения шага цикла С каждой сменой Then Exit For = 1 To делать программа, то но при попытке цикла по m по условию выйти k ‘ТАК НЕЛЬЗЯ?0.1
Dim St As Next X 1: Label5.Caption = X: X1 To X2при помощи цикла перед тем, какExit For в VBA можно значения переменной выполняются pos = InStr(st, 8 m =
как запустить выдается ошибка: ‘ . Next но новый виток end if nextможет быть представлено Double x1 =
For X = Exit For ‘Если
Step E IfDo Until перезаписать ‘текущее значениепродемонстрировано в следующем использовать отрицательную величину, действия, заключённые в ActiveCell, lett) MsgBox
m + 1она Overflow. k ‘ здесь
Выход из цикла, переход на новый виток цикла по условию
k просто командой m next k в двоичном виде CDbl(TextBox1.Text) ‘Начало интервала
X1 To X2 Х=1 Next X 3 * Xизвлекаются значения из
последовательности iStep = примере. Здесь цикл например, вот так: теле цикла. Это «Letter is « Do j =должна работать?В чем я операции по нормальному Exit For, а next j next лишь с конечной x2 = CDbl(TextBox2.Text) Step E If End Sub — 6 = всех ячеек столбца iFib iFib = перебирает 100 записейFor i = легко понять из
& lett & j + 1
Могут возникнуть проблемы,
ошибся? завершению цикла по вот что бы i точностью (это бесконечная ‘конец интервала St 3 * XПопробуем 0 Then Label7.CaptionA iFib_Next End If массива и сравнивает 10 To 1
простого примера: » Posision = n = n надо объявить по-человеческиПравильны
Private Sub Forlab() k Next j на виток о
Пример представлен абстрактный, двоичная дробь), и = CDbl(TextBox3.Text) ‘шаг
— 6 =Может я с = X ‘рабочего листа до ‘выводим текущее число каждую со значением Step -1 iArray(i)For i = » & pos + j Z ли мои рассуждения? Dim Z, m,sheill можно после после чисто теоретически понять. при многократном прибавлении For x =
3 Then Label5.Caption GoTo что-то не Х=2 If 3 тех пор, пока
Фибоначчи в столбце переменной
= i Next 1 To 10
‘End If Next
= m * При увеличении, количества n As Double,: Здравствуйте, у меня цикла m ввести
Спасибо. этого числа в x1 To x2 = X: Exit так делаю? * X - в столбце не A активного рабочегоdVal i Total = Total n End Sub i ^ 2 слагаемых, получается что
i, j As есть вот такое ещё раз условиеvikttur цикле ошибка накапливается. Step St If For ‘Если Х=1Private Sub CommandButton1_Click() 6 = 3 встретится пустая ячейка:
листа ‘в строке. Если совпадение найдено,Здесь шаг приращения равен + iArray(i) NextОксана33 * n * сумма(Z) стремится к
Integer m = задание
и опять по: for k=1 toА, например, числа
3 * x Next X End ‘Решения уравнения в Then Label9.Caption =iRow = 1 с индексом i
то цикл прерывается:-1 i: If lett Like 4.5 / ((i нулю, соответственно получим 0 n =Вычислить с точностью Exit For выходить 10 for m=10.5 — 6 = SubРешил сделать разные форме Dim X1 X ‘ Х=3 Do Until IsEmpty(Cells(iRow, Cells(i, 1).Value =For i =, поэтому переменнаяВ этом простом цикле «[а-я]» Then pos * j) ^ что e=0.001-это отличие 0 For i е=0.001: уже на j to 10 If(1/2), 0 Then GoTo циклы тоже не
Выход из цикла по условию
As Double Dim Next X End 1)) ‘Значение текущей iFib ‘вычисляем следующее
1 To 100i
For … Next = InStr(1, ActiveCell,
3) Loop While суммы от нуля, = 1 ToСам пример вHugo Intcor_k_int() = True0.25 1 ‘Если Х=2 помогает X2 As Double SubДоброго всем времени ячейки сохраняется в число Фибоначчи и If dValues(i) =с каждым повторениемиспользуется переменная lett) MsgBox «Letter Z > 0.001 т.е. нужно выполнять 8 m = приложении.: Когда вложенных два Then a=a+1 else(1/4), Next x 1:Согласен не правильно Dim X3 As суток! Хочу обратиться массиве dCellValues dCellValues(iRow) увеличиваем индекс позиции dVal Then IndexVal цикла принимает значенияi is » &
Next i MsgBox сложение, до тех m + 1Вот код который (а больше уже GoTo AA ‘0.375 Label4.Caption = xАпострофф
Double Dim E вот с каким
= Cells(iRow, 1).Value элемента на 1 = i Exit
10, 9, 8,, которая последовательно принимает lett & « (Z)Спасибо, разобрался все пор пока Z-0.001>0.
Do While Z у меня получился:
ужас Exit For ‘(3/8) могут быть For x =: As Double X1 вопросом. Как правильно iRow = iRow iFib_Next = iFib For End If … 1. значения 1, 2, Posision = « работает!Получается вот такой <> 0.001 j Private Sub Forlab()) — один здесь выход из точно представлены в x1 To x2Novichek = Val(TextBox1.Text) ‘Начало
сделать выход из + 1 Loop + iStep i Next i
Цикл 3, … 10, & pos Exit
Forve код: = j +
Dim Z, m, из них можно цикла по m двоичном виде, и Step St If, если ты вводишь интервала X2 = цикла на местеВ приведённом выше примере
= i +ЦиклFor Each и для каждого
For End If: Здравствуйте! Есть такойPrivate Sub Forlab() 1 n =
n As Long, строить как выше end if next
с таким шагом 3 * x шаг именно через Val(TextBox2.Text) ‘конец интервала
выполнения условия? Чтобы условие 1 Loop EndDo Whileпохож на цикл из этих значений
If lett Like простой код: Dim Z, m, n + j i, j As сказали на do-loop, m АА: next выражение вычисляется точно. — 6 = запятую, то используй E = Val(TextBox3.Text) после выполнения цикла
IsEmpty(Cells(iRow, 1)) Sub
выполняет блок кодаFor … Next выполняется код VBA, «[А-Яа-яЁё]» Then MsgBoxSub Сравнить() Range(«B:B»).ClearContents n As Double, Z = m Integer m = и выходить exit kРешение может быть 3 Then GoTocdbl ‘шаг равен 0,1 Label.Caption на форменаходится в началеВ приведённом примере условие до тех пор,, но вместо того, находящийся внутри цикла. «Letter is « For j = i, j As * i ^ 0 n = for/exit doНа GoTo ругаются
такое: задать константу, 2 ‘Если Х=3вместо
1: For X были заполнены?
конструкцииiFib_Next
VBA вложенные циклы, выход из внутреннего цикла
или точку как X2 Step E: If 3 *
, следовательно цикл будет цикла. Поэтому если пример процедуры цикл массива » & n: 1 To 10 0 For i ((i * j) 8 m = так можно выйти конструкциях применять можно. Z=1E-10 ‘. If End SubТолько с разделитель! If 3 * X — 6 выполнен хотя бы бы первое значение
SubFor Each
iArray Exit Forбольшое спасибочки) If Cells(i, 1).Value = 1 To ^ 3) Loop
m + 1 сразу из самогоKirill Gureev abs(3 * x
Как выйти из цикла
шагом 1 всеNovichek =) X — 6 = 0 Then один раз, еслиiFib_Next, в которой при
выполняет набор действийв переменнойа что это = Cells(j, 5).Value 8 m = Next i MsgBox For j = внутреннего на самый: А если без — 6) хорошо, а если: = 0 Then Label7.Caption = X: первая взятая ячейкабыло бы больше
помощи цикла для каждого объектаTotal дает? нельзя ли Then Cells(i, 2).Value m + 1 (Z) End Sub 1 To 8 верх или вообще ТАКИХ ужасов!
Novichek =) 0,1 то неАпострофф Label4.Caption = X: Exit For не пуста. 1000, то цикл
Do While из указанной группы.
Цикл For. Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For. Next.
Цикл For. Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each. Next.
Синтаксис цикла For. Next
В квадратных скобках указаны необязательные атрибуты цикла For. Next.
Компоненты цикла For. Next
Компонент | Описание |
counter | Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла. |
start | Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика. |
end | Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика. |
Step* | Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла. |
step | Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным. |
statements | Необязательный** атрибут. Операторы вашего кода. |
Exit For | Необязательный атрибут. Оператор выхода из цикла до его окончания. |
Next [ counter ] | Здесь counter — необязательный атрибут. Это то же самое имя управляющей переменной цикла, которое можно здесь не указывать. |
*Если атрибут Step отсутствует, цикл For. Next выполняется с шагом по умолчанию, равному 1.
**Если не использовать в цикле свой код, смысл применения цикла теряется.
Примеры циклов For. Next
Вы можете скопировать примеры циклов в свой модуль VBA, последовательно запускать их на выполнение и смотреть результаты.
Простейший цикл
Заполняем десять первых ячеек первого столбца активного листа Excel цифрами от 1 до 10:
Простейший цикл с шагом
В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:
Цикл с отрицательными аргументами
Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:
Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:
Вложенный цикл
Внешний цикл последовательно задает индексы первых десяти строк активного листа, а вложенный цикл складывает числа в первых четырех ячейках строки с текущем индексом и записывает сумму в ячейку пятого столбца. Перед запуском вложенного цикла с накопительным сложением, пятую ячейку соответствующей строки обнуляем, чтобы в случае нахождения в ней какого-либо числа, оно не прибавилось к итоговой сумме.
Выход из цикла
В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For. Next:
Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».
Результат работы циклов For. Next из примеров:
Результат работы циклов For. Next
Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For. Next.
Цикл с дробными аргументами
Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:
В результате вычисления значения переменной вне цикла или выражения внутри его может получиться дробный результат. VBA Excel округлит его до целого числа, используя бухгалтерское округление:
VBA для цикла и для каждого цикла
Циклы являются основой автоматизации VBA. Циклы For и For Each VBA — это наиболее часто используемые типы циклов для повторяющихся процедур. В этом посте давайте узнаем все, что нужно знать о циклах VBA For Loop и VBA For Each Loop, а также о преимуществах и недостатках обоих.
VBA для цикла
Цикл For — это область действия, которая определяет список операторов, которые будут выполняться повторно определенное количество раз.Цикл For является наиболее часто используемым циклом для ситуаций, когда количество итераций известно до выполнения цикла (по сравнению с циклами While и Do until).
Как объявить цикл For:
Для счетчика = от начала до конца [Step StepIncrement]
‘… Код здесь …
Далее [Счетчик]
For Counter = Start To End [Step StepIncrement] ‘… Код здесь … Next [Counter] |
Артикул | Описание |
---|---|
Счетчик | Это числовая переменная, индекс счетчика цикла.Это могут быть только типы данных VBA Native (например, Long, Integer, Double и т. Д.). |
Начало и конец | Начальное значение счетчика и конечное значение счетчика |
Шаг | Заявление, указывающее, что будет определен шаг StepIncrement между приращениями |
StepIncrement | Необязательно, по умолчанию 1. Определенный шаг между значениями счетчика .Например. для Шаг 2 значение счетчика будет увеличено на 2 вместо 2 |
VBA Например
Ниже простого цикла VBA Например:
Dim i as Long
Для i = от 1 до 5
Отладка.Печать i
Далее я
‘Результат: 1,2,3,4,5
Dim i as Long For i = 1 To 5 Debug.Print i Next i ‘Результат: 1,2,3,4,5 |
Также можно выполнить цикл назад на , обеспечивая начальное значение выше конечного значения :
Dim i as Long
Для i = от 3 до 1
Отлаживать.Распечатать i
Далее я
Результат: 3,2,1
Dim i as Long For i = 3 To 1 Debug.Print i Next i ‘Результат: 3,2,1 |
VBA для примера с шагом
Ниже простого VBA Например, с определенным циклом Step :
Dim i as Long
Для i = от 1 до 5 Шаг 3
Отладка.Печать i
Далее я
‘Результат: 1,4
Dim i as Long For i = 1 to 5 Step 3 Debug.Печать i Далее i ‘Результат: 1,4 |
Значение шага также может быть отрицательным , что дает вам возможность вернуться назад:
Dim i as Long
Для i = 5: 1 Шаг -3
Отладка.Печать i
Далее я
Результат: 5,2
Dim i as Long For i = 5 To 1 Step -3 Debug.Print i Next i ‘Результат: 5,2 |
VBA для каждого цикла
Цикл VBA For Each — это область, определяющая список статусов, которые должны повторяться для всех элементов, указанных в определенной коллекции / массиве элементов.Цикл For Each, по сравнению с циклом For, не может использоваться для итерации из диапазона значений, заданного начальным и конечным значениями.
Как объявить цикл для каждого:
Для каждого итератора в элементах
‘… Код здесь …
Далее [итератор]
Для каждого итератора в элементах ‘… Код здесь … Далее [итератор] |
Артикул | Описание |
---|---|
Итератор | Итерационная переменная.Используется для перебора элементов коллекции или массива |
Артикул | Коллекция или массив предметов |
Далее | Оператор закрытия цикла. При желании вы можете указать Iterator переменную |
VBA Для каждого примера
Ниже простой пример для каждого:
Dim x (3) как Long, xIterator как Variant
х (0) = 1: х (1) = 2: х (2) = 3
Для каждого xIterator в x
Отлаживать.Распечатать x
Следующий xIterator
‘Результат: 1,2,3
Dim x (3) как Long, xIterator как вариант x (0) = 1: x (1) = 2: x (2) = 3 Для каждого xIterator в x Debug.Print x Следующий xIterator ‘Результат: 1,2,3 |
Цикл For Each Loop проще в использовании в том смысле, что вам не нужно указывать начальное и конечное значение переменной. Однако цикл For Each — это коварный цикл ! Использование цикла For Each Loop в некоторых случаях требует высокой производительности.Перейдите к разделу «За против», чтобы понять опасность использования «Для каждого».
Продолжить и выйти для циклов
Продолжить для петли
Оператор Continue в циклах — это оператор, который позволяет пропустить все оставшиеся операторы в текущей итерации цикла и перейти к следующей итерации цикла. Однако по сравнению с Visual Basic VBA (Visual Basic для приложений) не имеет эквивалента инструкции Continue For . К счастью, существует как минимум два способа имитации оператора Continue For.
Вариант 1: Использовать, если
Для i = от 1 до 10
‘… Код здесь …
Если нет (continue_boolean_statement), то
‘… Код непродолжения здесь …
Конец, если
Далее я
Для i = от 1 до 10 ‘… Код здесь … Если нет (continue_boolean_statement), то ‘ … Код без продолжения здесь … Конец, если Далее i |
continue_boolean_statement — это логическое условие для перехода к следующей итерации, например «i> 10».
Вариант 2: Перейти с помощью Goto
Для i = от 1 до 10
‘… Код здесь …
Если continue_boolean_statement, тогда Goto ContinueForLoop
‘… Код непродолжения здесь …
ContinueForLoop:
Далее я
Для i = от 1 до 10 ‘… Код здесь … Если continue_boolean_statement, то Goto ContinueForLoop ‘ … Код без продолжения здесь … ContinueForLoop: Далее i |
ContinueForLoop — это оператор перехода к метке.Оба подхода эквивалентны, однако оператор Goto широко не приветствуется в мире разработки программного обеспечения, поскольку он очень подвержен ошибкам.
Выход для цикла
Оператор Exit может использоваться не только для циклов (включая цикл For), но и для других областей, таких как подпрограммы и функции. Оператор Exit немедленно выйдет из текущей области выполнения .
Пример выхода для цикла:
Для i = от 1 до 10
‘… Код здесь …
Если continue_boolean_stament), то Goto EndForLoop
‘… Код непродолжения здесь …
EndForLoop:
Далее я
Для i = от 1 до 10 ‘… Код здесь … Если continue_boolean_stament), то Goto EndForLoop ‘ … Код без продолжения здесь … EndForLoop: Next i |
Производительность
Важно помнить, что цикл For и For Each обычно используется в разных обстоятельствах.Есть также несколько ограничений на использование обоих. Давайте сначала перечислим некоторые из этих ключевых различий и сходств:
- Циклы For и For Each могут использоваться для перебора коллекций и массивов
- Только цикл For можно использовать для перебора диапазона указанных значений, например. 1 к 10
- Только цикл For может использоваться для замены элементов повторяющейся коллекции или массива
Обычно цикл For может заменять любой цикл For Each, но не наоборот.С другой стороны, при работе с коллекциями элементов удобнее использовать цикл For Each без необходимости индексировать коллекцию элементов. Но это всего лишь возможности обоих подходов. А как насчет производительности? Есть ли снижение производительности при использовании цикла For или For Each? Какой быстрее и когда?
Производительность
Есть несколько ситуаций, когда вам нужно варьировать использование For vs For Each, глядя на производительность (время выполнения).2 операции = 100 млн.
Для петли
Инициализация специально пропущена.
Размер x (10000) до длины, y (10000) до длины
‘…
Для i = LBound (x) To UBound (x)
Для j = LBound (y) To UBound (y)
res = x (i) Mod y (j)
Следующий j
Далее я
Dim x (10000) As Long, y (10000) As Long ‘… For i = LBound (x) To UBound (x) For j = LBound (y) To UBound (y) res = x (i) Mod y (j) Next j Next i |
для каждой петли
Инициализация специально пропущена.
Размер x (10000) до длины, y (10000) до длины, tmpX, tmpY
‘…
Для каждого tmpX In x
Для каждого tmpY In y
res = tmpX Mod tmpY
Следующий tmpY
Следующий tmpX
Dim x (10000) As Long, y (10000) As Long, tmpX, tmpY ‘… Для каждого tmpX In x Для каждого tmpY In y res = tmpX Mod tmpY Next tmpY Далее tmpX |
Результаты
Массивы: For vs For Each
Из приведенных выше результатов кажется, что цикл VBA For Each был намного медленнее, чем цикл For. Цикл For Loop был почти в 3 раза быстрее, чем аналогичный цикл For Each! Надеюсь, это доказывает, что цикл For Each не рекомендуется для обхода массивов VBA. Итак, победитель этого раунда…
Цикл по коллекциям
Мы снова рассмотрим тот же пример для проверки производительности For vs For Each. Каждая коллекция объектов будет содержать 1000 элементов. Следовательно, всего будет 1000 * 1000 = 1 миллион операций Mod.
Для петли
Инициализация специально пропущена.
Dim x как Collection, y как Collection
‘…
Для i = от 1 до 1000
Для j = от 1 до 1000
res = x.Item (i) Mod y.Item (j)
Следующий j
Далее я
Dim x as Collection, y as Collection ‘… For i = 1 To 1000 For j = 1 To 1000 res = x.Item (i) Mod y.Item (j) Далее j Далее i |
для каждой петли
Инициализация специально пропущена.
Dim x как Collection, y как Collection, tmpX как Variant, tmpY как Variant
‘…
Для каждого tmpX In x
Для каждого tmpY In y
res = tmpX Mod tmpY
Следующий tmpY
Следующий tmpX
Dim x as Collection, y as Collection, tmpX as Variant, tmpY as Variant ‘… For Each tmpX In x For Each tmpY In y res = tmpX Mod tmpY Next tmpY Далее tmpX |
Результаты
Коллекция
: For vs For Each
Из приведенных выше результатов кажется, что цикл For в VBA был намного медленнее, чем цикл For Each.Цикл For Each определенно важен, когда дело доходит до цикла по коллекциям. На этот раз разница в производительности еще более существенная, поскольку цикл For Each был почти в 27 раз быстрее, чем цикл For! Итак, победитель этого раунда…
.
VBA While Loop — Полное руководство
«Теперь… Мы идем в петлю» — Рамакришна, Источники индийской мудрости
Этот пост представляет собой полное руководство по циклам VBA Do While и VBA While . (Если вам нужна информация о циклах VBA For и For Each, перейдите сюда)
Цикл VBA While существует, чтобы сделать его совместимым со старым кодом. Однако Microsoft рекомендует использовать Do Loop , поскольку он более «структурирован и гибок».Обе эти петли рассматриваются в этом посте.
Краткое руководство для этих петель см. В таблице кратких руководств ниже.
Если вы ищете что-то конкретное, вы можете проверить содержание ниже (если его не видно, щелкните заголовок сообщения).
Краткое руководство по циклам while на VBA
Формат цикла | Описание | Пример |
---|---|---|
Делай, пока… Цикл | Выполняется 0 или более раз, пока выполняется условие | Do While result = «Correct» Цикл |
Do … Loop While | Выполняется 1 или более раз, пока выполняется условие | Do Loop While result = «Correct» |
Выполнить до … Цикл | Выполняется 0 или более раз до тех пор, пока условие не станет истинным | Выполнить до результата «Правильно» Цикл |
Do … until Loop | Выполняется 1 или более раз, пока условие не станет истинным | Do Loop until result «Correct» |
Пока… Wend | Выполняется 0 или более раз, пока выполняется условие. Примечание: этот шлейф считается устаревшим. | Пока результат = «Правильный» Венд |
Выйти из цикла «Сделать» | Выйти из цикла «Сделать» | Сделать, пока i i = GetTotal If i Then Exit Do End If Loop |
Введение
Если вы никогда раньше не использовали циклы, возможно, вы захотите прочитать «Что такое циклы и зачем они вам нужны» из моего сообщения в For Loop.
В этом посте я в основном сосредоточусь на Do Loop . Как я упоминал выше, мы видели, что цикл , в то время как Wend считается устаревшим. Для полноты я включил раздел «Пока Венд» позже в этот пост.
Итак, в первую очередь, зачем нам циклов Do While , когда у нас уже есть циклов For ?
Циклы For и циклы Do while
Когда мы используем цикл For Loop , мы заранее знаем, сколько раз мы хотим его запустить.Например, мы можем захотеть запустить цикл один раз для каждого элемента в коллекции, массиве или словаре.
В следующем примере кода мы знаем в начале каждого цикла, сколько раз он будет выполняться.
'запускается 5 раз Для i = от 1 до 5 'запускается один раз для каждого элемента в коллекции Для i = 1 To coll.Count 'запускается один раз для каждого элемента в arr Для i = LBound (arr) To coll.lbound (arr) 'запускается один раз для каждого значения от 1 до значения в lastRow Для i = 1 до lastRow 'запускается один раз для каждого элемента в коллекции Для каждого с в колл
Цикл Do отличается.Do Loop запускает
- Хотя условие верно
- До условие выполняется
или
Другими словами, количество запусков петли в большинстве случаев не имеет значения.
Итак, что такое условие и как его использовать?
Условия
Условие — это утверждение, которое оценивается как истинное или ложное. В основном они используются с операторами Loops и If.Когда вы создаете условие, вы используете такие знаки, как>, <, <>,> =, =.
Ниже приведены примеры условий
Состояние | Это верно, когда |
---|---|
x | x меньше 5 |
x | x меньше или равно 5 |
x> 5 | x больше 5 |
x> = 5 | x больше или равно 5 |
x = 5 | x равно 5 |
x 5 | x не равно 5 |
x> 5 И x | x больше 5 И x меньше 10 |
x = 2 Или x> 10 | x равно 2 ИЛИ x больше 10 |
Range («A1») = «John» | Ячейка A1 содержит текст «John» |
Диапазон («A1») «John» | Ячейка A1 не содержит текста «John» |
Вы могли заметить x = 5 как условие.Не следует путать с x = 5 при использовании в качестве присваивания.
Например
'означает: значение 6 будет сохранено в x х = 6 'означает: x равно 6? Если x = 6 'означает: x равно 6? Делать пока x = 6
В следующей таблице показано, как используется равенство в условиях и назначениях
Использование Equals | Тип инструкции | Значение |
---|---|---|
Цикл до x = 5 | Условие | Если x равен 5 |
Do While x = 5 | Condition | Is x равно 5 |
Если x = 5, то | Условие | Если x равно 5 |
Для x = 1 До 5 | Присвоение | Установите значение x на 1, затем на 2 и т. Д. |
x = 5 | Присвоение | Установите значение x на 5 |
b = 6 = 5 | Присвоение и условие | Присвоить b результату условия 6 = 5 |
x = MyFunc (5,6) | Присвоение | Присвойте x значению, возвращаемому функцией |
Формат цикла Do
Цикл Do можно использовать четырьмя способами, и это часто вызывает путаницу.Однако есть лишь небольшая разница в каждом из этих четырех способов.
Do всегда находится в начале первой строки, а Цикл всегда находится в конце последней строки
Делать Петля
Мы можем добавить условие после любой строки
Выполнить [условие] Петля Делать Цикл [условие]
Условию предшествует , а или До , что дает нам эти четыре возможности
Сделать пока [условие] Петля Сделать до [условие] Петля Делать Цикл пока [условие] Делать Цикл до [условие]
Давайте рассмотрим несколько примеров, чтобы прояснить это.
Пример цикла Do
Представьте, что вы хотите, чтобы пользователь ввел список элементов. Каждый раз, когда пользователь вводит элемент, вы распечатываете его в окне «Немедленное». Когда пользователь вводит пустую строку, вы хотите, чтобы приложение завершилось.
В этом случае цикл For не подходит, так как вы не знаете, сколько элементов введет пользователь. Пользователь мог ввести пустую строку с первой или с сотой попытки. Для этого типа сценария вы должны использовать цикл Do.
Следующий код показывает пример этого
Dim sCommand как строка Делать 'Получить ввод пользователя sCommand = InputBox («Пожалуйста, введите элемент») 'Печать в немедленное окно (Ctrl G для просмотра) Отлаживать.Распечатать команду Цикл пока sCommand ""
Код входит в цикл и продолжается до тех пор, пока не достигнет строки «Loop While» . На этом этапе он проверяет, истинно или ложно условие.
- Если условие оценивается как ложное, код выходит из цикла и продолжается.
- Если условие истинно, тогда код возвращается к строке Do и снова проходит цикл.
Разница между наличием условия в строке Do и в строке Loop очень проста
Когда условие находится в строке Do , цикл может вообще не выполняться.Таким образом, он будет выполняться ноль или больше раз.
Когда условие находится в строке Loop , цикл всегда будет выполняться хотя бы один раз. Таким образом, он будет выполнен один или несколько раз.
В нашем последнем примере условие находится в строке Loop , потому что мы всегда хотим получить хотя бы одно значение от пользователя. В следующем примере мы используем обе версии цикла. Цикл будет выполняться, пока пользователь не введет букву «n»
.
https: // excelmacromastery.com / Sub GetInput () Dim sCommand как строка 'Состояние при запуске Выполнить во время команды "n" sCommand = InputBox ("Пожалуйста, введите элемент для цикла 1") Петля 'Состояние в конце Делать sCommand = InputBox ("Пожалуйста, введите элемент для цикла 2") Цикл пока sCommand "n" Конец подписки
В приведенном выше примере оба контура будут вести себя одинаково.
Однако, если мы установим sCommand на ‘n’ до начала цикла Do While , тогда код не войдет в цикл.
https://excelmacromastery.com/ Sub GetInput2 () Dim sCommand как строка sCommand = "n" 'Цикл не будет работать, поскольку команда "n" Выполните команду "n" sCommand = InputBox ("Пожалуйста, введите элемент для цикла 1") Петля 'Цикл по-прежнему будет выполняться хотя бы один раз Делать sCommand = InputBox ("Пожалуйста, введите элемент для цикла 2") Цикл пока sCommand "n" Конец подписки
Второй цикл в приведенном выше примере (т.е.е. Loop While ) всегда будет выполняться хотя бы один раз.
по сравнению с до
Когда вы используете Do Loop , условию должно предшествовать До или Пока .
Пока и Пока по сути противоположны друг другу. Они используются в VBA аналогично тому, как они используются в английском языке.
Например
- Оставьте одежду на линии До идет дождь
- Оставьте одежду на линии Пока не идет дождь
другой пример
- Остаться в постели До светло
- Оставаться в постели Пока темно
еще один пример
- повтор До счет больше или равен десяти
- повтор Пока счет меньше десяти
Как видите, использование «пока» и «пока» — это как раз противоположный способ записи того же условия.
Примеры пока и до
Следующий код показывает циклы «Пока» и «До» рядом. Как видите, единственная разница в том, что состояние обратное. Примечание. Знаки <> означают «не равно».
https://excelmacromastery.com/ Sub GetInput () Dim sCommand как строка 'Состояние при запуске До тех пор, пока sCommand = "n" sCommand = InputBox ("Пожалуйста, введите элемент для цикла 1") Петля Выполнить во время команды "n" sCommand = InputBox ("Пожалуйста, введите элемент для цикла 1") Петля 'Состояние в конце Делать sCommand = InputBox ("Пожалуйста, введите элемент для цикла 2") Цикл до sCommand = "n" Делать sCommand = InputBox ("Пожалуйста, введите элемент для цикла 2") Цикл пока sCommand "n" Конец подписки
Первый цикл: запускается, только если sCommand не равно «n».
Второй цикл: начнется, только если sCommand не равно «n».
Третий цикл: выполняется хотя бы один раз перед проверкой sCommand.
Четвертый цикл: выполняется хотя бы один раз перед проверкой sCommand.
Пример: проверка объектов
Примером полезности до и пока является проверка объектов. Когда объект не был назначен, он имеет значение Ничего .
Итак, когда мы объявляем переменную книги в следующем примере, она имеет нулевое значение до тех пор, пока мы не присвоим ее действительной книге
Dim wrk As Workbook
Противоположность Nothing — это Not Nothing , что может сбивать с толку.
Представьте, что у нас есть две функции с именами GetFirstWorkbook и GetNextWorkbook , которые возвращают некоторые объекты книги. Код будет печатать имя книги до тех пор, пока функции не перестанут возвращать действительную книгу.
Вы можете увидеть здесь образец кода
Dim wrk As Workbook Установите wrk = GetFirstWorkbook () Делать, пока работа не станет ничем Debug.Print wrk.Name Установите wrk = GetNextWorkbook () Петля
Написание этого кода с использованием Do While будет более запутанным, так как условие: Not Is Nothing
Dim wrk As Workbook Установите wrk = GetFirstWorkbook () Делать, пока не делать ничего Отлаживать.Распечатать wrk.Name Установите wrk = GetNextWorkbook () Петля
Это делает код более понятным, и наличие четких условий всегда хорошо. Если честно, это очень небольшая разница, и выбор между Пока и До действительно сводится к личному выбору.
Выход из цикла
Мы можем выйти из любого цикла Do , используя оператор Exit Do .
В следующем коде показан пример использования Exit Do
.
Делать, пока я, если ячейки (я, 1) = "найдено", то Выход Сделать Конец, если я = я + 1 Петля
В этом случае мы выходим из цикла Do Loop , если в ячейке содержится текст «Найдено».
Пока Венд
Этот цикл находится в VBA, чтобы сделать его совместимым со старым кодом. Microsoft рекомендует использовать циклы Do, поскольку они более структурированы.
Из MSDN: «Оператор Do… Loop обеспечивает более структурированный и гибкий способ выполнения цикла».
Формат VBA цикла Вендора
Цикл while в VBA имеет следующий формат
Пока <Условие>
Венд
Пока Венд против До
Разница между VBA While и циклом VBA Do:
- Хотя может иметь условие только в начале цикла.
- В то время как не имеет версии до .
- Нет инструкции для выхода из цикла While , такого как Exit For или Exit Do .
Условие для цикла while VBA такое же, как и для цикла Do While в VBA. Два цикла в приведенном ниже коде выполняются точно так же
https://excelmacromastery.com/ Sub GetInput () Dim sCommand как строка Выполнить во время команды "n" sCommand = InputBox ("Пожалуйста, введите элемент для цикла 1") Петля Пока sCommand "n" sCommand = InputBox ("Пожалуйста, введите элемент для цикла 2") Wend Конец подписки
Бесконечный цикл
Даже если вы никогда в жизни не писали код, я уверен, что вы слышали фразу «Бесконечный цикл».Это цикл, в котором условие никогда не будет выполнено. Обычно это происходит, когда вы забываете обновить счетчик.
Следующий код показывает бесконечный цикл
Dim cnt As Long cnt = 1 'Не бегать - это бесконечный цикл Делать пока cnt 5 Петля
В этом примере cnt установлено в 1, но никогда не обновляется. Следовательно, условие никогда не будет выполнено — cnt всегда будет меньше 5.
В следующем коде cnt обновляется каждый раз, поэтому условие будет выполнено.
Dim cnt As Long cnt = 1 Делать пока cnt 5 cnt = cnt + 1 Петля
Как видите, использование цикла For Loop безопаснее для подсчета, поскольку оно автоматически обновляет счетчик в цикле. Ниже приводится тот же цикл с использованием For.
Тусклый я как долго Для i = от 1 до 4 Далее я
Это явно лучший способ сделать это.Цикл For устанавливает начальное значение, условие и количество в одной строке.
Конечно, можно создать бесконечный цикл, используя For — это просто требует немного больше усилий 🙂
Тусклый я как долго 'НЕ БЕГАТЬ - бесконечный цикл Для i = от 1 до 4 'Я никогда не дойду до 4 я = 1 Далее я
Работа с бесконечным циклом
Когда у вас бесконечный цикл — VBA не выдаст ошибку.Ваш код будет продолжать работать, а редактор Visual Basic не будет отвечать.
Раньше можно было выйти из цикла, просто нажав Ctrl и Break . В настоящее время в разных ноутбуках используются разные комбинации клавиш. Это хорошая идея, чтобы знать, что это для вашего ноутбука, чтобы в случае возникновения бесконечного цикла вы могли легко остановить код.
Вы также можете выйти из цикла, прервав процесс. Нажмите Ctrl + Shift + Esc. На вкладке «Процессы» найдите Excel / Microsoft Excel.Щелкните его правой кнопкой мыши и выберите «Завершить процесс». Это закроет Excel, и вы можете потерять часть работы, поэтому гораздо лучше использовать Ctrl + Break или аналогичный.
Использование функций рабочего листа вместо циклов
Иногда вместо цикла можно использовать функцию рабочего листа.
Например, представьте, что вы хотите добавить значения в список ячеек. Вы можете сделать это с помощью цикла, но было бы более эффективно использовать функцию рабочего листа Sum .Это быстрее и экономит много кода.
Использовать функции рабочего листа очень просто. Ниже приведен пример использования Sum и Count
.
https://excelmacromastery.com/ Дополнительные функции рабочего листа () Debug.Print WorksheetFunction.Sum (Диапазон ("A1: A10")) Debug.Print WorksheetFunction.Count (Диапазон ("A1: A10")) Конец подписки
В следующем примере используется цикл для выполнения того же действия.Как видите, это гораздо более длинный путь к достижению той же цели
https://excelmacromastery.com/ Sub SumWithLoop () Общее тусклое до тех пор, считайте до конца Dim rg As Диапазон Для каждого rg в диапазоне ("A1: A10") ' Всего total = total + rg Граф Если rg "" Тогда count = count + 1 Конец, если Следующий рг Отладка, печать всего Отладка. Количество отпечатков Конец подписки
Сводка
Цикл «Сделай, пока»
- Цикл Do можно использовать 4 способами .
- Может использоваться с While в начале или конце , Do While .. Loop, Do… Loop While
- Может использоваться с до в начале или конце , Do до .. Loop, Do… Loop до
- Пока и Пока используют условие , противоположное друг другу.
- Бесконечный цикл возникает, если ваше условие выхода никогда не будет выполнено.
- Иногда использование функции рабочего листа более эффективно, чем использование цикла.
Петля Пока Венд
- Цикл While Wend является устаревшим , и вместо него можно использовать цикл Do.
Что дальше?
Бесплатное руководство по VBA Если вы новичок в VBA или хотите отточить свои существующие навыки VBA, почему бы не попробовать The Ultimate VBA Tutorial.
Связанное обучение: Получите полный доступ к обучающим вебинарам по Excel VBA и всем учебным материалам.
( ПРИМЕЧАНИЕ: Планируете создание приложения VBA или управление им? Узнайте, как создать 10 приложений Excel VBA с нуля.)
Получите бесплатную электронную книгу
Не стесняйтесь подписаться на мой информационный бюллетень и получить эксклюзивный контент VBA, который вы не можете найти здесь, в блоге, а также бесплатный доступ к моей электронной книге How to Ace the 21 Most Common Question in VBA , которая полна примеров, которые вы можно использовать в собственном коде.
.
excel — VBA выйти из внутреннего цикла, но вернуться во внутренний цикл
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.