Для чего предназначен оператор next. Циклы VBA

Лабораторные работы по основам программирования

2.1. Табулирование функций, представленных аналитически
и сходящимся рядом

Цель работы

· Закрепление теоретических знаний по основам организации разветвляющихся и циклических структур.

· Приобретение практических навыков программирования с использованием разветвляющихся и циклических структур в системе Visual Basic.

В VB существуют три вида операторов цикла:

· счетный цикл: For…To … Next

· циклы с предусловиями: Do While...Loop, Do Until...Loop, While…WEnd

· циклы с постусловиями:Do...Loop While, Do...Loop Until.

Счетный цикл – позволяет циклически выполнять набор операторов заданное число раз. Его синтаксис следующий:

For счетчик = начало To конец

[операторы ]

[операторы ]

Next [счетчик ]

Параметр счетчик – это числовая переменная (целого, вещественного типа или типа Date, Variant, Currency), которая автоматически увеличивается после каждого повтора. Начальное значение счетчика равно параметру начало, а конечное параметру – конец. Если не указан, то шаг считается равным 1, значение шага можно изменять. Оно может быть положительным или отрицательным числом.

Существуют четыре синтаксические конструкции цикла Do….Loop:

Операторы между ключевыми словами Do … Loop выполняются заданное количество раз в зависимости от условия. Например, в следующем фрагменте программы при C = 100 условие будет выполняться и произойдет вход в цикл. Внутри цикла происходит обращение к процедуре и уменьшение значения C на 1. Далее вновь проверяется условие (C > 0) и операторы цикла выполняются повторно (всего они выполнятся 100 раз), до C = 0. Когда же условие C >0 становится ложным и цикл прекращается.

Do While C > 0

Тот же самый фрагмент программы, выполненный с использованием цикла с предусловием по синтаксису 2:

В данном случае цикл выполняется, пока условие равно False, в отличие от предыдущего случая, то есть продолжается до выполнения условия C = 0.

Операторы циклов по синтаксису 3 и 4 очень похожи на первые два за исключением того, что условие не вычисляется до тех пор, пока цикл не выполнится хотя бы один раз.

В синтаксисах этих циклов можно использовать операторы безусловного выхода из цикла Exit For и Exit Do, позволяющих передать управление оператору, находящемуся за циклом. Например, в следующем фрагменте программы, если начальное значение C окажется >50, то цикл немедленно прекратиться.



Do Until C <= 0

MsgBox “Нач. значение больше допустимого”, ”Ошибка ввода”

Цикл While…Wend использовался в ранних версиях Visual Basic. Его синтаксис следующий:

While <условие>

<Операторы>

В отличии от цикла Do..Loop цикл While ..Wend не имеет второго варианта, в котором проверка условия выполняется в конце цикла. Кроме того, для него нет оператора выхода из цикла, наподобие Exit Do.

Оператор цикла for next VBA языка используется для выполнения блока операторов фиксированное количество раз, чаще всего данный цикл применяется при обработке массивов. Цикл for next является в своей сфере самым простым, тут задается начальное и конечное значение, а также, можно задать шаг счетчика.

Давайте рассмотрим общий синтаксис:

For счетчик = начало To конец
Операторы
Next счетчик

Счетчик – тут мы указываем имя переменной, которая будет хранить информацию о количестве итераций (количество выполненных походов цикла).

Начало – начальное значение счетчика, является числовым выражением

Конец – конечное значение счетчика, числовое выражение, которое задает количество проходов.

Шаг – необязательный параметр, который позволяет задавать шаг выполнения. Если данный параметр отсутствует, то увеличение счетчика при каждом проходе равно единице. Использование шага актуально в том случае, если нужно методом перебора решить уравнение, так, можно задать начальное значение 1, конечное 3 и шаг в 0,2.

В самом конце цикла можно и не указывать имя переменной (счетчик), но это актуально, если используется вложенный цикл for, это позволит сделать код более читабельным.

Для примера, создайте форму с двумя текстовыми метками и одной кнопкой, в редакторе кода пропишите:

Private Sub CommandButton1_Click() Dim i, j, a, b For i = 1 To 10 Step 2 a = a & i & " " Next i For j = 1 To 10 Step 3 b = b & j & " " Next j Label1.Caption = a Label2.Caption = b End Sub Private Sub UserForm_Initialize() Label1.Caption = "" Label1.FontSize = 14 Label1.ForeColor = vbBlue Label2.Caption = "" Label2.FontSize = 14 Label2.ForeColor = vbRed CommandButton1.Caption = "Значения" End Sub

В данном примере, у нас есть два параметра цикла , в каждом заданы одинаковые начальные и конечные значения, но, в первом задан шаг 2, а во втором – 3.

В параметре Шаг можно указать и отрицательное значение, в этом случае будет происходить прирост счетчика в обратном порядке, например:

Private Sub CommandButton1_Click() Dim i, j, SummA, SummB For i = 1 To 10 SummA = SummA + i Next For j = 10 To 1 Step -1 SummB = SummB + j Next Label1.Caption = "Прямой порядок: " & SummA Label2.Caption = "Обратный порядок: " & SummB End Sub

Тут мы вычисляем сумму чисел от 1 до 10 при прямом и обратном порядке.

Довольно часто при использовании оператора цикла for next VBA языка может возникнуть ситуация, когда при заданном условии надо прекратить перебор данных, в этом случае используется выражение Exit For , например:

В данном примере используется вложенный цикл VBA for next. В первом случае происходит суммирование чисел от 1 до 100, при этом суммирование повторяется 100 раз. Во втором случае мы прописали условие с помощью условного оператора if – если сумма больше 10 тысяч, то произвести выход из цикла.

