Операторы цикла в vba. Циклы VBA. Операторы Continue и Exit

28.03.2020 Новости

Алгоритм цикла For….Next приведен на рис. 5.28.

Counter – любая численная переменная VBA, обычно переменная типа Integer или Long.

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

End – численное выражение, определяющее конечное значение для переменной Counter .

Statements – один, несколько или ни одного оператора. Эти операторы выполняют тело цикла. VBA выполняет каждый из этих операторов при каждом выполнении цикла.

Ключевое слово Next

Counter=counter+StepSise

Рис.9.28. Алгоритм цикла For….Next

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

Синтаксис :

For counter = Start To End

При выполнении цикла For Next VBA поступает следующим образом:

Присваивает значение, представленное Star , переменной С ounter .

Выполняет все операторы, представленные с помощью Statements , пока не достигнет ключевого слова Next . Ключевое слово Next показывает VBA на то, что достигнут конец тела цикла.

Изменяет переменную С ounter на величину StepSize (если включается необязательное слово Step) Если Step не определено, то VBA увеличивает переменную counter на 1.

Возвращается к началу цикла и сравнивает текущее значение переменной С ounter со значением, представленным End. Если значение С ounter меньше значения End , VBA продолжает выполнение с первого оператора после ключевого слова Next .

9.2.4. Ввод-вывод одномерных и двухмерных массивов

Массив (array ) – это коллекция переменных, которые имеют общее имя и базовый тип. Массив является удобным способом хранения нескольких связанных элементов данных в едином контейнере для большего удобства и эффективности программирования. Все элементы данных, сохраняемых в массиве, должны иметь один и тот же тип.

Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. Кроме уменьшения общего числа различных имен переменных, которые необходимо отслеживать, другим основным преимуществом использования массивов является то, что можно использовать циклы для легкой обработки различных элементов массивов. Объединяя массивы и структуры цикла (обычно For….Next) можно написать небольшое число операторов, которые обрабатывают большой объем данных. Выполнение тех же задач с использованием отдельных переменных может потребовать написания сотен операторов.

Размерность массива

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

Одномерные массивы

Пример одномерного массива приведен в таблице № 9.9.

Таблица № 9.9

В программировании обычно используется нумерация с нулевой базой.

Для доступа к данным, хранящимся в определенном элементе массива, следует указывать имя массива с последующим числом, называемым индексом элемента. Индекс заключают в круглые скобки. Например, если массив в таблице № 1.1 имеет имя DoubleArray, то следующий оператор присваивает число 45 переменной DoubleAny.

DoubleAny = DoubleArray (3)

В этом операторе число 3 является индексом массива. Поскольку нумерация элементов начинается с нуля, элемент, на который ссылается оператор, является, фактически, четвертым элементом массива DoubleArray.

При выполнении оператора DoubleArray, VBA выбирает значение 45 и сохраняет это значение в переменной DoubleArray.

Этот же оператор можно использовать при сохранении данных в массиве:

DoubleArray (5)=12.

При выполнении этого оператора VBA помещает значение 12 в указанных элемент массива, заменяя предыдущее содержимое этого элемента.

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

Многомерные массивы

Когда необходимо представить таблицы данных с организацией данных в формате строк и столбцов, для этого используют многомерные массивы.

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

Если в массиве число элементов не меняется, то такой массив называется статическим.

Статические и динамические массивы

Если при выполнении VBA-программы можно изменять число элементов в массиве, то такие массивы называются динамическими. Для изменения размера динамического массива используется оператор ReDim.

VBA сохраняет зарезервированной область памяти для всех элементов в массиве, пока существует переменная типа массива. Подобные массивы называются статическими (static), потому что число элементов в массиве не меняется.

Оператор Option Base

Обычно в VBA используются массивы с нулевой базой. Оператор Option Base позволяет задавать 0 или 1 как начальное число по умолчанию для индексов массива. Если оператор Option Base не используется, VBA начинает нумерацию индексов с 0 (по умолчанию). Необходимо помещать оператор Option Base в область объявлений модуля перед объявлением любых переменных, констант или процедур. Нельзя помещать оператор Option Base внутри процедуры. Можно иметь только один оператор Option Base в модуле.

Синтаксис:

Option Base 0|1

Объявление массивов

Объявление массива с помощью оператора Dim имеет следующий синтаксис.

Синтаксис:

Dim VarName ()

Dim VarName ( upper, upper]….) [ As type ],

VarName – любое имя для массива, удовлетворяющее VBA-правилам для имен идентификаторам.

Subscripts – измерение массива.

As Type – тип данных.

Lower – нижняя граница значения индекса.

Upper – верхняя граница значения индекса.

Type – тип данных

Если опустить тип, все элементы массива будут иметь тип Variant. VBA инициализирует элементы числовых массивов нулями и элементы строковых массивов пустыми строками.

