«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 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...Loop

Цикл 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):

 Цикл не выполняется вообще или выполняется много раз:

Do Until условие

операторы 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

Заметим, что первый оператор Next закрывает внутренний цикл For, а последний оператор Next закрывает внешний цикл For. Точно так же и для вложенных операторов If, операторы End If автоматически применяются для закрытия ближайшего к нему оператора If. Вложенные структуры Do . . . Loop работают подобным же образом: самый дальний оператор Loop соответствует самому дальнему оператору Do.

При вводе/выводе элементов двумерного массива на рабочий лист 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 прост:

For counter = start To end [Step -increment] [блок операторов] [Exit For] [блок операторов] Next [counter] Do [(While | Until} условие] [блок операторов] [Exit Do] [блок операторов] Loop

Exit For внутри цикла For и Exit Do внутри цикла Do могут появиться сколько угодно раз.

Оператор Exit Do работает со всеми разновидностями синтаксиса цикла Do.

Операторы Exit For и Exit Do применяются, если необходимо завершить цикл немедленно, не продолжая дальнейших итераций или не ожидая выполнения блока операторов в теле цикла.

При использовании оператора Exit для выхода из цикла значения переменной цикла зависят от того, каким образом завершается выполнение цикла:

 При нормальном завершении цикла значение переменной цикла имеет на единицу больше верхней границы числа циклов  При преждевременном завершении цикла переменная цикла сохраняет свое значение, которое она получила с учетом обычных правил  При завершении цикла по концу набора переменная цикла имеет значение Nothing (Ничего), если она является переменной типа object (Объект), или значение Empty (Пусто), если она является переменной типа Variant

www.mini-soft.ru

2.5.2 VBA. Организация циклов | Пакеты прикладных программ

Операторы цикла используются для повторения выполнения действия или группы действий заданное количество раз. Количество повторений (итераций цикла) может быть предопределено или вычислено.

VBA поддерживает циклические конструкции двух видов:

  1. Циклы с фиксированным числом повторений (циклы со счетчиком).
  2. Циклы с неопределенными числом повторений (циклы с условием).

Для всех видов циклов используется понятие тело цикла, определяющее блок операторов, заключенных между начальным и конечным операторами цикла. Каждое повторение выполнения операторов тела цикла называется итерация.

Фиксированные циклы

VBA предоставляет две управляющие структуры для организации фиксированного цикла: For … Next (цикл со счетчиком) и For Each … Next (цикл с перечислением).

Оператор For … Next это типовой цикл со счетчиком, выполняющий заданное число итераций. Синтаксис оператора For … Next:

For <счетчик> = <начЗначение> То <конЗначение> [Step <приращение>] <блок операторов> Next [<счетчик>]

Пример использования оператора For ... 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

Оператор Do … Loop While предназначен для организации цикла с постусловием. Условие проверяется после того, как тело цикла, будет выполнено хотя бы один раз. Цикл продолжает свою работу, пока <условие> остается истинным. Формат цикла Do … Loop While:

Do <блок операторов> Loop While<условие>

Листинг 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 Sub

3. Построить график с помощью мастера диаграмм, выбрав точечную диаграмму.

4. Изменить данные a и b.

A=2 B=1

5. Перезапустить макрос.

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 поддерживает циклические конструкции двух видов:

  1. Циклы с фиксированным числом      повторений (циклы со счетчиком).
  2. Циклы с неопределенными числом      повторений (циклы с условием).

Для всех видов циклов используется понятие тело цикла, определяющее блок операторов, заключенных между начальным и конечным операторами цикла. Каждое повторение выполнения операторов тела цикла называется итерация.

Фиксированные циклы

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