Программирование циклов, цикл 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. Перезапустить макрос.
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 5 6 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 |
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 в дупле.
1 2 3 4 5 6 7 8 9 10 11 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
Пример бесконечного цикла:
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 по тематическим разделам со ссылками на все статьи.
while do (Справочное руководство Guile)
while do (Справочное руководство Guile)Далее: Подсказки, Предыдущий: Условная оценка последовательности выражений, Вверх: Управление потоком выполнения программы [Содержание][Указатель]
6.11.4 Механизмы итерации
Схема имеет только несколько механизмов итерации, в основном потому, что итерация в
Программы-схемы обычно выражаются с использованием рекурсии. Тем не менее,
R5RS определяет конструкцию для циклов программирования, вызывая do
. В
Кроме того, Guile имеет явный синтаксис циклов, который называется , а
.
- синтаксис: do ((переменная инициализация [шаг]) …) (тестовое выражение …) тело … ¶
Свяжите переменную s и оцените тело до тех пор, пока тест не станет истинным. Возвращаемое значение — это последнее expr после test , если оно задано. А простой пример иллюстрирует основную форму,
(сделать ((я 1 (1+ я))) ((> я 4)) (показать я)) -| 1234
Или с двумя переменными и окончательным возвращаемым значением,
(делать ((я 1 (1+ я)) (3 р (*3 р))) ((> я 4) п) (формат #t "3**~s равен ~s\n" i p)) -| 3**1 равно 3 3**2 равно 9 3**3 равно 27 3**4 это 81 ⇒ 243
Привязки переменных устанавливаются аналогично
let
, в том все выражения оцениваются, а затем выполняются все привязки. Когда итерация, необязательные выражения шага оцениваются с помощью предыдущие привязки в области действия, а затем все новые привязки.Выражение test является условием завершения. Циклические остановки когда тест верен. Он оценивается перед запуском тело каждый раз, значит если правда первый раз то тело вообще не запускается.
Дополнительные expr s после теста оцениваются в конце цикла, с окончательными переменными привязками. last expr дает возвращаемое значение, или если нет выражение с возвращаемое значение не указано.
Каждая итерация устанавливает привязки к новым местоположениям для переменная s, как новый
пусть
для каждой итерации. Это сделано для переменной с без шагов выражений тоже. следующее иллюстрирует это, показывая, как новыйi
захватывается лямбда(определить lst '()) (сделать ((я 1 (1+ я))) ((> я 4)) (set!lst(cons(лямбда()i)lst))) (карта (лямбда (proc) (proc)) lst) ⇒ (4 3 2 1)
- синтаксис: в то время как состояние тела … ¶
Запустить цикл, выполняющий тело форм, пока условие истинно. cond проверяется в начале каждой итерации, поэтому, если
#f
первый раз потом тело вообще не выполняется.В пределах
и
предусмотрены два дополнительных крепления, их можно использовать как от конд так и от кузов .- Процедура схемы: break break-arg … ¶
Вырваться из формы
, в то время как
.
- Процедура схемы: продолжить ¶
Отменить текущую итерацию, вернуться к началу и протестировать , снова и т. д.
Если цикл завершается нормально, то по cond оценивается как
#f
, тогда выражениеwhile
в целом оценивается как#ф
. Если он завершается вызовом, сломайте
с некоторым номером аргументов, эти аргументы возвращаются из, а
выражение, как несколько значений. В противном случае, если он завершается вызовомпрерывает
без аргументов, тогда возвращаемое значение равно#t
.(пока #f (ошибка "не достигнут")) ⇒ #f (в то время как #t (перерыв)) ⇒ #t (в то время как #t (перерыв 1 2 3)) ⇒ 1 2 3
Каждая форма
в то время как
получает свой собственныйbreak
ипродолжить
процедуры, работающие с этими
. Это означает, что когда петли вложенный внешнийbreak
можно использовать для полного выхода. Например,(пока (тест1) (пусть ((внешний разрыв разрыв)) (пока (тест2) (если что-то) (внешний разрыв #f)) ...)))
Обратите внимание, что каждая процедура
break
иcontinue
может быть используется в динамической степени его, а
. Внепока
их поведение не указано.
Другим очень распространенным способом выражения итерации в программах Scheme является использование так называемого по имени пусть .
Именованный let — это вариант let
, который создает процедуру и вызывает
это за один шаг. Из-за вновь созданной процедуры с именем let
мощнее, чем сделать
– его можно использовать для итерации, но и
для произвольной рекурсии.
- синтаксис: let тело привязки переменных ¶
Для определения привязок см. документацию о
пусть
(см. Связывание локальных переменных).Именованный
пусть
работает следующим образом:- Новая процедура, которая принимает столько аргументов, сколько имеется в привязках создается и привязывается локально (используя
let
) к переменной . Имена формальных аргументов новой процедуры — это имя переменных . - body выражений вставляются во вновь созданную процедуру.
- Процедура вызывается с init выражениями в качестве формального аргументы.
В следующем примере реализован цикл, который повторяет (по рекурсии) 1000 раз.
(пусть lp ((x 1000)) (если (положительно? х) (лп (- х 1)) Икс)) ⇒ 0
- Новая процедура, которая принимает столько аргументов, сколько имеется в привязках создается и привязывается локально (используя
Next: Подсказки, Previous: Условная оценка последовательности выражений, Up: Управление потоком выполнения программы [Contents][Index]
Visual Basic (VB) Цикл Do-While
В c# цикл Do-While полезен для выполнения блока операторов до тех пор, пока определенное условие не вернет true .
В Visual Basic цикл do-while аналогичен циклу while, но единственное отличие состоит в том, что цикл while будет выполнять операторы только тогда, когда определенное условие возвращает true, цикл do-while выполнит операторы хотя бы один раз, потому что сначала он выполнит блок операторов, а затем проверит условие.
Синтаксис цикла Do-While в Visual Basic
Как правило, в Visual Basic Do и ключевые слова While полезны для создания цикла do. ..while . Ниже приведен синтаксис определения цикла do-while на языке программирования Visual Basic для выполнения блока операторов до тех пор, пока определенное условие не будет оценено как false .
Выполнить
// Операторы для выполнения
Цикл, в то время как логическое_выражение
Если вы соблюдаете приведенный выше синтаксис, Цикл Do-While начинается с ключевого слова Do , за которым следует блок операторов и параметр While с именем boolean_expression .
Здесь операторы цикла Do-While будут выполняться первыми; после этого будет оцениваться boolean_expression . Если boolean_expression возвращает true , операторы внутри цикла Do-While будут выполняться снова.
Если логическое_выражение равно false , цикл Do-While остановит выполнение операторов, и выполнение программы выйдет из цикла.
Блок-схема цикла Do-While в Visual Basic
Ниже приведено графическое представление потока процесса цикла Do-While на языке программирования Visual Basic.
Теперь мы увидим, как использовать цикл Do-While в языке программирования Visual Basic с примерами.
Пример цикла Do-While в Visual Basic
Ниже приведен пример использования цикла Do-While в языке программирования Visual Basic для выполнения блока операторов на основе наших требований.
Модуль Module1
Sub Main()
Dim i As Integer = 1
Do
Console.WriteLine(«i value: {0}», i)
i += 1
Зациклить, пока i <= 4
Консоль .WriteLine(«Нажмите клавишу Enter для выхода…»)
Console.ReadLine()
End Sub
End Module
Если вы наблюдаете приведенный выше пример, сначала мы выполняем операторы в цикле Do-While и увеличиваем значение переменной i ( i++ ) до 1 с помощью оператора приращения.
После этого условие ( i <= 4 ) будет оценено, и снова будет выполнен блок операторов, если определенное условие возвращает true , в противном случае цикл завершится.
Когда мы выполним приведенную выше программу Visual Basic, мы получим результат, как показано ниже.
Если вы наблюдаете приведенный выше результат, цикл Do-While выполняется до тех пор, пока не будет соответствовать заданному условию ( i <= 4 ). Выполнение программы выходило из цикла всякий раз, когда определенное условие возвращало false .
Visual Basic Вложенный цикл Do-While
В Visual Basic мы можем использовать один цикл Do-While внутри другого цикла Do-While для реализации приложения в соответствии с нашими требованиями.
Ниже приведен пример реализации вложенного цикла Do-While на языке программирования Visual Basic.
Модуль Module1
Sub Main()
Dim i As Integer = 1
Do
Console. WriteLine(«i value: {0}», i)
i += 1
Dim j As Integer = 1
Do
Console.WriteLine(«j value: {0}», j)
j += 1
Цикл, пока j < 2
Цикл, пока i < 4
Console.WriteLine(«Нажмите клавишу Enter для выхода..»)
Console.ReadLine()
End Sub
End Module
Если вы наблюдаете приведенный выше пример, мы использовали один цикл Do-While внутри другого цикла Do-While для реализации вложенной функциональности цикла do-while нашего приложения на основе наши требования.
Когда мы выполним приведенную выше программу Visual Basic, мы получим результат, как показано ниже.
Если вы наблюдаете приведенный выше результат, оба цикла do-while были выполнены и возвращены в соответствии с нашими требованиями.
Цикл Do-While в Visual Basic с оператором выхода
В Visual Basic мы можем немедленно выйти или прекратить выполнение цикла Do-While , используя ключевое слово Exit
.