Файл: Циклы позволяют выполнить одну или несколько строк кода несколько раз. Vba поддерживает следующие циклы.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.11.2023
Просмотров: 49
Скачиваний: 2
, вместо повторения операторов заданное число раз. Он особенно полезен, когда неизвестно, сколько элементов содержится в наборе.
Синтаксис конструкции цикла 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 / is = s + mCall out("a" & (2 + i), i) : Call out("b" & (2 + i), Abs(m)) : Call out("c" & (2 + i), s)i = i + 1LoopEnd SubДругая разновидность конструкции Do . . . Loop сначала выполняет операторы тела цикла, а затем проверяет условие после каждого выполнения. Эта разновидность гарантирует, что операторы тела цикла выполнятся по крайней мере один раз:Doоператоры Loop While условиеДве другие разновидности конструкции цикла аналогичны предыдущим, за исключением того, что цикл выполняется, пока условие ложно (False):- Цикл не выполняется вообще или выполняется много раз:Do Until условиеоператоры Loop- Цикл выполняется по крайней мере один раз:DoоператорыLoop Until условиеВложенные циклыМожно помещать структуры управления внутрь других структур управления (например, блок If . . . Then внутрь цикла For . . . Next). Говорят, что структура управления, помещенная внутрь другой структуры управления, является вложенной.Глубина вложения управляющих структур в VBA не ограничена. Для улучшения читаемости кода принята практика смещения тела конструкции принятия решения или цикла в программе в случае использования вложенных структур управления.При вложении в цикл одного или несколько других циклов говорят о вложенных циклах, в которых различают внешние (охватывающие) и внутренние (вложенные) циклы.Рассмотрим пример суммирования элементов Aij матрицы A(n,m) построчно.Sub пример5()Dim a() As Single, s() As Single Dim n As Integer, m As IntegerDim i As Integer, j As IntegerCall read("a1", n): Call read("b1", m)ReDim a(1 To n, 1 To m), s(1 To n)'Чтение матрицыFor i = 1 To nFor j = 1 To mCall readcell(i + 1, j, a(i, j))Next jNext i'ВычислениеFor i = 1 To ns(i) = 0For j = 1 To ms(i) = s(i) + a(i, j)Next jCall outcell(i + 1, m + 1, s(i))Next iEnd 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).ValueEnd SubSub outcell(i As Integer, j As Integer, val As Variant)Лист1.Cells(i, j).Value = valEnd 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][блок операторов] LoopExit For внутри цикла For и Exit Do внутри цикла Do могут появиться сколько угодно раз.Оператор Exit Do работает со всеми разновидностями синтаксиса цикла Do.Операторы Exit For и Exit Do применяются, если необходимо завершить цикл немедленно, не продолжая дальнейших итераций или не ожидая выполнения блока операторов в теле цикла.При использовании оператора Exit для выхода из цикла значения переменной цикла зависят от того, каким образом завершается выполнение цикла:- При нормальном завершении цикла значение переменной цикла имеет на единицу больше верхней границы числа циклов- При преждевременном завершении цикла переменная цикла сохраняет свое значение, которое она получила с учетом обычных правил- При завершении цикла по концу набора переменная цикла имеет значение Nothing (Ничего), если она является переменной типа object (Объект), или значение Empty (Пусто), если она является переменной типа Variant