«VBA Операторы цикла. Вложенные циклы». Циклы в vba
VBA Операторы цикла. Вложенные циклы
7.1 Операторы цикла7.2 Вложенные циклы
7.1 Операторы цикла.
Циклы позволяют выполнить одну или несколько строк кода несколько раз. VBA поддерживает следующие циклы:
For...Next For Each...Next Do... LoopКонструкция For . . . Next. Когда число повторений известно заранее, используют цикл For . . . Next. В цикле For используется переменная, называемая переменной цикла или счетчиком цикла, которая увеличивается или уменьшается на заданную величину при каждом повторении цикла. Синтаксис этой конструкции следующий:
For counter = start To end [Step increment] операторы Next [counter]Параметры counter (счетчик), start (начало цикла), end (конец цикла) и increment (приращение) являются числовыми.
Примечание. Параметр increment может быть как положительным, так и отрицательным. Если он положителен, параметр start должен быть меньше или равен параметру end, иначе цикл не будет выполняться. Если параметр increment отрицателен, то параметр start должен быть больше или равен значению параметра end, чтобы выполнялось тело цикла. Если параметр Step не задан, то значение параметра increment по умолчанию равно 1.
VBA выполняет цикл For в следующей последовательности:
1. Устанавливает значение переменной цикла counter в значение start.
2. Сравнивает значение переменной цикла counter и значение параметра end. Если переменная counter больше, VBA завершает выполнение цикла. (Если значение параметра increment отрицательно, то VBA прекращает выполнение цикла при условии, что значение переменной цикла counter меньше значения параметра end.)
3. Выполняет операторы тела цикла statements.
4. Увеличивает значение переменной цикла counter на 1 или на величину значения параметра increment, если он задан.
5. Повторяет шаги со 2 по 4.
Рассмотрим пример: Вычислить значение функции f(t)
при заданных a, b, n, если t изменяется от a до b с шагом Dt=(b-a)/(n-1).
Sub пример3() Dim f() As Single Dim a As Single, b As Single, t As Single, dt As Single Dim i As Integer, n As Integer Call read("a1", a) : Call read("b1", b) : Call read("c1", n) ReDim f(1 To n - 1) dt = (b - a) / (n - 1) : t = a Call out("a2", "i") : Call out("b2", "t") : Call out("c2", "f(t)") For i = 1 To n - 1 t = t + dt If t <= -1 Then f(i) = -1 ElseIf t > 1 Then f(i) = 1 Else f(i) = t End If Call out("a" & (2 + i), i) : Call out("b" & (2 + i), t) : Call out("c" & (2 + i), f(i)) Next i End SubЦикл For Each . . . Next похож на цикл For . . . Next, но он повторяет группу операторов для каждого элемента из набора объектов или из массива, вместо повторения операторов заданное число раз. Он особенно полезен, когда неизвестно, сколько элементов содержится в наборе.
Синтаксис конструкции цикла For Each . . . Next таков:
For Each element In group операторы Next elementСледует помнить следующие ограничения при использовании цикла For Each . . . Next:
Для наборов параметр element может быть только переменной типа variant, общей переменной типа object или объектом, перечисленным в Object Browser Для массивов параметр element может быть только переменной типа Variant Нельзя использовать цикл For Each . . . Next с массивом, имеющим определенный пользователем тип, так как переменная типа variant не может содержать значение определенного пользователем типаЦикл Do применяется для выполнения блока операторов неограниченное число раз. Существует несколько разновидностей конструкции Do . . . Loop, но каждая из них вычисляет выражение-условие, чтобы определить момент выхода из цикла. Как и в случае конструкции If . . . Then условие должно быть величиной или выражением, принимающими значение False (нуль) или True (не нуль).
В следующей конструкции Do . . . Loop операторы выполняются до тех пор, пока значением условия является True (Истина):
Do While условие операторы LoopВыполняя этот цикл, VBA сначала проверяет условие. Если условие ложно (False), он пропускает все операторы цикла. Если оно истинно (True), VBA выполняет операторы цикла, снова возвращается к оператору Do While и снова проверяет условие.
Следовательно, цикл, представленный данной конструкцией, может выполняться любое число раз, пока значением условия является не нуль или True (Истина). Отметим, что операторы тела цикла не выполняются ни разу, если при первой проверке условия оно оказывается ложным (False).
Рассмотрим пример: Вычислить сумму ряда
с заданной точностью.
Sub пример4() Dim e As Single, x As Single, s As Single Dim m As Single, p As Single, i As Single Call read("a1", x) : Call read("b1", e) s = 0: i = 1: m = 1: p = -1 Call out("a2", "i") : Call out("b2", "m") : Call out("c2", "s") Do While Abs(m) >= e p = -p * x m = p / i s = s + m Call out("a" & (2 + i), i) : Call out("b" & (2 + i), Abs(m)) : Call out("c" & (2 + i), s) i = i + 1 Loop End SubДругая разновидность конструкции Do . . . Loop сначала выполняет операторы тела цикла, а затем проверяет условие после каждого выполнения. Эта разновидность гарантирует, что операторы тела цикла выполнятся по крайней мере один раз:
Do операторы Loop While условиеДве другие разновидности конструкции цикла аналогичны предыдущим, за исключением того, что цикл выполняется, пока условие ложно (False):
Цикл не выполняется вообще или выполняется много раз:операторы Loop
Цикл выполняется по крайней мере один раз:Do
операторы
Loop Until условие
7.2 Вложенные циклы.
Можно помещать структуры управления внутрь других структур управления (например, блок If . . . Then внутрь цикла For . . . Next). Говорят, что структура управления, помещенная внутрь другой структуры управления, является вложенной.
Глубина вложения управляющих структур в VBA не ограничена. Для улучшения читаемости кода принята практика смещения тела конструкции принятия решения или цикла в программе в случае использования вложенных структур управления.
При вложении в цикл одного или несколько других циклов говорят о вложенных циклах, в которых различают внешние (охватывающие) и внутренние (вложенные) циклы.
Рассмотрим пример суммирования элементов Aij матрицы A(n,m) построчно.
Sub пример5() Dim a() As Single, s() As Single Dim n As Integer, m As Integer Dim i As Integer, j As Integer Call read("a1", n): Call read("b1", m) ReDim a(1 To n, 1 To m), s(1 To n) 'Чтение матрицы For i = 1 To n For j = 1 To m Call readcell(i + 1, j, a(i, j)) Next j Next i 'Вычисление For i = 1 To n s(i) = 0 For j = 1 To m s(i) = s(i) + a(i, j) Next j Call outcell(i + 1, m + 1, s(i)) Next i End SubПри вводе/выводе элементов двумерного массива на рабочий лист Microsoft Excel удобно применять пользовательские процедуры ввода/вывода:
Sub readcell(i As Integer, j As Integer, val As Variant) val = Лист1.Cells(i, j).Value End Sub Sub outcell(i As Integer, j As Integer, val As Variant) Лист1.Cells(i, j).Value = val End Subгде I - номер строки, j - номер столбца рабочего листа.
Выход из структур управления
Оператор Exit позволяет выходить непосредственно из цикла For, цикла Do, процедуры Sub или процедуры Function. Синтаксис оператора Exit прост:
Exit For внутри цикла For и Exit Do внутри цикла Do могут появиться сколько угодно раз.
Оператор Exit Do работает со всеми разновидностями синтаксиса цикла Do.
Операторы Exit For и Exit Do применяются, если необходимо завершить цикл немедленно, не продолжая дальнейших итераций или не ожидая выполнения блока операторов в теле цикла.
При использовании оператора Exit для выхода из цикла значения переменной цикла зависят от того, каким образом завершается выполнение цикла:
При нормальном завершении цикла значение переменной цикла имеет на единицу больше верхней границы числа циклов При преждевременном завершении цикла переменная цикла сохраняет свое значение, которое она получила с учетом обычных правил При завершении цикла по концу набора переменная цикла имеет значение Nothing (Ничего), если она является переменной типа object (Объект), или значение Empty (Пусто), если она является переменной типа Variant2.5.2 VBA. Организация циклов | Пакеты прикладных программ
Операторы цикла используются для повторения выполнения действия или группы действий заданное количество раз. Количество повторений (итераций цикла) может быть предопределено или вычислено.
VBA поддерживает циклические конструкции двух видов:
- Циклы с фиксированным числом повторений (циклы со счетчиком).
- Циклы с неопределенными числом повторений (циклы с условием).
Для всех видов циклов используется понятие тело цикла, определяющее блок операторов, заключенных между начальным и конечным операторами цикла. Каждое повторение выполнения операторов тела цикла называется итерация.
Фиксированные циклы
VBA предоставляет две управляющие структуры для организации фиксированного цикла: For … Next (цикл со счетчиком) и For Each … Next (цикл с перечислением).
Оператор For … Next это типовой цикл со счетчиком, выполняющий заданное число итераций. Синтаксис оператора For … Next:
For <счетчик> = <начЗначение> То <конЗначение> [Step <приращение>] <блок операторов> Next [<счетчик>]Листинг 9. Оператор For … Next
' ЗАДАЧА: Составить программу, которая получает два числа от пользователя. ' Складывает все числа в диапазоне, заданном этими двумя числами, а затем ' отображает результирующую сумму. Sub sample7() Dim i As Integer ‘счетчик цикла Dim sStart ‘начальное значение счетчика Dim sEnd ‘конечное значение счетчика Dim sSum As Long ‘результирующая сумма sStart = InputBox("Введите первое число:") sEnd = InputBox("Введите второе число:") sSum = 0 For i = CInt(sStart) To CInt(sEnd) sSum = sSum + i Next i MsgBox "Сумма чисел от " & sStart & " до " & sEnd & " равна: " & sSum End SubОператор цикла For Each … Next относится к категории операторов объектного типа, т.е. применяется в первую очередь к коллекциям объектов, а также к массивам. Тело цикла выполняется фиксированное число раз, соответствующее числу элементов массива или коллекции. Формат оператора For Each … Next:
For Each <элемент> In <группа> <блок операторов> Next [<элемент>]Циклы с условием (неопределенные циклы)
Циклы с условием используются в тех случаях, когда повторяющиеся действия нужно выполнять только при определенных условиях. Количество итераций не определено и в общем случае может быть равно нулю (в частности, для циклов с предусловием). VBA предлагает разработчикам несколько управляющих структур для организации циклов с условием:
- Четыре вида циклов Do..Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки.
- Непрерываемый цикл While … Wend.
Цикл Do While … Loop - типичный цикл с предусловием. Условие проверяется до того, как выполняется тело цикла. Цикл продолжает свою работу, пока это <условие> выполняется (т.е. имеет значение True). Так как проверка выполняется в начале, то тело цикла может ни разу не выполниться. Формат цикла Do While … Loop:
Do While <условие> <блок операторов> LoopЛистинг 10. Цикл Do While … Loop
' ЗАДАЧА: Составить программу, которая предусматривает ввод пользователем ' произвольной последовательности чисел. Ввод должен быть прекращен ' только после того, как сумма введенных нечетных чисел превысит 100. Sub sample8() Dim OddSum As Integer ‘сумма нечетных чисел Dim OddStr As String ‘строка с нечетными числами Dim Num ‘для приема вводимых чисел OddStr = "" ‘инициализация выходной строки OddSum = 0 ‘инициализация суммы OddSum Do While OddSum < 100 ‘начало цикла Num = InputBox("Введите число: ") If (Num Mod 2) <> 0 Then ‘проверка на четность OddSum = OddSum + Num ‘накопление суммы нечетных чисел OddStr = OddStr & Num & " " End If Loop 'вывод строки с нечетными числами MsgBox prompt:="Нечетные числа: " & OddStr End SubЛистинг 11. Цикл с постусловием
' ЗАДАЧА: Составить программу игры "Угадай число". Программа должна случайным ' образом генерировать число в диапазоне от 1 до 1000, пользователь должен ' угадать это число. Программа на каждое вводимое число выводит подсказку ' "больше" или "меньше". Sub sample8() Randomize Timer ' инициализация генератора случайных чисел Dim msg As String ' строка сообщения Dim SecretNumber As Long, UserNumber As Variant Begin: SecretNumber = Round(Rnd * 1000) ' число, сгенерированное компьютером UserNumber = Empty ' число, вводимое пользователем Do ' игровой процесс Select Case True Case IsEmpty(UserNumber): msg = "Введите число" Case UserNumber > SecretNumber: msg = "Слишком много!" Case UserNumber < SecretNumber: msg = "Слишком мало!" End Select UserNumber = InputBox(prompt:=msg, Title:="Угадай число") Loop While UserNumber <> SecretNumber ' проверка If MsgBox("Играть еще? ", vbYesNo + vbQuestion, "Вы угадали!") = vbYes Then GoTo Begin End If End SubЦиклы Do Until … Loop и Do … Loop Until являются инверсиями ранее рассмотренных циклов с условием. В общем случае они работают аналогично, за исключением того, что тело цикла выполняется при ложном условии (т.е. <условие>=False). Формат цикла Do Until … Loop:
Do Until <условие> <блок операторов> LoopФормат цикла Do … Loop Until:
Do <блок операторов> Loop Until<условие>Практическое задание: Перепишите программы из листингов 10 и 11 с использованием инвертированных операторов цикла.
Цикл While … Wend также относится к циклам с условием. Данный оператор полностью соответствует структуре Do While … Loop. Формат цикла While … Wend:
While <условие> <блок операторов> WendОтличительной особенностью этого оператора является невозможность принудительного завершения (прерывания) тела цикла (оператор Exit Do не работает в цикле While … Wend).
Прерывание цикла
Для досрочного завершения итерации и выхода из цикла применяется оператор Exit. Этот оператор применим в любой циклической структуре, кроме While ... Wend. Общий синтаксис использования Exit для прерывания цикла таков:
<начало_цикла> [<блок операторов1>] Exit (For | Do) [<блок операторов2>] [Exit (For | Do)] ... <конец_цикла>При выполнении оператора Exit цикл прерывается, и управление передается оператору, следующему за оператором <конец_цикла>. В теле цикла может присутствовать несколько операторов Exit.
Листинг 12. Принудительный выход из цикла
Sub sample9() For i = 1 To 10000000 If i = 10 Then Exit For ' выход из цикла, когда счетчик достигнет 10 Next End SubАнатольев А.Г., 01.10.2012
Постоянный адрес этой страницы:
www.4stud.info
Программирование циклов, цикл 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 предназначен для организации цикла-для.
Инструкции будут выполняться определенное количество раз, задаваемое в счетчик, начиная с начального значение (начальное_знач) до конечного значения (конечное_знач) с некоторым шагом (шаг). Конструкция Exit For предназначена для преждевременного выхода из цикла.
Пример. Вычислить сумму чисел от 0 до 100.
Решение.
Sub сумма4() Dim x, s As Integer s = 0 For x = 0 To 100 s = s + x Next x MsgBox ("s=" + Str(s)) End SubПримеры решения задач
Пример 1. Представить таблицу квадратов чисел от 2 до 10.
Решение.
Для отображения результатов воспользуемся Excel и для доступа к ячейкам функцией Cells (номер_строки, номер_колонки).
Sub квадраты() Dim x Cells(2, 1).Value = "x" Cells(3, 1).Value = "x^2" For x = 2 To 10 Cells(2, x).Value = x Cells(3, x).Value = x ^ 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 Sub3. Построить график с помощью мастера диаграмм, выбрав точечную диаграмму.
4. Изменить данные a и b.
A=2 B=15. Перезапустить макрос.
itteach.ru
Циклы VBA
Цикл – это алгоритмическая структура, при помощи которой реализуется многократное повторение блока операторов.
Оператор цикла со счетчиком (For … Next)
Инструкция For … Next позволяет циклически выполнить набор инструкций (операторов) заданное количество раз. Синтаксис инструкции:
For счетчик = нач_значение To конеч_значение [Step шаг]
[инструкции]
[Exit For]
[инструкции]
Next [счетчик]
Параметр счетчик – это числовая переменная, автоматически изменяющая свое значение на величину шаг после каждого повтора цикла. Цикл выполняется до тех пор, пока счетчик £ конеч_значение при положительном значении параметра шаг или до тех пор, пока счетчик ³ конеч_значение при отрицательном значении параметра шаг. Таким образом, цикл не выполнится ни разу, если при положительном значении шага нач_значение больше, чем конеч_значение. Если параметр Step шаг опущен, то по умолчанию приращение переменной-счетчика полагается равным 1.
Оператор Exit For завершает выполнение цикла "досрочно" и передает управление оператору, следующему за оператором цикла. Exit For обычно располагают в условном операторе, например:
If условие Then Exit For
Примечание. По синтаксису оператора For параметр счетчик – арифметическая переменная любого типа, все же лучше использовать целый тип переменной, т. к. дробная часть значения переменной вещественного типа обычно имеет погрешность. Это связано со способом хранения чисел в компьютере.
Пример 1
Найти сумму первых 10 натуральных чисел: S = 1 + 2 + 3 + … + 10. Фрагмент программы:
Dim I as Integer, S as Integer
S = 0 'Обнуляем значение переменной S
For i = 1 to 10 'Начало цикла. Задаем начальное и конечное значения'параметра цикла. Шаг цикла по умолчанию равен 1.
S = S + i 'Оператор присваивания выполняется при каждом ' выполнении цикла, в данном примере 10 раз
Next I 'Конец цикла. Значение параметра цикла увеличивается на шаг.
В этом фрагменте программы цикл выполнится ровно 10 раз.
Пример 2
Вывести в 1-й столбец рабочего листа (начиная со2-й строки) значения х в диапазоне от 0 до 3,2 с шагом 0,4.
Public Sub Табуляция()
Dim x As Single, i As Integer
i = 2
For x = 0 To 3.2 Step 0.4
Cells(i, 1) = x
i = i + 1
Next x
End Sub
Хотя длина интервала [0; 3.2] точно делится на шаг 0.4, результат на рабочем листе имеет вид:
Что же предпринять?
1. Можно слегка увеличить конечное значение, в данном примере вместо 3.2 написать 3.201.
2. Определить число повторений чикла и написать цикл по счетчику целого типа.
В данном случае программа примет вид:
Public Sub Табуляция1()
Dim x As Single, i As Integer, n As Integer
n = CInt((3.2 - 0) / 0.4)
For i = 0 To n Step 1
x = 0 + i * 0.4
Cells(i + 2, 1) = x
Next i
End Sub
Оператор цикла For Each … Next
Цикл For Each … Next позволяет повторить выполнение группы инструкций для каждого элемента массива или семейства. Данная инструкция имеет следующий синтаксис:
For Each элемент In группа
[инструкции]
[Exit For]
[инструкции]
Next [элемент]
Параметр элемент – это переменная, которая представляет элемент семейства или массива. Аргумент группа – имя массива или семейства. Инструкции выполняются только один раз для каждого члена группы. Использование инструкции удобно потому, что не требуется заранее знать, сколько элементов содержится в массиве или семействе. Переменная элемент должна иметь тип Variant.
Пример 1
Найти среднее арифметическое значение всех элементов выделенного диапазона
Public Function Среднее(Диапазон As Range) As Double
Dim Элемент As Variant
Dim Сумма As Double
Dim Количество As Integer
Сумма = 0
Количество = 0
For Each Элемент In Диапазон
Сумма = Сумма + Элемент
Количество = Количество + 1
Next Элемент
Среднее = Сумма / Количество
End Function
Применение. В выделенном диапазоне смежных ячеек должны находиться числа. Числа в пустых ячейках считаются равными 0. Текст в ячейке приведет к ошибке.
Перечисленные выше операторы If … End If, Select … Case, For … Next, For Each … Next представляют собой группу управляющих инструкций, которые изменяют порядок выполнения команд. Управляющие инструкции могут быть вложены друг в друга в любой последовательности.
po-teme.com.ua
8. Циклы в vba Cтруктура For ….Next
Если заранее известно, сколько раз нужно выполнить операторы в цикле, то можно воспользоваться структурой For …Next
Cинтаксис
For счётчик=начальное_значение to конечное_значение [step приращение]
Операторы
Next [счётчик]
Переменная-счётчик запоминает число повторов, и указываются начальное и конечное значения счётчика. Эти значения и приращение могут быть числовыми значениями или выражениями.
Пример
Вычислить значение функции у=sin(x) при x=2,4,6,8,10 и вывести на экран.
Dim x As Integer, y As Single
For x = 2 To 10 Step 2
y = Sin(x)
MsgBox Str(y)
Next x
Если приращение отрицательно, то цикл начинает работу так же, как и при положительном и выполняет одно из двух действий:
Если значение счётчика < конечного значения, то выход из цикла.
Если значение счётчика > конечного значения или равно ему, то выполняются операторы цикла и счётчик уменьшается на значение приращения.
Структура For Each … Next
Этот цикл похож на предыдущий, но в нём блок операторов повторяется не указанное число раз, а для каждого элемента массива или для каждого объекта семейства.
С помощью этого цикла можно перебирать все элементы массива или семейства, даже не зная, каково их число.
Синтаксис
For Each элемент In группа
Операторы
Next [элемент]
Группа-это имя семейства объектов или массива. Для семейства объектов элемент-это переменная, представляющая объект-член семейства. Она должна иметь тип Variant или Object. Перебор элементов выполняется быстрее, так как запоминается номер позиции элемента.
Структура Do… Loop
Структура Do… Loop позволяет повторять группу операторов неопределённое число операторов. Цикл завершается по условию. Условие должно быть выражением, принимающим значения True или False. Существуют четыре разновидности циклов
Do… Loop.
Структура Do While … Loop
Cинтаксис
Do While условие
операторы
Loop
Если условие принимает значение False, то осуществляется выход из цикла, в противном случае работают операторы цикла.
Начало цикла
Условие TrueОператоры
False
Конец цикла
Структура Do ….While Loop
Cинтаксис
Do
Операторы
Loop While условие
Если условие принимает значение False, то осуществляется выход из цикла, в противном случае работают операторы цикла. Отличие от предыдущего в том, что эта структура при любом значении условия отработает всегда хотя бы один раз.
Начало цикла
Операторы
Условие True
False
Конец цикла
studfiles.net
Организация циклов в VBA | Программирование VBA в СУБД Access 2003
Операторы циклов в VBA
2012-04-30Автор: Владимир Ткаченко
Источник: Обучение в интернет
Цикл - это группа операторов, которые многократно выполняются. Для организации циклов в VBA, т. е. многократного выполнения одного или нескольких операторов, можно использовать две основные группы: циклы с перечислением For...Next и циклы с условием Do... Loop. Существуют две разновидности For...Next (For—Next и For Each—Next) и два вида циклов Do...Loop (Do While...Loop и Do Until ...Loop), которые различаются типом проверяемого условия.
Цикл For—NextСамым распространенным циклом в VBA является цикл с перечислением "For—Next". Этому циклу необходимо задать границы (начальное и конечное значения счетчика) в пределах которых будет изменяться переменная цикла.
Оператор цикла имеет следующий синтаксис:For счетчик = Начальное Значение (например, Например, For n = 1) То Конечное Значение (То 10)Step Приращение (Step 2) [Инструкции] или [блок Операторов]Next [счетчик]
Здесь переменная - это счетчик, значение переменной увеличивается или уменьшается с каждым повторением цикла. Если в конструкции цикла отсутствует Step, то приращение равно 1 (по умолчанию). Для досрочного выхода из оператора цикла, т.е. до достижения счетчиком конечного значения, в конструкцию цикла надо ввести оператор Exit For.
С учетом Exit For оператор цикла имеет следующий синтаксис:For счетчик = Начальное Значение (например, Например, For n = 1) То Конечное Значение (То 10)Step Приращение (Step 2) [Инструкции] или [блок Операторов]Exit ForNext [счетчик]
Для обработки группы однородных объектов или массивов применяется следующая конструкция цикла:For Each Элемент In Группа (имя группы однородных объектов) [Инструкции] или [блок Операторов]Exit ForNext элемент
Циклы с условием Do While...Loop и Do Until…LoopОператор Do While…Loop выполняет циклы до тех пор, пока соблюдается какое-либо заданное условие. Необходимо отметить, что условие проверяется до того, как выполняется инструкция или группа операторов.
В этом случае синтаксис операторов цикла Do While...Loop имеет следующий вид:Do While условие (Например, x<20) [Инструкции] или [блок Операторов]Exit DoLoop
Если надо проверять условие после того, как инструкции или блок операторов будут выполнены хотя бы один раз, то можно применить следующую конструкцию оператора цикла: Do [Инструкции] или [блок Операторов]Exit DoLoop While условие
Оператор Do Until…Loop выполняет циклы до тех пор, пока условие не соблюдается, а при соблюдении условия оператор выходит из цикла. Условие проверяется до того, как выполняется инструкция или группа операторов.
В этом случае синтаксис операторов цикла Do Until...Loop имеет следующий вид:Do Until условие (Например, x=20) [Инструкции] или [блок Операторов]Exit DoLoop
Если надо проверять условие после того, как инструкции или блок операторов будут выполнены хотя бы один раз, то можно применить следующую конструкцию оператора цикла: Do [Инструкции] или [блок Операторов]Exit DoLoop Until условие
www.lessons-tva.info
VBA. Организация циклов.
VBA. Организация циклов.
Операторы цикла используются для повторения выполнения действия или группы действий заданное количество раз. Количество повторений (итераций цикла) может быть предопределено или вычислено.
VBA поддерживает циклические конструкции двух видов:
- Циклы с фиксированным числом повторений (циклы со счетчиком).
- Циклы с неопределенными числом повторений (циклы с условием).
Для всех видов циклов используется понятие тело цикла, определяющее блок операторов, заключенных между начальным и конечным операторами цикла. Каждое повторение выполнения операторов тела цикла называется итерация.
Фиксированные циклы
VBA предоставляет две управляющие структуры для организации фиксированного цикла: For … Next (цикл со счетчиком) и For Each … Next (цикл с перечислением).
Оператор For … Next это типовой цикл со счетчиком, выполняющий заданное число итераций. Синтаксис оператора For … Next:
For <счетчик> = <начЗначение> То <конЗначение> [Step <приращение>]
<блок операторов>
Next [<счетчик>]
Пример использования оператора For … Next.
Листинг 1. Оператор For … Next
‘ ЗАДАЧА: Составить программу, которая получает два числа от пользователя.
‘ Складывает все числа в диапазоне, заданном этими двумя числами, а затем
‘ отображает результирующую сумму.
Sub sample7()
Dim i As Integer ‘счетчик цикла
Dim sStart ‘начальное значение счетчика
Dim sEnd ‘конечное значение счетчика
Dim sSum As Long ‘результирующая сумма
sStart = InputBox(“Введите первое число:”)
sEnd = InputBox(“Введите второе число:”)
sSum = 0
For i = CInt(sStart) To CInt(sEnd)
sSum = sSum + i
Next i
MsgBox “Сумма чисел от ” & sStart & ” до ” & sEnd & ” равна: ” & sSum
End Sub
Оператор цикла For Each … Next относится к категории операторов объектного типа, т.е. применяется в первую очередь к коллекциям объектов, а также к массивам. Тело цикла выполняется фиксированное число раз, соответствующее числу элементов массива или коллекции. Формат оператора For Each … Next:
For Each <элемент> In <группа> <блок операторов> Next [<элемент>]
Циклы с условием (неопределенные циклы)
Циклы с условием используются в тех случаях, когда повторяющиеся действия нужно выполнять только при определенных условиях. Количество итераций не определено и в общем случае может быть равно нулю (в частности, для циклов с предусловием). VBA предлагает разработчикам несколько управляющих структур для организации циклов с условием:
- Четыре вида циклов Do..Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки.
- Непрерываемый цикл While … Wend.
Цикл Do While … Loop – типичный цикл с предусловием. Условие проверяется до того, как выполняется тело цикла. Цикл продолжает свою работу, пока это <условие> выполняется (т.е. имеет значение True). Так как проверка выполняется в начале, то тело цикла может ни разу не выполниться. Формат цикла Do While … Loop:
Do While <условие>
<блок операторов>
Loop
Листинг 2. Цикл Do While … Loop
‘ ЗАДАЧА: Составить программу, которая предусматривает ввод пользователем
‘ произвольной последовательности чисел. Ввод должен быть прекращен
‘ только после того, как сумма введенных нечетных чисел превысит 100.
Sub sample8()
Dim OddSum As Integer ‘сумма нечетных чисел
Dim OddStr As String ‘строка с нечетными числами
Dim Num ‘для приема вводимых чисел
OddStr = “” ‘инициализация выходной строки
OddSum = 0 ‘инициализация суммы OddSum
Do While OddSum < 100 ‘начало цикла
Num = InputBox(“Введите число: “)
If (Num Mod 2) <> 0 Then ‘проверка на четность
OddSum = OddSum + Num ‘накопление суммы нечетных чисел
OddStr = OddStr & Num & ” ”
End If
Loop
‘вывод строки с нечетными числами
MsgBox prompt:=”Нечетные числа: ” & OddStr
End Sub
Оператор Do … Loop While предназначен для организации цикла с постусловием. Условие проверяется после того, как тело цикла, будет выполнено хотя бы один раз. Цикл продолжает свою работу, пока <условие> остается истинным. Формат цикла Do … Loop While:
Do <блок операторов> Loop While<условие>
Листинг 3. Цикл с постусловием
‘ ЗАДАЧА: Составить программу игры “Угадай число”. Программа должна случайным
‘ образом генерировать число в диапазоне от 1 до 1000, пользователь должен
‘ угадать это число. Программа на каждое вводимое число выводит подсказку
‘ “больше” или “меньше”.
Sub sample8()
Randomize Timer ‘ инициализация генератора случайных чисел
Dim msg As String ‘ строка сообщения
Dim SecretNumber As Long, UserNumber As Variant
Begin: SecretNumber = Round(Rnd * 1000) ‘ число, сгенерированное компьютером
UserNumber = Empty ‘ число, вводимое пользователем
Do ‘ игровой процесс
Select Case True
Case IsEmpty(UserNumber): msg = “Введите число”
Case UserNumber > SecretNumber: msg = “Слишком много!”
Case UserNumber < SecretNumber: msg = “Слишком мало!”
End Select
UserNumber = InputBox(prompt:=msg, Title:=”Угадай число”)
Loop While UserNumber <> SecretNumber
‘ проверка
If MsgBox(“Играть еще? “, vbYesNo + vbQuestion, “Вы угадали!”) = vbYes Then
GoTo Begin
End If
End Sub
Циклы Do Until … Loop и Do … Loop Until являются инверсиями ранее рассмотренных циклов с условием. В общем случае они работают аналогично, за исключением того, что тело цикла выполняется при ложном условии (т.е. <условие>=False). Формат цикла Do Until … Loop:
Do Until <условие> <блок операторов> Loop
Формат цикла Do … Loop Until:
Do
<блок операторов>
Loop Until<условие>
Практическое задание: Перепишите программы из листингов 10 и 11 с использованием инвертированных операторов цикла.
Цикл While … Wend также относится к циклам с условием. Данный оператор полностью соответствует структуре Do While … Loop. Формат цикла While … Wend:
While <условие>
<блок операторов>
Wend
Отличительной особенностью этого оператора является невозможность принудительного завершения (прерывания) тела цикла (оператор Exit Do не работает в цикле While … Wend).
Прерывание цикла
Для досрочного завершения итерации и выхода из цикла применяется оператор Exit. Этот оператор применим в любой циклической структуре, кроме While … Wend. Общий синтаксис использования Exit для прерывания цикла таков:
<начало_цикла>
[<блок операторов1>]
Exit (For | Do)
[<блок операторов2>]
[Exit (For | Do)]
…
<конец_цикла>
При выполнении оператора Exit цикл прерывается, и управление передается оператору, следующему за оператором <конец_цикла>. В теле цикла может присутствовать несколько операторов Exit.
Листинг 4. Принудительный выход из цикла
Sub sample9()
For i = 1 To 10000000
If i = 10 Then Exit For ‘ выход из цикла, когда счетчик достигнет 10
Next
End Sub
webhamster.ru