Управляющие
конструкции VBA
Управляющими
конструкциями языка программирования называются инструкции и группы
инструкций, применение которых позволяет изменять по мере необходимости
последовательность выполнения остальных инструкций программы. В современных
языках программирования управляющие конструкции подразделяются на ветвления и
циклы. Ветвлением называется управляющая конструкция, позволяющая
пропускать при выполнении те или иные группы инструкций в зависимости от
значения условия. Циклом называется управляющая конструкция, позволяющая
многократно повторять выполнение группы инструкций до наступления какого-либо
события.
Ветвления
Ветвления
работают по общему принципу: вначале проверяется заданное условие, затем, в
зависимости от результатов проверки, выполняется та или иная группа инструкций,
входящая в конструкцию ветвления. Конструкции ветвления включают в себя три
варианта инструкции условного перехода If и инструкцию выбора Select Case.
Конкретный
вариант управляющей конструкции с инструкцией If выбирается в зависимости от программного контекста. Если в
зависимости от результата проверки сравнительно простого условия следует
выполнить или пропустить простую инструкцию, удобнее оказывается однострочный
сокращенный вариант, синтаксис и пример которого приведен в листинге 14.6.
Оператор if.. .Then.. .Else — стандартный оператор ветвления. Его использование
позволяет проверить некоторое условие и, в зависимости от его истинности,
выполнить ту или иную группу операторов.
Для данного
оператора есть два варианта синтаксиса — в одну строку, и в несколько:
If условие Then [блокОператоров1] [Else блокОператоров2]
ИЛИ
If условие1 Then
[блокОператоров
1]
[Elself условиеN Then
[блокОператоровN]] ...
[Else
[блокОператоров_Е1зе]]
End If
Листинг
14.6. Однострочный сокращенный вариант инструкции If
If <условие> Then
<инструкция>
If пол = "ж" Then пенс_возраст = 55
ПРИМЕЧАНИЕ
Обратите внимание на то, что знаки равенства в записи
условия и в инструкции, входящих в состав однострочной конструкции ветвления,
обозначают различные операции. В условии это — операция сравнения,
вырабатывающая значение ИСТИНА при равенстве значений выражений, стоящих
справа и слева от знака равенства. В инструкции это — операция присваивания
значения выражения, расположенного справа от знака равенства, переменной (или
свойству), имя которой (которого) расположено слева от этого знака.
Условия,
применяющиеся в любой форме конструкций ветвления, представляют собой
выражения, вычисление которых дает логическое значение. В сокращенном
однострочном варианте инструкции If входящая в ее
состав инструкция выполняется только тогда, когда это логическое выражение при
вычислении дает значение ИСТИНА. Если при соблюдении условия требуется
выполнить не одну, а несколько инструкций, удобнее оказывается сокращенный
многострочный вариант инструкции If, синтаксис и
пример которого приведен в листинге 14.7.
Листинг
14.7. Многострочный сокращенный вариант инструкции If
If <условие> Then
<инструкция 1>
<инструкция 2>
. . .
<инструкция N>
End If
If пол = "ж" Then
пенс_возраст = 55
поздравление_8_марта=True
End If
В таком варианте
конструкции ветвления при соблюдении условия выполняются все инструкции,
записанные между ключевыми словами Then и End If. Полный вариант инструкции If удобен в том случае, когда при соблюдении условия необходимо
выполнить одну группу инструкций, а при несоблюдении — другую. Синтаксис и
пример этого варианта приведены в листинге 14.8.
Листинг 14.8. Полный вариант
инструкции If
If <условие> Then
<инструкция
1>
. . .
<Инструкция N>
Else
<Инструкция 1>
. . .
<Инструкция N>
If пол =
"ж" Then
пенс_возраст
= 55
поздравление_8__марта = True
Else
пенс_возраст
= 60
поздравление_8_марта = False
End If
Функция iif
В случае с
простым ветвлением бывает удобно использование функции iif, которая имеет следующий формат:
Iif (выражение, значениеЕслиДа, значениеЕслиНет)
Эта функция
проверяет значение выражения выражение, если оно истинно, то функция
возвращает значение значениеЕслиДа, в противном случае — зна
чениеЕслиНе т.
Функция iif является встроенной функцией, и как всякая функция
используется в выражении. Таким образом, функцию iif удобно использовать, когда ветвление требуется в программе не
для того, чтобы выбрать ту или иную альтернативную последовательность
действий, а для того, чтобы присвоить то или иное альтернативное значение.
Например,
оператор
D2 = IIf(i <= 10,
250, 50)
можно было бы
записать так:
If i <=
10 Then
D2
= 250 Else
D2
= 50 End If
Согласитесь, что
первый способ короче, нагляднее и надежнее.
Оператор Select Case
Вышерассмотренные
цепочки операторов if.. .Then. . .Eiseif обладают
большой гибкостью и позволяют решить все проблемы, однако, если выбор одной из
нескольких возможностей все время основан на различных значениях одного и того
же выражения, гораздо удобнее использовать предназначенный для этого оператор
выбора select Case, имеющий следующий синтаксис:
Select Case <выражение>
Case <список значений 1>
<группа инструкций 1>
Case <список значений 2>
<группа
инструкций 2>
..
.
Case <список
значений N>
<группа инструкций N>
Case Else
<группа инструкций N+1>
End Select
Select Case набрано_баллов
Case 0, 1, 2
Оценка = "неудовлетворительно" Case 3 To 5
Оценка
= "удовлетворительно"
Case Is > 8
Оценка = "отлично"
Case Else
Оценка = "хорошо"
End Select
Проверяемое выражение
вычисляется в начале работы оператора select case. Это выражение
может возвращать значение любого типа — например, логическое, числовое или
строковое. При выполнении оператора Select Case значение проверяемого выражения вычисляется один раз и
запоминается.
Далее идет
список альтернатив, начинающихся ключевым словом Casе. В каждой альтернативе указан список значений, представляющий
собой несколько возможных значений, разделенных запятой. При выполнении оператора
select Case значение сравнивается со списками значений альтернатив.
Элементы списка значений могут иметь одну из следующих форм:
О Значение
в этом случае
проверяется, совпадает ли значение проверяемого выражения с указанным
значением;
О Значение1
То Значение2
в этом случае
проверяется, находится ли значение проверяемого выражения в диапазоне
указанных значений;
О Is логическаяОперация значение
в этом случае
проверяется, удовлетворяет ли значение проверяемого выражения указанному
логическому условию.
Вся конструкция
работает следующим образом. Если хотя бы один из элементов списка значений
соответствует проверяемому выражению, то выполняется соответствующий блок
операторов, и на этом выполнение оператора Select Case заканчивается.
Если же ни один из элементов всех списков альтернатив не соответствует значению
проверяемого выражения, выполняется блокОператоров_Е1зе (если, конечно,
присутствует ключевое слово case
Else).
В следующем
примере при помощи функции inputBox переменной t присваивается некое значение, после чего посредством
оператора select case проверяется положительность значения переменной. Заметьте,
что предусмотрен вариант, когда пользователь введет не число.
Листинг
3-14; Использование оператора Select
Sub branchLine ()
Dim t As
Integer
t = InputBox
("Введите число")
Select Case t
Case 0
Msgbox ("Введен О")
Case 1 То 100
MsgBox("Введено положительное число")
Case -100 То -1
MsgBox("Введено отрицательное число")
Case Is < -100, Is > 100
MsgBox("Число слишком большое, не понять")
Case Else
MsgBox("Введено не число")
End Select
End Sub
Подобная
конструкция, как упоминалось, возможна и для строковых значений, в таком
случае используется лексикографическое упорядочивание.
Оператор
GoTo
Помимо условных
операторов, в VBA существует оператор безусловного
перехода, который также меняет порядок выполнения операторов в программе
(безусловно).
GoTo имяМетки
После ключевого
слова идет имя метки. Метка — это идентификатор, приписанный оператору
программы и используемый в других частях программы для обращения к этому
оператору. Метка может быть определена как до, так и после ключевого оператора goto, причем она должна отделяться от помеченного ею оператора
двоеточием. Нижеприведенный пример, вообще говоря, будет выполняться
бесконечно. Мы специально приводим семантически неверную программу, чтобы
подчеркнуть, как легко можно ошибиться при использовании оператора goto.
Sub branchLabel ()
label1 : MsgBox
("Использование метки")
GoTo labell
End Sub
(~~ Совет )
Применение
оператора безусловного перехода является нежелательным, поскольку присутствие
этого оператора в программе нарушает ее структурную целостность и наглядность.
Такую программу трудно читать, отлаживать и модифицировать.