Loop Until [условие]
Вложенные циклы VBA
Можно помещать структуры управления внутрь других структур управления (например, блок 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 для выхода из цикла значения переменной цикла зависят от того, каким образом завершается выполнение цикла:
1) при нормальном завершении цикла значение переменной цикла имеет на единицу больше верхней границы числа циклов;
|
|
2) при преждевременном завершении цикла переменная цикла сохраняет свое значение, которое она получила с учетом обычных правил;
3) при завершении цикла по концу набора переменная цикла имеет значение Nothing (Ничего), если она является переменной типа object (Объект), или значение Empty (Пусто), если она является переменной типа Variant.
2.4. Оператор цикла с предусловием While…Do
Применяется для организации циклов с неизвестным заранее числом повторений, логика которых предполагает выполнение цикла пока истинно некоторое условие.
Синтаксис оператора WHILE: