Операторы
Управляющие операторы
Набор управляющих операторов 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 Sub
7.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 ").