Циклы с предусловием и постусловием vba

Цикл 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 из этого примера.
Источник
Цикл – это оператор или группа операторов, которые программа многократно выполняет до тех пор, пока не получит команду начать выполнение чего – либо другого. В Visual Basic существуют два основных типа циклов – циклы со счетчиком (с известным числом повторений) и циклы с условием. Циклы со счетчиком используют в тех случаях, когда необходимо выполнить некоторые действия определенное число раз. Циклы с условием применяются тогда, когда некоторые действия в программе должны повторяться до тех пор, пока выполняется определенное условие или до тех пор, пока не будет выполнено определенное условие.
Циклы со счетчиком
Циклы со счетчиком (с известным числом повторений) в Visual Basic еще называют циклами For, или циклами For … Next. Так они называются потому, что начало и конец этих циклов определяются операторами For и Next. Синтаксис цикла For. . .Next таков:
For СчетчикЦикла= НачальноеЗначение To КонечноеЗначение [Step Шаг]
Блок операторов
[Exit For]
Next [СчетчикЦикла]
где
For – ключевое слово Visual Basic, обозначающее начало цикла;
СчетчикЦикла– переменная, определенная в качестве счетчика цикла;
НачальноеЗначение – число, задающее начальное значение счетчика;
То – ключевое слово Visual Basic, разделяющее НачальноеЗначение и КонечноеЗначение – число, задающее значение счетчика, при котором цикл завершается;
Step – ключевое слово Visual Basic, используемое для задания шага цикла, необязательный аргумент;
Шаг – число, задающее шаг цикла, т.е. значение на которое увеличивается (или уменьшается) значение счетчика на каждом шаге, это число может быть отрицательным;
Exit For – оператор досрочного выхода из цикла (необязательный);
Next – ключевое слово Visual Basic, обозначающее конец цикла.
В начале цикла For …Next определяется переменная-счетчик, а так же начальное и конечное значения этой переменной. В самом начале выполнения цикла переменная – счетчик устанавливается в начальное значение. Каждый раз, когда программа пройдя через цикл, возвращается к его началу, значение счетчика увеличивается. Если используется ключевое слово Step, то переменная- счетчик изменяется в соответствии с числом, указанным после ключевого слова Step. Например:
For I = 0 То 10 Step 2 ‘ Значение I будет увеличиваться на 2
Если ключевое слово Step отсутствует, то значение шага равно единице.
Каждый раз, когда значение переменной-счетчика изменяется, оно сравнивается с заданным конечным значением счетчика. Если значение счетчика превышает конечное значение, программа сразу выходит из цикла и переходит к той строке кода, которая следует за циклом.
Пример:
Option Explicit
Dim I As Integer
For I = 1 To 4
Sum =Sum + 2
Next I
Этот цикл эквивалентен написанию четырех операторов Sum =Sum + 2 в тексте программы.
Цикл For . . . Next Может быть прерван досрочно, например, при достижении какого – либо условия. Для этого в нужном месте цикла нужно поместить оператор Exit For. Например:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
For j = 1 To 10
Sum = Sum + j
If Sum > 6 Then
Exit For ‘ Выход из цикла, если значение Sum больше 6
End If
Next j
TextBox1.Text = Sum
В этом примере цикл прерывается досрочно, когда значение переменной Sum будет больше 6. В результате выполнения этого кода в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.
Циклы с условием
Главной особенностью циклов с условием является условие, которое может быть любым выражением, принимающим значение True (Истина) или False (Ложно). В Visual Basic есть два основных цикла с условием – цикл Do While … Loop и цикл Do Until … Loop. Оба они могут быть с предусловием или с постусловием.
Циклы Do While | Until имеет следующий синтаксис:
где
Do – ключевое слово;
While | Until – ключевые слова, указывающие тип цикла;
Выражение – выражение условия, принимающее значение True или False;
Loop – ключевое слово, указывающее на окончание цикла.
Цикл Do While выполняется до тех пор, пока выражение условия имеет значение True.
Пример цикла Do While, реализующего алгоритм программы, аналогичный приведенной в примере для цикла For с досрочным прерыванием:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
Do While Sum < 7
Sum = Sum + j
j = j + 1
Loop
TextBox1.Text = Sum
В результате выполнения этого кода в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.
В отличие от цикла Do While цикл Do Until выполняется до тех пор, пока выражение условия имеет значение False.
Пример цикла Do Until, реализующего алгоритм программы аналогичный приведенному выше:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
Do Until Sum >7
Sum = Sum + j
j = j + 1
Loop
TextBox1.Text = Sum
В результате выполнения этого примера в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.
Иногда бывает необходимо прервать цикл Do … Loop, если выполняется какое-либо дополнительное условие. Это может быть сделано с помощью оператора Exit Do. Например:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
Do Until Sum > 7
Sum = Sum + j
j = j + 1
If j > 3 Then
Exit Do ‘ Досрочный выход из цикла Do … Loop
End If
Loop
TextBox1.Text = Sum
В этом примере цикл с условием досрочно прерывается, если выполняется дополнительное условие j > 3. В результате выполнения программного кода переменная Sum будет иметь значение, равное 8.
Используя цикл с условием можно организовать бесконечный цикл. Иногда это бывает необходимо, а иногда это происходит из-за ошибки пользователя. Для создания бесконечного цикла условное выражение должно быть таким, которое никогда не выполняется или выполняется всегда. Например:
Do Until 1
Операторы
Loop
Выйти из такого бесконечного цикла и прервать работу программы можно нажав комбинацию клавиш <Ctrl+Break>.
Источник
Цикл с предусловием
– предусматривает проверку условия
перед телом цикла. В таком цикле возможна
ситуация, когда эта последовательность
действий ни разу не выполнится.
В VBA
такой цикл может быть реализован с
помощью оператора Do
… Loop.
1 вариант Do
… Loop:
Пока
условие верно – выполнять тело цикла. В
теле цикла необходимо предусмотреть
изменение параметра условия, иначе
может произойти процесс зацикливания,
остановить который можно сочетание
клавишCtrl
+ Break.
Do
While
условие
[операторы]
Loop
2 вариант Do
… Loop:
Пока условие неверно
– выполнять тело цикла.
Do
Until
условие
[операторы]
Loop
32. Vba. Циклический алгоритм. Циклы с постусловием. Операторы для их реализации.
Цикл с постусловием
– предусматривает проверку условия
после тела цикла. Такой цикл в любом
случае хотя бы один раз обязательно
выполнится.
В VBA
такой цикл может быть реализован с
помощью оператора Do
… Loop.
1 вариант Do
… Loop:
Пока
условие верно – выполнять тело цикла. В
теле цикла необходимо предусмотреть
изменение параметра условия, иначе
может произойти процесс зацикливания,
остановить который можно сочетание
клавишCtrl
+ Break.
Do
[операторы]
Loop
While
условие
2 вариант Do
… Loop:
Пока
условие неверно – выполнять тело цикла.
Do
[операторы]
Loop
Until
условие
33. Vba. Разветвляющийся алгоритм. Условные выражения.
Разветвляющийся
алгоритм –
алгоритм, в котором часть действий может
быть выполнена либо не выполнена в
зависимости от результата анализа
исходных и промежуточных результатов.
Однострочный
оператор If:
На языке VBA
разветвление можно описать оператором
If.
Различают строчный (однострочный) и
блочный (многострочный) операторы.
Синтаксис
однострочного оператора: после If
записывается логическое выражение
(ЛВ).
If
ЛВ Then
[ОП_истина] [Else
ОП_ложь]
ОП_истина –
операторы, которые будут выполнены,
если ЛВ – истина (True).
ОП_ложь – операторы,
которые будут выполнены, если ЛВ – ложь
(False).
Вся конструкция
записывается в одной строке.
Многострочный
оператор If:
На языке VBA
разветвление можно описать оператором
If.
Различают строчный (однострочный) и
блочный (многострочный) операторы.
Синтаксис
многострочного оператора: после If
записывается логическое выражение
(ЛВ).
If
ЛВ Then
[ОП_истина]
[ElseIf
ЛВ_доп Then
[ОП_доп_истина]…]
[Else
ОП_ложь]
End
If
ОП_истина –
операторы, которые будут выполнены,
если ЛВ – истина (True).
ОП_ложь – операторы,
которые будут выполнены, если ни одно
из проверяемых условий не является
истиной.
ЛВ_доп – дополнительные
логические выражения.
ОП_доп_истина –
операторы, которые выполняются, если
ЛВ_доп – истина.
Вся конструкция
записывается в несколько строк.
34. Vba. Разветвляющийся алгоритм. Однострочный оператор If.
Разветвляющийся
алгоритм –
алгоритм, в котором часть действий может
быть выполнена либо не выполнена в
зависимости от результата анализа
исходных и промежуточных результатов.
На языке VBA
разветвление можно описать оператором
If.
Различают строчный (однострочный) и
блочный (многострочный) операторы.
Синтаксис
однострочного оператора: после If
записывается логическое выражение
(ЛВ).
If
ЛВ Then
[ОП_истина] [Else
ОП_ложь]
ОП_истина –
операторы, которые будут выполнены,
если ЛВ – истина (True).
ОП_ложь – операторы,
которые будут выполнены, если ЛВ – ложь
(False).
Вся конструкция
записывается в одной строке.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Источник
Автор admin Опубликовано 10 декабря 2011
Урок из серии: «Программирование на Visual Basic.NET для школьников»
Существует несколько разновидностей циклов с неизвестным числом повторений.
На прошлом уроке мы рассмотрели цикл с предусловием Do While.
На этом уроке познакомимся с ещё одной разновидностью цикла с условием — циклом с постусловием, научимся его использовать.
Цикл называется циклом с постусловием, если условие выхода из цикла стоит в конце, после тела цикла.
Алгоритм выполнения оператора:
Особенностью этого цикла является то, что тело цикла в любом случае выполняется хотя бы один раз (независимо от того, выполняется условие или нет). |
Цикл с постусловием реализуется с помощью конструкции Do . . . Loop Until.
Общий вид оператора:
<тело цикла>
Loop Until <условие выхода>
Преждевременный выход из цикла программист может организовать при помощи конструкции Exit Do.
Проект «Проверка номера»
Смоделируйте ситуацию проверки правильности набора номера телефона в городе N. Будем считать, что телефон набран верно, если количество набранных цифр соответствует длине телефонного номера для данного города.
Технология выполнения
- Создайте интерфейс по образцу.
- Установите для текстового поля значение свойства MaxLength равным 9 (максимальное количество цифр, которое позволяется ввести в поле), выберите для надписи label2 значение свойства BorderStyle равным Fixed3D.
- В окне редактора кода после строки
«Код, автоматически созданный конструктором форм Windows»
введите строку кода:Const nmax = 6 ‘Константа, определяющая длину набора в данном городе - Наберите программный код процедуры Button1_Click:Dim n As Integer ‘Введенный номер
Dim k As Byte ‘Счетчик цифр
n = Val(TextBox1.Text)
k = 0
Do
k = k + 1
n = n 10
Loop Until n = 0
If k = nmax Then
Label2.Text = “Соединение возможно” : Beep()
ElseIf k < nmax Then
Label2.Text = “Неправильно набран номер: не хватает цифр”
Else
Label2.Text = “Неправильно набран номер: слишком много цифр”
End If - Запустите программу несколько раз для проверки всех возможных ситуаций.
- сохраните программу.
Проект «Простые множители»
Требуется создать программу разложения произвольного целого числа на простые множители. Предлагается следующий алгоритм: сначала число делится на 2 до тех пор, пока не станет нечетным. Затем оно делится последовательно на 3, 5, 7, пока результат леления не станет равным 1.
Технология выполнения
- Создайте интерфейс по образцу.
- С помощью окна Свойства задайте следующие значения свойств:
Объект Свойство Значение Form1 Text «Простые множители» Label1 TextTextAlign «Введите число:»
MiddleCenterTextBox1 TextMax
Length
TextAlignпусто
10
CenterButton Text
TextAlign«Разложить»
MiddleCenterLabel2 Text
TextAlign
BorderStyleпусто
MiddleCenter
Fixed3DДля текстового поля TextBox1 свойство MaxLength задает максимальную длину числа при вводе данных с клавиатуры.
- Наберите текст программы‘ Разложение на простые множители
Dim n, n1 As Integer ‘Исходное число и его дубликат
Dim del As Byte ‘Простой делитель
Dim str As String ‘Строка для вывода
n = Val(TextBox1.Text)
del = 2
n1 = n
Str = “”
Do
If n Mod del = 0 Then
n = n del
‘В строку добавляется новый множитель
str = str & CStr(del)
‘Выводится “*” после всех множителей, кроме последнего
If n <> 1 Then str = str & “*”
Else
‘После “2” все простые множители нечетны
If del = 2 Then del = 3 Else del = del + 2
End If
Loop Until n = 1
Label2.Text = n1 & “=” & str - Сохраните программу.
- Доработайте программу таким образом, чтобы она подсчитывала количество множителей.
- Введите проверку на равенство подсчитанного количества множителей единице. Если равенство выполняется, выведите сообщение, что введенное число является простым
- Сохраните доработанную программу.
До встречи на следующем уроке.
Источник
Доброго времени суток! Данную статью я решил посвятить рубрике по основам программирования в Visual Basic for Application. И сегодня мы поговорим о циклах в VBA, разберём их синтаксис и рассмотрим несколько примеров, которые часто встречаются программисту.
Сначала напомню, что цикл — процесс повторения части кода, выполняемый, пока не будет выполнено или нарушено заданное нами условие.
В данной статье мы разберём синтаксис и примеры следующих циклов в VBA:
- For
- For each
- While
- Until
Цикл For в VBA
Цикл for в VBA обычно используется при зацикливании фрагмента кода, если нам известно конечное значение counter — счетчика, при котором мы выйдем из цикла.
Возьмём для примера самый распространённый пример:
Сгенерировать массив из 5 целых значений
Dim mas(5) As Integer
For i% = 0 To 4
mas(i) = Int((10 * Rnd) + 1)
Next i
Обратите ваше внимание, что в этом примере используется неявное объявление при работе с циклами в VBA. i% — означает неявное объявление переменной i в формате integer. Такая конструкция по сути заменяет следующую: dim i as integer. Это используется для сокращения кода и для удобства написания и чтения. В старых версиях VBA необходимо указывать знак формата после каждого использования неявной переменной. В более поздних версиях достаточно всего один раз.
VBA для цикла for даёт возможность использовать функцию Step. Как ясно из перевода, это шаг, с которым мы будем проходить наш интервал. По умолчанию, он равен 1. Популярный вариант использования встречается в случаях, когда counter связан с переменной, используемой внутри цикла. Например, при написании программ, связанных с функциями.
Найти пересечение графика функции y = 5*x + 5 с осью ординат
Function expr(x As Integer) As Integer
expr = 5 * x + 5
End Function
Sub CodeTown()
Dim i As Integer
For i = -10 To 10 Step 1
If expr(i) = 0 Then MsgBox “При Y = 0, Х = “+ CStr(i)
Next i
End Sub
Теперь представим, что у нас достаточно большой диапазон и мы не хотим заставлять компьютер считать лишние итерации. На этот случай существует команда Exit For. Перепишем наш последний пример с новой командой.
Function expr(x As Integer) As Integer
expr = 5 * x + 5
End Function
Sub CodeTown()
Dim i As Integer
For i = -10 To 10 Step 1
If expr(i) = 0 Then
MsgBox “При Y = 0, Х = “+ CStr(i)
Exit For
End If
Next i
End Sub
C помощью команды Exit можно закончить выполнение любого цикла в VBA. Достаточно указать после Exit название используемого цикла. Также им возможно завершить работу любой процедуры или функции.
Цикл For Each в VBA
For Each в VBA основан на переборе всех элементов, указанного типа в массиве, объекте или группе.
Самый популярный вариант его использования — перебор страниц в рабочей книге.
Вывести названия всех листов в рабочей книге
For Each ws In ThisWorkbook.Worksheets
MsgBox ws.Name
Next ws
И ещё один интересный пример:
Изменить размер шрифта и выравнить по центру текст в label
For Each element In UserForm1.Controls
If InStr(1, UserForm1.Controls.Item(i%).Name, “Label”) > 0 Then
UserForm1.Controls.Item(i%).TextAlign = fmTextAlignCenter
UserForm1.Controls.Item(i%).Font.Size = 20
i% = i% + 1
End If
Next element
Тут следует понимать, что через Controls можно обратиться к любому элементу формы. Если отфильтровать по имени, например, как мы сделали выше, то можно выделить группы элементов и изменить их свойства. В данном случае, размер шрифта и выравнивание.
Цикл While в VBA
Циклы в VBA, которые используют структуру Do..Loop (это while и until циклы) можно записывать с разным расположением фрагмента условия. Как видите на картинке выше, условие может проверяться после выполнения одной итерации, а может перед запуском цикла.
Самый популярный пример:
Отсортируйте по возрастанию сгенерированный массив методом пузырька
Dim mas(5) As Integer
For i% = 0 To 4
mas(i%) = Int((10 * Rnd) + 1)
Next i
Dim count As Integer, temp As Integer
count = 1
Do While count > 0
count = 0
For i% = 0 To 3
If mas(i) > mas(i + 1) Then
temp = mas(i)
mas(i) = mas(i + 1)
mas(i + 1) = temp
count = count + 1
End If
Next i%
Loop
В вышеуказанном примере мы отсортировали массив с рандомными значениями в порядке возрастания. Метод пузырька считается достаточно долгим, но простым в реализации. В основном, им сортируют небольшие числовые массивы.
Цикл Until в VBA
Как видите, отличия от while крайне несущественные. Цикл Until в VBA можно реализовать с помощью конструкции while NOT (condition). Тем не менее, приведу пример:
Заставить пользователя ввести число
Dim temp As Variant
Do
temp = InputBox(“Введите число”)
Loop Until IsNumeric(temp)
Почему заставить? Потому, что если пользователь закроет окно ввода, это его не спасёт, оно будет появляться вновь и вновь пока он не введёт любое число.
На этом мы закончим. Сегодня мы рассмотрели важную тему циклов в VBA, разобрали основные примеры. Конечно все примеры по этой обширной теме сложно разобрать, но, тем не менее, основы вы должны понять. Оставляйте ваши комментарии, если у вас возникли вопросы.
Скачать исходник
Источник