Dim str_array (1 To 100) As String

Dim variant_array ()

Dim str_Multiplication (0 To 15, 0 To 15) As String

Использование массивов

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

Обращение к элементу массива имеет следующий синтаксис.

Синтаксис.

arrayName (validIndex1, ….)

validIndex – имя массива.

validIndex1 – допустимое значение индекса для первого измерения массива.

validIndex2 – допустимое значение индекса для второго измерения массива.

Необходимо предоставлять значение индекса для каждого измерения массива при каждом обращении к какому-либо элементу массива.

Ввод-вывод одномерных массивов

При вводе одномерного массива необходимо последовательно вводить 1-й, 2-й и т.д. элементы массива, аналогично поступают при выводе. Для ввода или вывода массива необходимо организовать цикл. Наиболее удобно использовать для ввода и вывода одномерного массива алгоритм с использованием безусловного цикла.

Алгоритм ввода вывода одномерного массива приведен на рис.5.29.

Расшифровка процедуры приведена ниже.

Sub Massiv () – название процедуры.

Dim Mas (5) As Integer - объявили одномерный массив с 5-ю элементами, тип чисел – целые.

Dim s As String – объявили рабочую переменную для завершающего вывода данных из массива в диалогом окне. As String – тип данных в переменной для хранения.

For i = 1 To 5 – процедура в первом цикле For….Next, принимает целые числа от 1 до 5 и заносит их в массив.

Mas (i) = InputBox (i) – ввод целого числа для i-го элемента.

Next – переход ко второму циклу (элементы массива заносятся в строку и выводятся на экран в диалоговом окне с помощью оператора MsgBox).

For i = 1 To 5 – элементы в строке с 1 по 5.

s = s & Mas(i) & “ ;” - формирование строки из элементов массива. Массив выводится в одну строку. Элементы массива разделяются символом “ ;”.

MsgBox s – вывод ранее введенного массива.

Рис.5.27. Алгоритм ввода-вывода одномерного

Рис. 9.29. Алгоритм и процедура ввода-вывода одномерного массива

Ввод-вывод двухмерного массива

Алгоритм и процедура ввода и вывода двухмерного массива представлен на рис.5.30.

Описание данной процедуры:

Sub Massiv () – название процедуры

Объявление переменных, которые используются в данной процедуре:

Dim Mas (5, 5) As Integer - объявили двухмерный массив с 5 столбцами и пятью строками, тип чисел – целые.

Dim s As String – объявили рабочую переменную для завершающего вывода данных из массива в диалогом окне. As String – тип данных в переменной для хранения

Next i – окончание операции присвоения переменных

Ввод элементов массива в память компьютера:

For i = 1 To 5 – ввод осуществляется с первого элемента первой строки, потом со второго и т.д.

For j = 1 To 5 до конца первой строки, потом с первого элемента второй строки и т.д.

Mas(i,j) = InputBox(i,j) – оператор ввода элементов массива в память ЭВМ

Рис. 9.30. Алгоритм и процедура ввода-вывода двухмерного массива

Алгоритмы упорядочения массива

В качестве примера приведем алгоритм и процедуру сортировки одномерного массива методом «пузырька»

Вывод элементов введенного массива из памяти ЭВМ:

For i = 1 To 5 – вывод осуществляется аналогично вводу

s = s & Mas (i,j) & “ ; ”

s = s & Chr (13) – перевод строки (вывод не одной строкой, а несколькими, как в введенном массиве)

Next i – окончание действия оператора For….Next

MsgBox s – вывод ранее введенного массива на диалоговое окно

End Sub – окончание процедуры.

Циклы позволяют выполнить одну или несколько строк кода несколько раз. VBA поддерживает следующие циклы:

For...Next For Each...Next Do... Loop

Конструкция For . . . Next. Когда число повторений известно заранее, используют цикл For . . . Next. В цикле For используется переменная, называемая переменной цикла или счетчиком цикла, которая увеличивается или уменьшается на заданную величину при каждом повторении цикла. Синтаксис этой конструкции следующий:

For counter = start To end операторы Next

Параметры 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

Цикл выполняется по крайней мере один раз:

операторы

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 [блок операторов] [блок операторов] Next Do [(While | Until} условие] [блок операторов] [блок операторов] Loop

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

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

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

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

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

При преждевременном завершении цикла переменная цикла сохраняет свое значение, которое она получила с учетом обычных правил

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

Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each .

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

For i = 1 To 10 Total = Total + iArray(i) Next i

В этом простом цикле For … Next используется переменная i , которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total .

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1 . Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step , как показано в следующем простом примере.

For d = 0 To 10 Step 0.1 dTotal = dTotal + d Next d

Так как в приведённом выше примере задан шаг приращения равный 0.1 , то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

