Операторы
Управляющие операторы
Набор управляющих операторов VBA делает честь любому хорошо структурированному языку программирования. Циклы с возможной проверкой условия в начале, в конце и в середине работы оператора, обычный оператор If и оператор разбора случаев Case - все эти средства позволяют организовать процесс вычислений надежно и эффективно в соответствии с лучшими традициями программирования.
Условный оператор If Then Else End If
Это общепринятый в языках программирования оператор управления вычислениями позволяет выбирать и выполнять действия в зависимости от истинности некоторого условия.
Синтаксис.
Имеется два варианта синтаксиса: в одну строку и в форме блока. В первом случае он имеет вид:
If условие Then [операторы1] [Else операторы2 ]
Во втором случае оператор расположен на нескольких строках:
If условие Then [операторы] [ElseIf условие-n Then [операторы-n]... [Else [ИначеОператоры]] End If
Здесь условие обязательно в обоих вариантах. Оно может быть числовым или строковым выражением со значениями True или False ( Null трактуется как False ). В качестве условия можно использовать и выражение вида TypeOf ИмяОбъекта Is ТипОбъекта, где ИмяОбъекта - ссылка на объект, а ТипОбъекта - произвольный корректный тип объекта. Операторы1 и операторы2 - это последовательности из одного или нескольких разделенных двоеточием операторов. По крайней мере, одна из этих последовательностей должна быть непустой. Если условие истинно ( True ), выполняется последовательность операторы1, ложно ( False ) - операторы2. Форма условного оператора определяется по наличию в строке, начинающейся If условие Then, текста после Then, отличного от комментария. Если такой текст есть, считается, что использована форма в одну строку, нет - оператор должен иметь форму блока. В этом случае подблоки вида:
[ElseIf условие-n Then [операторы-n]
могут отсутствовать либо повторяться несколько раз; подблок:
[Else [ИначеОператоры]]
также необязателен, а закрывающий оператор End If необходим. По крайней мере одна из последовательностей операторы, операторы-n … или ИначеОператоры должна быть непустой. Если условие истинно, выполняются операторы, нет - отыскивается первое истинное условие-n, и выполняются операторы-n. Если все эти условия ложны, выполняются ИначеОператоры. После выполнения одной (возможно, пустой) последовательности операторов управление передается оператору, следующему за End If.
Примеры:
Public Sub MinMax1(ByVal X As Integer, ByVal Y As Integer, _ Min As Integer, Max As Integer) 'Оператор If в одну строку If X > Y Then Max = X: Min = Y Else Max = Y: Min = X End Sub Public Sub MinMax2(ByVal X As Integer, ByVal Y As Integer, _ Min As Integer, Max As Integer) 'Оператор If в виде блока If X > Y Then Max = X Min = Y Else Max = Y Min = X End If End Sub Public Sub If1() Dim Max As Integer, Min As Integer Call MinMax1(2 + 3, 2 * 3, Min, Max) Debug.Print Max, Min Call MinMax2(2 + 3, 2 * 3, Min, Max) Debug.Print Max, Min End Sub7.2.
По-видимому, можно было бы классифицировать программистов в зависимости от того, какая из форм записи процедуры MinMax кажется им предпочтительнее при записи и при чтении. Приведем еще один пример, где идет работа с объектами. Вначале добавим еще один класс объектов:
'Класс Man 'Свойства Public Age As Byte Public Name As String 'Другие свойства и методы пока не определены
А теперь приведем процедуру, в которой будем работать с объектами класса Child и Man. Заметьте, в условии оператора IF проверяется тип объекта:
Public Sub BoyOrMan() Dim Boy As New Child Dim Person As New Man Dim SomeBody As Object Dim Answer As Integer Boy.Age = 10: Boy.Name = "Александр" Person.Age = 21: Person.Name = "Александр" Answer = InputBox("Введите число от 10 до 20", "Возраст", 15) If Answer > 15 Then Set SomeBody = Person Else: Set SomeBody = Boy End If If TypeOf SomeBody Is Child Then Debug.Print "Это мальчик!" ElseIf TypeOf SomeBody Is Man Then Debug.Print "Это Мужчина" Else Debug.Print "Не знаю, кто это" End If End Sub7.3.
Результат ее работы зависит от того, какой возраст Вы введете в окне ввода.
Оператор выбора Select Case
Этот оператор производит разбор случаев и в зависимости от значения анализируемого выражения выбирает и исполняет одну из последовательностей операторов.
Синтаксис.
Select Case Выражение-тест [Case СписокВыражений-n [операторы-n]] [Case Else [ИначеОператоры]] End Select
Выражение-тест должно присутствовать обязательно. Оно может быть произвольным выражением с числовым или строковым значением. СписокВыражений-n должен присутствовать в строке, начинающейся ключевым словом Case (Случай). Выражения в этом списке отделяются запятыми и могут иметь одну из форм:
- выражение,
- выражение-нижняя-граница To выражение-верхняя-граница,
- Is оператор-сравнения выражение.
Первая форма задает отдельные значения, вторая и третья позволяют задавать сразу целые диапазоны (области) значений. Последовательность операторов операторы-n необязательна. Она будет исполнена, если соответствующий СписокВыражений-n является первым списком, сопоставимым с текущим значением Выражения-теста (т. е. он явно содержит это значение, либо оно попадает в один из заданных в списке диапазонов). После исполнения операторов последовательности операторы-n проверка на соответствие другим спискам выражений не производится, и управление передается на оператор, следующий за End Select. Необязательная последовательность ЕслиОператоры выполняется, если ни один из списков выражений несопоставим со значением Выражения-теста.
Пример:
Public Sub Case1() Dim Before As Integer Dim CurrentYear As Integer, Str As String ' Инициализация переменных: CurrentYear = 1999 Before = InputBox("Сколько лет тому назад?", "Когда", 10) Select Case CurrentYear - Before Case 1954 To 1969, 1971 To 1974, 1982, Is < 1970 Str = " Годы учебы" Case 1972 To 1989 Str = "Годы воспитания" Case Else Str = "Прочие годы" End Select Debug.Print Str End Sub
Здесь, если перед выполнением выбора Before = 20, значением тестового выражения будет 1979, и будет работать второй вариант (" Годы воспитания "). При Before = 25 значение 1974 сопоставимо с двумя списками, но для исполнения будет выбран лишь первый вариант (" Годы учебы ").
Диапазоны значений можно задавать и для строк. При этом их значения считаются упорядоченными лексикографически. Например, возможен такой список выражений:
Case "everything", "nuts" To "soup"
Задаваемое им множество строк включает строку " everything " и все строки от " nuts " до " soup " (например, " onion ").