При выполнении данного оператора сначала вычисляется контролируемое выражение, а затем производится его сравнение с выражениями, заданными в списках вариантов Case, и, если в каком-либо списке находится соответствующее значение, выполняется код, записанный в этом варианте Case. Если соответствия нет (значение контрольного выражения не совпадает ни с одним из указанных в списках значений), выполняется код в части Case Else. Если часть Case Else не задана, весь код оператора Select Case будет пропущен.
Структура повторения (цикл) повторяет заданные в нем строки кода, пока не получит команду выхода из цикла. Если такая команда в цикле не предусмотрена, цикл будет повторяться бесконечно. В VBA существует несколько видов циклов: циклы, выполняющиеся заданное количество раз, и циклы, повторяющиеся при выполнении или невыполнении заданных условий.
Оператор For … Next применяется, когда код должен повторяться заданное количество раз. Эта структура управления имеет два варианта: цикл с параметром-счетчиком и цикл с параметром, принимающим все значения из заданной группы.
Цикл с параметром-счетчиком записывается по правилу:
For СчетчикЦикла = НачальноеЗначение _
To КонечноеЗначение Step Шаг
Код
Next СчетчикЦикла
Счетчик цикла управляет количеством повторений. Это целочисленная скалярная переменная. В начале выполнения цикла ей присваивается указанное начальное значение. Шаг задает разницу между двумя соседними значениями, которые принимает счетчик цикла: очередное значение счетчика цикла вычисляется как сумма текущего значения и заданного шага. Если значение шага не задано, по умолчанию шаг равен единице. Счетчик меняется, пока не достигнет конечного значения.
Код, включенный в цикл, повторяется для всех значений, принимаемых счетчиком. Указанные начальное и конечное значения и шаг задают условие повторения выполнения кода в цикле.
Шаг может быть как положительным, так и отрицательным. Его значение следующим образом определяет выполнение цикла: если значение положительно или 0, то цикл повторяется, пока значение счетчика цикла меньше или равно конечного значения; если шаг отрицательный, то выполнение кода в цикле будет повторяться, пока значение счетчика цикла больше или равно заданного конечного значения.
Значение шага добавляется к значению переменной-счетчика после выполнения всех инструкций цикла. После этого инструкции цикла либо выполняются еще раз для нового значения счетчика (на основе приведенных выше условий), либо цикл завершается и выполнение продолжается с инструкции, следующей за инструкцией Next.
Изменение значения переменной-счетчика внутри цикла усложняет чтение и отладку программы.
Альтернативный способ выхода из цикла предоставляет инструкция Exit For. Эта инструкция передает управление инструкции, непосредственно следующей за инструкцией Next. Данная команда обычно используется в сочетании с оператором ветвления, в котором проверяется дополнительное условие выхода из цикла.
Допускается организация вложенных циклов For...Next (один цикл For...Next располагается внутри другого). Счетчик каждого цикла должен иметь уникальное имя.
Инструкция For Each...Next повторяет набор инструкций для всех объектов семейства или для всех элементов массива. Visual Basic автоматически определяет значения переменной, выбирая их последовательно из семейства или массива при каждом повторении цикла. Цикл повторяется, пока есть возможность выбора очередного значения для переменной-параметра из группы. Такой цикл записывается по следующему правилу:
For Each ПараметрЦикла In Группа
Код
Next СчетчикЦикла
где группа – семейство объектов или массив.
Например, в следующем операторе закрываются все формы, за исключением формы, содержащей текущую процедуру:
For Each frm In Application.Forms
If frm.Caption <> Screen.ActiveForm.Caption Then frm.Close
Next
В следующем примере выполняется цикл для всех элементов описанного в программе массива, их значения присваиваются индексной переменной I и суммируются в переменной S:
For Each I In TestArray
S = S + I
Next I
Ниже приведен пример цикла по диапазону ячеек A1:D10 на текущем рабочем листе. Любому числу, записанному в ячейке, имеющему абсолютное значение меньше 0.01, присваивается значение 0 (ноль):
For Each myObject In Range(“A1:D10”)
If Abs(myObject.Value) < 0.01 Then myObject.Value = 0
Next
Допускается выход из цикла For Each...Next с помощью инструкции Exit For.
Оператор цикла For дает возможность повторений действий заданное количество раз или для заданного числа элементов, но в VBA существуют более мощные структуры повторения, позволяющие повторять цикл в зависимости от выполнения определенных разработчиком условий. Одним из таких операторов является оператор цикла «с предусловием» (условие, определяющее необходимость повторения цикла, записывается и проверяется до кода действий, подлежащих повторению) оператор While … WEnd.
Правило записи этого оператора имеет вид:
While Условие
Код
Wend
Этот оператор выполняет последовательность инструкций (код), пока заданное условие имеет значение True. Если условие имеет значение True, выполняются все инструкции до инструкции Wend. Затем управление возвращается инструкции While и вновь проверяется условие. Если условие по-прежнему имеет значение True, процесс повторяется. Если условие получает значение False, выполнение возобновляется с инструкции, следующей за инструкцией Wend. Таким образом, чтобы цикл завершил работу необходимо включить в записанный в нем код операторы, влияющие на выполнение условия, управляющего циклом.
Циклы While...Wend могут иметь любую глубину вложенности. Каждая инструкция Wend соответствует предшествующей инструкции While.
Еще более мощные возможности по организации циклов обеспечивает инструкция Do...Loop, имеющая несколько вариантов. Этот оператор дает возможность организации цикла как «с предусловием», так и «с постусловием», действия могут повторяться как при выполнении условия, так и при его невыполнении.
Правило записи цикла Do…Loop «с предусловием» имеет вид:
Do { While | Until } Условие
Код
Loop
Этот цикл повторяет выполнение набора инструкций (кода), пока условие имеет значение True (если в заголовке цикла указано ключевое слово While – «пока») или пока оно не примет значение True (если в заголовке цикла записано ключевое слово Until – «пока не»).
Код, записанный в цикле «с предусловием», может выполняться бесконечное число раз или не выполняться ни разу. Если же использовать цикл «с постусловием», в котором сначала записываются операторы, подлежащие повторению в цикле, а потом управляющее повторениями условие, то содержащийся в цикле код должен будет выполняться хотя бы один раз. Для организации цикла «с постусловием» используется следующее правило:
Do
Код
Loop { While | Until } Условие
В любом месте управляющей структуры Do…Loop может быть размещено любое число инструкций Exit Do, обеспечивающих альтернативные возможности выхода из цикла Do…Loop. Часто используемая вместе с определением некоторого условия (например, If…Then), инструкция Exit Do передает управление инструкции, непосредственно следующей за инструкцией Loop.
Во вложенных циклах Do…Loop инструкция Exit Do передает управление циклу охватывающего уровня по отношению к циклу, в котором она вызывается.
При организации цикла с проверкой условия после выполнения кода этот код проработает по крайней мере один раз. Это удобно для организации ввода информации, если требуется проверить правильность ввода:
Do
S = InputBox (prompt := "Введите возраст ребенка:" _
& Chr(13) & Chr(10) & "(до 16 лет)", _
Title := "Определение возраста")
Loop Until (Val(S) > 0) And (Val(S) <= 16)
В приведенном примере ответ будет принят, если пользователь введет значение, удовлетворяющее заданному условию (возраст ребенка не может быть отрицательным, да и человек старше 16 – уже не ребенок). Если же пользователь введет «неправильное» значение, ввод будет повторен.
Еще один оператор очень часто используется в программах на VBA – инструкция With. Этот оператор позволяет использовать более короткие ссылки на объекты, сокращает объем вводимого кода. Более подробную информацию о нем можно получить в справочной системе.