Хорошо, теперь попробуем написать более практичный пример – решение квадратного уравнения методом перебора:

Private Sub CommandButton1_Click() Const a = -2, b = 6, c = 20 Dim x, result, res For x = -10 To 10 Step 0.5 result = a * (x * x) + b * x + c If result = 0 Then res = res & " " & x End If Next x Label1.Caption = "х ровно: " & res End Sub

В данном примере мы объявили три константы a, b и с, со значениями -2, 6 и 20, это параметры квадратного уравнения (a*x*x + b*x + c = 0). В цикле происходит изменение переменной х в диапазоне от -10 до 10 с шагом в 0,5. При каждой итерации происходит проверка условия на равенство нулю, если условие выполняется, в переменную res записывается значение переменной x. В итоге, уравнение будет иметь два решения: -2 и 5.

И так, в этой статье мы рассмотрели цикл for next языка VBA, который применяется для обработки заданного количества раз одних и тех же действий, в следующей статье мы рассмотрим , который используется для обработки коллекций, там же мы рассмотрим и сами коллекции.

VBA. Организация циклов.

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

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

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

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

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

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

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

For <счетчик> = <начЗначение> То <конЗначение>

<блок операторов>

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:

<блок операторов>

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 цикл прерывается, и управление передается оператору, следующему за оператором <конец_цикла>. В теле цикла может присутствовать несколько операторов Exit.

Листинг 4. Принудительный выход из цикла

Sub sample9()

For i = 1 To 10000000

If i = 10 Then Exit For ‘ выход из цикла, когда счетчик достигнет 10

Next

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

Процесс выполнения все операторов, заключенных в структуру цикла, один раз называется итерацией цикла .

Структуры цикла, всегда выполняющиеся заданное количество раз, называются циклами с фиксированным числом итераций . Другие типы структур цикла повторяются переменное количество раз в зависимости от некоторого набора условий. Такие циклы называются неопределенными циклами .

Блок операторов, находящийся между началом и концом цикла называется "тело цикла" .

Самой простой структурой цикла является фиксированный цикл .

Цикл For..Next

Синтаксис

For counter = Start To End
Statements
Next [counter ]

Counter - любая численная переменная VBA
Start - любое численное выражение, определяет начальное значение для переменной counter
End - численное выражение, определяет конечное значение для переменной counter


По умолчанию VBA увеличивает переменную counter на 1 каждый раз при выполнении операторов в цикле. Можно задать другое значение (SterSize - любое численное выражение), на которое будет изменяться counter .

Ключевое слово Next сообщает VBA о том, что достигнут конец цикла. Необязательная переменная counter после ключевого слова Next должна быть той же самой переменной counter , которая была задана после ключевого слова For в начале структуры цикла.


Ниже представлен листинг простейшего цикла For..Next , который считает сумму цифр от 1 до 10:



А теперь два варианта цикла For..Next с использованием шага цикла отличного от единицы:



Обратите внимание! При уменьшении счетчика цикла For..Next цикл выполняется, пока переменная счетчика больше или равна конечному значению, а когда счетчик цикла увеличивается, цикл выполняется, пока переменная счетчика меньше или равна конечному значению.

Цикл For Each..Next

Цикл For Each..Next не использует счетчик цилка. Циклы For Each..Next выполняются столько раз, сколько имеется элементов в определенной группе, такой как коллекция объектов или массив (которые будут рассматриваться позже). Проще говоря, цикл For Each..Next выполняется один раз для каждого элемента в группе.

Синтаксис

For Each Element In Group
Statements
Next [Element ]

Element - переменная, используемая для итерации по всем элементам в определенной группе
Group - это объект коллекции или массив
Statements - один, несколько или ни одного оператора VBA (тело цикла).

Цикл – это алгоритмическая структура, при помощи которой реализуется многократное повторение блока операторов.

Оператор цикла со счетчиком (For … Next)

Инструкция For … Next позволяет циклически выполнить набор инструкций (операторов) заданное количество раз. Синтаксис инструкции:

For счетчик = нач_значение To конеч_значение

[инструкции ]

[инструкции ]

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

For x = 0 To 3.2 Step 0.4

Хотя длина интервала точно делится на шаг 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

Cells(i + 2, 1) = x

Оператор цикла For Each … Next

Цикл For Each … Next позволяет повторить выполнение группы инструкций для каждого элемента массива или семейства. Данная инструкция имеет следующий синтаксис:

For Each элемент In группа

[инструкции ]

[инструкции ]

Next [элемент ]

Параметр элемент – это переменная, которая представляет элемент семейства или массива. Аргумент группа – имя массива или семейства. Инструкции выполняются только один раз для каждого члена группы. Использование инструкции удобно потому, что не требуется заранее знать, сколько элементов содержится в массиве или семействе. Переменная элемент должна иметь тип Variant.

Пример 1

Найти среднее арифметическое значение всех элементов выделенного диапазона

Public Function Среднее(Диапазон As Range) As Double

Dim Элемент As Variant

Dim Сумма As Double

Dim Количество As Integer

Количество = 0

For Each Элемент In Диапазон

Сумма = Сумма + Элемент

Количество = Количество + 1

Next Элемент

Среднее = Сумма / Количество

Применение. В выделенном диапазоне смежных ячеек должны находиться числа. Числа в пустых ячейках считаются равными 0. Текст в ячейке приведет к ошибке.

Перечисленные выше операторы If … End If, Select … Case, For … Next, For Each … Next представляют собой группу управляющих инструкций, которые изменяют порядок выполнения команд. Управляющие инструкции могут быть вложены друг в друга в любой последовательности.

Похожие публикации