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 с условием до исполняемых операторов:
1 2 3 4 5 6 7 | Sub test1() Dim a As Byte Do While a < 10 a = a + 1 Loop MsgBox a End Sub |
Цикл Do While… Loop с условием после исполняемых операторов:
1 2 3 4 56 7 | 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 |
Белка 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», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
Пример бесконечного цикла:
1 2 3 4 5 6 7 8 9 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 по тематическим разделам со ссылками на все статьи.
Программирование циклов, цикл do while
Организация выполнения повторяющихся действий в VBA может быть выполнена несколькими операторами, которые условно разделяют на цикл-пока, цикл-до, цикл-для.
Оператор While
Общий вид оператора While:
While выражение [инструкции] Wend
Оператор While предназначен для организации цикла-пока.
Инструкции будут выполняться пока выражение будет истинно.
Пример. Вычислить сумму чисел от 0 до 100.
Решение.
Sub сумма1() Dim x, s As Double x = 0 s = 0 While x <= 100 s = s + x x = x + 1 Wend MsgBox ("s=" + Str(s)) End Sub
Пояснение решения.
В переменной s накапливается значение суммы.
Оператор Do While
Общий вид оператора Do While:Do [While выражение] [инструкции] [Exit Do] [инструкции1] Loop
Оператор Do While предназначен для организации цикла-пока.
Инструкции будут выполняться пока выражение будет истинно. Конструкция Exit Do предназначена для преждевременного выхода из цикла.
Пример. Вычислить сумму чисел от 0 до 100.
Решение.
Sub сумма2() Dim x, s As Double x = 0 s = 0 Do While x <= 100 s = s + x x = x + 1 Loop MsgBox ("s=" + Str(s)) End Sub
Оператор Do Loop Until
Общий вид оператора Do Loop Until:
Do [инструкции] [Exit Do] [инструкции1] Loop [Until выражение]
Оператор Do Loop Until предназначен для организации цикла-до.
Инструкции будут выполняться до момента, когда выражение станет истинным. Конструкция Exit Do предназначена для преждевременного выхода из цикла.
Пример. Вычислить сумму чисел от 0 до 100.
Решение.
Sub сумма3() Dim x, s As Double x = 0 s = 0 Do s = s + x x = x + 1 Loop Until x > 100 MsgBox ("s=" + Str(s)) End Sub
Оператор For
Общий вид оператора For:
For счетчик = начальное_знач To конечное_знач [Step шаг] [инструкции] [Exit For] [инструкции1] Next [счетчик]
Оператор For предназначен для организации цикла-для. 2 Next x End Sub
Пример 2
Пример 2. Составить программу определения наибольшего общего делителя (НОД) двух натуральных чисел.
Решение.
Наибольший общий делитель двух натуральных чисел — это самое большое натуральное число, на которое они делятся. Например, у чисел 12 и 18 наибольшие делители: 2, 3, 6. наибольшим общим делителем является число 6. Это записывается так:
НОД(12, 18) = 6.Идея алгоритма Евклида для нахождения НОД основана на том свойстве, что если M>N, то
НОД(M, N) = НОД(M-N, N).
Иначе говоря, НОД двух натуральных чисел равен НОД их положительной разности и меньшего числа.
Sub Евклид() Dim M, N, NOD M = Cells(1, 2) N = Cells(2, 2) While M <> N If M > N Then M = M - N Else N = N - M End If Wend NOD = M Cells(3, 2).Value = NOD End Sub
Пример 3
Пример 3. Построить график функции: улитку Паскаля.
Улитка Паскаля задается следующим образом:
x=A*cos(t)+B*cos(t) y=A*cos(t)sin(t)+B*sin(t), A>B, B>0, 0<=t<2*Pi
Решение.
1. Подготовить данные в электронной таблице
2. Ввести код программы.
Sub улитка_паскаля() Dim a, b, Pi, t As Double Dim i As Integer a = Cells(1, 2) b = Cells(2, 2) Pi = 3.14 i = 2 t = 0 While t <= 2 * Pi x = a * Cos(t) + b * Cos(t) y = a * Cos(t) * Sin(t) + b * Sin(t) Cells(3, i).Value = x Cells(4, i).Value = y t = t + 0.1 i = i + 1 Wend End Sub
3. Построить график с помощью мастера диаграмм, выбрав точечную диаграмму.
4. Изменить данные a и b.
A=2 B=1
5. Перезапустить макрос.
Оператор Do…Loop — Visual Basic
Редактировать Твиттер LinkedIn Фейсбук Электронная почта- Статья
Повторяет блок операторов, пока условие Boolean
равно True
или пока условие не станет True
.
Синтаксис
Делать [ { Пока | до } состояние ] [ заявления ] [Продолжить делать] [ заявления ] [Выход Сделай] [ заявления ] Петля ' -или- Делать [ заявления ] [Продолжить делать] [ заявления ] [Выход Сделай] [ заявления ] Цикл [ {Пока | до } состояние ]
Детали
Срок | Определение |
---|---|
До | Обязательно. Запускает определение цикла Do . |
Пока | Нельзя дать, если используется До . Повторяйте цикл до тех пор, пока условие не станет False . |
До | Невозможно указать, если используется Пока используется . Повторять цикл до условие равно True . |
состояние | Дополнительно. Логическое выражение . Если условие равно Ничего , Visual Basic обрабатывает его как Ложь . |
выписки | Дополнительно. Одно или несколько утверждений, которые повторяются в то время как или до тех пор, пока условие равно True . |
Продолжить Выполнить | Дополнительно. Передает управление следующей итерации Сделать петель. |
Выход Сделать | Дополнительно. Передает управление из цикла Do . |
Петля | Обязательно. Завершает определение цикла Do . |
Используйте структуру Do...Loop
, когда вы хотите повторить набор операторов неопределенное количество раз, пока условие не будет выполнено. Если вы хотите повторить операторы заданное количество раз, оператор For…Next обычно является лучшим выбором.
Вы можете использовать либо Пока
, либо До
, чтобы указать условие
, но не оба одновременно. Если вы не дадите ни того, ни другого, цикл будет продолжаться до тех пор, пока Выход
не передаст управление из цикла.
Вы можете проверить условие
только один раз, либо в начале, либо в конце цикла. Если вы проверяете условие
в начале цикла (в операторе Do
), цикл может не запуститься ни разу. Если вы проверите в конце цикла (в Loop
), цикл всегда выполняется хотя бы один раз.
Условие обычно является результатом сравнения двух значений, но это может быть любое выражение, результатом которого является значение логического типа данных ( True
или False
). Сюда входят значения других типов данных, таких как числовые типы, которые были преобразованы в Boolean
.
Вы можете вложить циклов Do
, поместив один цикл в другой. Вы также можете вкладывать друг в друга различные виды управляющих структур. Дополнительные сведения см. в разделе Вложенные структуры управления.
Примечание
Структура Do...Loop
обеспечивает большую гибкость, чем оператор While…End While, поскольку позволяет решить, завершать ли цикл, когда условие
перестает быть True
или когда оно сначала становится True
. Он также позволяет проверить условие
либо в начале, либо в конце цикла.
Exit Do
Оператор Exit Do может предоставить альтернативный способ выхода из Do…Loop
. Exit Do
немедленно передает управление оператору, следующему за оператором Loop
.
Выход Do
часто используется после оценки некоторого условия, например, в структуре If...Then...Else
. Вы можете выйти из цикла, если обнаружите условие, делающее ненужным или невозможным продолжение итерации, например ошибочное значение или запрос на завершение. Одно из применений Exit Do
— это проверка условия, которое может вызвать бесконечный цикл , который может выполняться большое или даже бесконечное количество раз. Вы можете использовать Exit Do
для выхода из цикла.
Вы можете включить любое количество операторов Exit Do
в любом месте цикла Do…Loop
.
При использовании во вложенных циклах Do
, Exit Do
передает управление из самого внутреннего цикла на следующий более высокий уровень вложенности.
Пример 1
В следующем примере операторы в цикле продолжают выполняться до тех пор, пока Переменная индекса
больше 10. Предложение До
находится в конце цикла.
Размерный индекс Целое число = 0 Делать Debug.Write(index.ToString & "") индекс += 1 Цикл до индекса> 10 Отладка.WriteLine("") ' Вывод: 0 1 2 3 4 5 6 7 8 9 10
Пример 2
В следующем примере используется предложение While
вместо предложения Before
, а условие
проверяется в начале цикла, а не в конце.
Индекс затемнения As Integer = 0 Делать пока индекс <= 10 Debug.Write(index.ToString & "") индекс += 1 Петля Отладка.WriteLine("") ' Вывод: 0 1 2 3 4 5 6 7 8 9 10
Пример 3
В следующем примере условие
останавливает цикл, когда переменная индекса
больше 100. Однако оператор If
в цикле приводит к тому, что оператор Exit Do
останавливает цикл когда индексная переменная больше 10.
Размерный индекс As Integer = 0 Делать пока индекс <= 100 Если индекс > 10 Тогда Выход Сделать Конец, если Debug.Write(index.ToString & "") индекс += 1 Петля Отладка.WriteLine("") ' Вывод: 0 1 2 3 4 5 6 7 8 9 10
Пример 4
В следующем примере считываются все строки текстового файла. Метод OpenText открывает файл и возвращает StreamReader, который считывает символы. В условии Do...Loop
метод Peek StreamReader
определяет наличие дополнительных символов.
Private Sub ShowText (ByVal textFilePath As String) Если System.IO.File.Exists(textFilePath) = False Тогда Debug.WriteLine("Файл не найден: " & textFilePath) Еще Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath) Делать пока sr.Peek() >= 0 Debug.WriteLine(sr.ReadLine()) Петля ср.Закрыть() Конец, если Конец сабвуфера
См. также
- Петлевые конструкции
- Для... Следующей инструкции
- Логический тип данных
- Вложенные управляющие структуры
- Заявление о выходе
- Пока... Конец Пока Заявление
Обратная связь
Просмотреть все отзывы о странице
Цикл do-while в C — Синтаксис, блок-схема
Цикл do-while — это тип цикла в программировании, который выполняет операторы внутри цикла по крайней мере один раз перед проверкой условия и продолжает повторять цикл до тех пор, пока условие истинно.
Синтаксис: цикл do..while
Операторы цикла while всегда выполняются первыми, а затем проверяется выражение.цикл do..while говорит, что повторяйте выполнение кода внутри тела «do», пока выражение не станет ложным (0).
Синтаксис цикла do..while показан на рис. 1.
Обратите внимание, что в конце выражения while (выражения) стоит точка с запятой, и эта точка с запятой обязательна. Отсутствие точки с запятой является синтаксической ошибкой, поэтому вы столкнетесь с ошибкой компиляции.
Это очень легко понять. Сначала будут выполняться эти операторы, которые находятся внутри тела «do», а затем будет оцениваться выражение while(expression). Итак, если результат оценки этого выражения равен 0 (то есть ложно), то цикл завершается. Это означает, что управление выходит из тела и продолжается с остальной частью кода программы.
Предположим, если оценка этого выражения верна, то управление снова возвращается к телу «do», и оно снова выполняет операторы. Как это. Таким образом, операторы будут выполняться снова и снова, пока это выражение не станет ложным.
Основное различие между циклом do-while и другими циклами, такими как циклы while или for, заключается в том, что цикл do-while гарантированно выполнится хотя бы один раз, в то время как другие циклы могут вообще не выполняться, если условие ложно с самого начала.
Блок-схема цикла do..while
Рисунок 2. Блок-схема
Сначала будут выполняться операторы, затем вычисляться выражения. Если выражение ложно, то программа продолжает код вне тела цикла.
Эти пункты вы всегда должны помнить.
- Операторы выполняются первыми.
- Выражение оценивается.
- Если результат оценки выражения истинен, выполнение повторяется, и операторы внутри тела «do» выполняются снова.
- Если результат оценки выражения ложный, оператор while завершается, и программа продолжает работу с оператором, следующим за оператором while.
- Операторы выполняются хотя бы один раз.
Речь идет о цикле do..while.
Здесь следует отметить, что операторы выполняются хотя бы один раз. В этом разница между циклом while и циклом do..while. В цикле do..while операторы выполняются хотя бы один раз.
Теперь цикл do..while редко используется в цикле, потому что мы всегда можем заменить цикл do..while на цикл while или цикл for. Но, иногда это используется. Не то чтобы вы знали, что он никогда не используется, но всегда рекомендуется использовать цикл do..while, если это необходимо.
В программировании встраиваемых систем мы используем цикл do..while для записи многострочных макросов «C» в заголовочный файл. Подробнее об этом мы узнаем, когда будем изучать директивы препроцессора «C».
В этом случае я покажу вам, как вы можете написать функцию, такую как макросы и многострочные макросы, используя цикл do..while. В программировании встраиваемых систем вы часто видите цикл do.