For i = 10 To 1 Step -1 iArray(i) = i Next i

Здесь шаг приращения равен -1 , поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next , но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Dim wSheet As Worksheet For Each wSheet in Worksheets MsgBox "Найден лист: " & wSheet.Name Next wSheet

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal . Если совпадение найдено, то цикл прерывается:

For i = 1 To 100 If dValues(i) = dVal Then IndexVal = i Exit For End If Next i

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub , в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

"Процедура Sub выводит числа Фибоначчи, не превышающие 1000 Sub Fibonacci() Dim i As Integer "счётчик для обозначения позиции элемента в последовательности Dim iFib As Integer "хранит текущее значение последовательности Dim iFib_Next As Integer "хранит следующее значение последовательности Dim iStep As Integer "хранит размер следующего приращения "инициализируем переменные i и iFib_Next i = 1 iFib_Next = 0 "цикл Do While будет выполняться до тех пор, пока значение "текущего числа Фибоначчи не превысит 1000 Do While iFib_Next < 1000 If i = 1 Then "особый случай для первого элемента последовательности iStep = 1 iFib = 0 Else "сохраняем размер следующего приращения перед тем, как перезаписать "текущее значение последовательности iStep = iFib iFib = iFib_Next End If "выводим текущее число Фибоначчи в столбце A активного рабочего листа "в строке с индексом i Cells(i, 1).Value = iFib "вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do ... Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While : блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True ). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

IRow = 1 Do Until IsEmpty(Cells(iRow, 1)) "Значение текущей ячейки сохраняется в массиве dCellValues dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until , следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

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

Do ... Loop Until IsEmpty(Cells(iRow, 1))

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

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

В языке Visual Basic существует три основных вида циклов, которые реализуется при помощи конструкций For:Next, Do:Loop и While:Wend.

Цикл For:Next. Используется в том случае, когда количество повторов заданного блока операторов известно заранее. Данная конструкция выглядит следующим образом:

For счетчик = начальное значение To конечное значение Операторы1 Операторы2 Next [счетчик]

Когда приведенные операторы выполняются первый раз, то переменной счетчику присваивается начальное значение, после чего возможны два варианта действий. Если в результате проверки условия счетчик > конечное значение было получено значение True, то происходит завершение цикла, при этом блоки операторы1 и операторы2 ни разу не выполняются. С другой стороны, если результатом проверки условия является False, то в этом случае блоки операторов выполняются первый раз, после чего происходит переход на начало цикла. Далее значение переменной-счетчика увеличивается на шаг, расположенный после ключевого слова Step (в случае его отсутствия устанавливается шаг = 1). После этого снова проверяется истинность условия счетчик > конечное значение и т.д., окончание цикла происходит в тот момент, когда результатом данной проверки станет значение True.

Зачастую бывает необходимо "аварийно" завершать работу цикла при выполнении какого-либо дополнительного условия. В этом случае внутри цикла следует использовать служебное словосочетание Exit:For, которое обычно располагают в управляющей конструкции, например:

If условие Then Exit For

Если результатом проверки условия будет значение True, то выполнение цикла будет прекращено, причем блок операторы1 будет выполнен очередной раз, а блок операоры2 - нет.

Цикл Do:Loop. Применяется в том случае, когда число повторений операторов тела цикла заранее неизвестно. Существуют четыре разновидности данной конструкции. При использовании первых двух цикл либо выполнится много раз, либо не выполнится вообще.

Do Until условие Операторы Loop

Если результатом проверки условия является значение False, то блок операторы выполняется, иначе осуществляется переход на оператор, расположенный после служебного слова Loop. С другой стороны, если первая проверка условия даст результат True, то цикл не выполнится ни разу.

Do While условие Операторы Loop

Если условие истинно, то происходит выполнение блока операторы, если же ложно, то есть результатом проверки является False, то цикл не выполниться ни разу.

В случае использования последних двух конструкций цикл будет выполнен хотя бы один раз.

Do Операторы Loop Until условие

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

Do Операторы Loop While условие

В случае ложности условия выполняется блок операторы, если же оно истинно, т.е. результатом проверки является значение True, то происходит окончание чикла.

Цикл While:Wend. Также используется в том случае, когда число повторений операторов тела цикла заранее неизвестно, и имеет следующий синтаксис:

While условие Операторы Wend

Если результатом проверки условия является значение True, то блок операторы выполняется, иначе осуществляется переход на оператор, расположенный после служебного слова Wend. С другой стороны, если первая проверка условия даст результат False, то цикл не выполнится ни разу.

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

Оператор цикла со счетчиком (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 представляют собой группу управляющих инструкций, которые изменяют порядок выполнения команд. Управляющие инструкции могут быть вложены друг в друга в любой последовательности.