Операторы условного перехода — одни из самых важных и часто используемых элементов в языках программирования. Общий принцип их работы прост: проверяется соответствие каким-то условиям (истинность или ложность каких-либо выражений) и в зависимости от этого выполнение программы направляется по одной или другой ветви. В VBA предусмотрено два оператора условного перехода: If.. .Then и Select Case.
3.5.1. Оператор If... Then
Оператор if.. .Then— самый популярный у программистов. Полный его синтаксис выглядит так (необязательные части заключены в квадратные скобки):
If Условие Then
Команды1
[Elself УсловиеN Then
КомандыN
[Else
Команды2]
End If
При этом:
□ Условие— выражение, которое проверяется на истинность. Если оно истинно, то выполняются Команды1, если ложно — Команды2,
□ УсловияN— дополнительные условия, которые также можно проверить. В случае, если они выполняются (выражение УсловияN истинно), то выполняются команды. Дополнительные условия (вместе с конструкцией Elseif) можно повторять неограниченное количество раз, но если вам нужно реализовать проверку на соответствие большому количеству условий, то правильнее будет использовать конструкцию select Case (см. разд. 3.5.2).
Оператор if.. .Then применяется:
□ когда нужно проверить на одно условие и в случае соответствия сделать какое-то действие:
If nTemperature < 10 Then
MsgBox "Надеть куртку"
End If
□ когда нужно сделать то же, что и в предыдущем примере, а в случае несоответствия выполнить другое действие:
If nTemperature < 10 Then
MsgBox "Надеть куртку"
Else
MsgBox "Надеть ветровку"
End If
□ когда нужно проверить на соответствие несколько условий (обратите внимание на использование логических операторов):
If (nTemperature < 10) And (bRain = True) Then
MsgBox "Надеть куртку и взять зонтик"
End If
□ в случае, когда проверка первого условия вернула False, нужно проверить на соответствие еще несколько условий (удобно использовать EiseIf):
If (bIGoInCar = True) Then
MsgBox "Одеться для машины"
Elself nTemperature < 10 Then
MsgBox "Надеть куртку"
Else
MsgBox "Можно идти в рубашке"
End If
В этом примере, поскольку biGoinCar-— переменная типа Boolean и сама по себе принимает значения True или False, первая строка может выглядеть так:
If biGoinCar Then . . .
Приведу некоторые замечания по использованию if.. .Then:
□ ключевое слово Then должно находиться в одной строке с if и условием. Если вы перенесете его на следующую строку, будет выдано сообщение об ошибке;
□ если разместить команду, которую нужно выполнить при истинности проверяемого условия, на одной строке с if и Then, то EndIf можно не писать:
If nTemperature < 10 Then MsgBox "Надеть куртку"
Если же вы используете несколько команд или конструкции Else/ElseIf, то End If в конце нужно писать обязательно, иначе возникнет синтаксическая ошибка;
□ для выражения if...Then настоятельно рекомендуется использовать отступы для выделения блоков команд. Иначе читать код будет трудно;
□ операторы if...Then можно вкладывать друг в друга:
If MyVar = 5 Then
MsgBox "MyVar =5"
If MyVar =10 Then
MsgBox "MyVar =10"
End If
End If
3.5.2. Оператор Select Case
Оператор Select Case идеально подходит для проверки одного и того же значения, которое нужно много раз сравнить с разными выражениями. Синтаксис его очень прост:
Select Case Выражение
Case Условие1
Команды1
[Case УсловиеN
КомандыN]
[Case Else
Команды2]
End Select
Например:
Select Case sDayOfWeek
Case "Понедельник"
MsgBox "Салат из шпината"
Case "Вторник"
MsgBox "Салат из морской капусты"
Case Else
MsgBox "На этот день у нас ничего не предусмотрено"
End Select
Приведу некоторые замечания по поводу Select Case:
□ строка:
Case "Понедельник"
на самом деле означает:
Case sDayOfWeek = "Понедельник"
Такое равенство подразумевается по умолчанию. Но вы можете использовать и другой оператор сравнения или целый набор операторов, например:
Case 0 То 5, 15, Is > 55
Такое выражение можно перевести как "Если проверяемое выражение попало в диапазон от 0 до 5 включительно, или равно 15, или больше 55".
Слово Is при этом можно пропустить — компилятор VBA добавит это ключевое слово за вас. Несколько критериев в case перечисляются через запятые и объединяются так, как работает оператор Or, т. е. выполнение пойдет по этой ветви, если тестируемое значение будет удовлетворять хотя бы одному из критериев;
□ при использовании диапазона (о То 5) включаются и границы диапазона (в данном случае 0 и 5).
3.5.3. Оператор GoTo
Оператор GoTo— это оператор безусловного перехода, когда ход выполнения программы без проверки каких-либо условий перепрыгивает на метку в коде. Пример использования goto может выглядеть так:
GoTo EngineNotStarted
...
EngineNotStarted:
MsgBox "Едем на метро"
Здесь EngineNotStarted: — это метка, для нее используется имя (выбираемое по правилам назначения имен для переменных), которое оканчивается двоеточием. Эта метка может находиться как до, так и после оператора goto. В любом случае, при выполнении оператора GoTo ход выполнения "перепрыгнет" на указанную в GoTo метку.
Иногда использование GoTo очень удобно, например, когда нам нужно добиваться от пользователя ввода правильного значения неизвестное число раз. Однако использовать GoTo категорически не рекомендуется, потому что код становится трудночитаемым. Чаще всего GoTo можно заменить на конструкцию Do while.. .Loop (см. разд. 3.6) или на вызов функции из самой себя.