Инструкция If-Then-Else
Инструкция VBA If-Then-Else предоставляет возможность выбора одного из действий в зависимости от значений заданных логических выражений. Формат данной инструкции следующий:
If Выражение1 Then
[Инструкции1]
[ElseIf Выражение2 Then
[Инструкции2]]
…
[ElseIf ВыражениеN Then
[ИнструкцииN]]
[Else
[Инструкции]]
End If
Здесь Выражение1 – ВыражениеN – логические выражения. Если какое-либо из них истинно, то выполняются инструкции, находящиеся после соответствующего ключевого слова If или Elself. Если ни одно из выражений не является истинным, то выполняются инструкции, записанные после ключевого слова Else (если, конечно, это ключевое слово используется).
Рассмотрим пример использования инструкции If-Then-Else:
If intAction = 1 Then
' Выполнение сложения
res = a + b
ElseIf intAction = 2 Then
' Выполнение вычитания
res = a – b
ElseIf intAction = 3 Then
' Выполнение умножения
res = a * b
Else
' Заданное действие не поддерживается
'…
End If
В приведенном примере с помощью инструкции If-Then-Else выбирается одно из трех поддерживаемых действий для переменных а и Ь: сложение, вычитание или умножение. Действие, которое необходимо выполнять, определяется по содержимому переменной intAction. Если она имеет значение, отличное от 1, 2 и 3, то выполняются инструкции, следующие непосредственно после ключевого слова Else.
Язык программирования VBA также поддерживает упрощенный вариант инструкции If-Then-Else:
If Выражение Then [Инструкции1] [Else Инструкции2]
Здесь Выражение – это логическое выражение, при истинном значении которого выполняются инструкции после ключевого слова Then. Если Выражение не истинно, то выполняются инструкции после ключевого слова Else (если это ключевое слово используется). При использовании этой формы инструкции If-Then-Else следует учитывать, что она записывается в одну строку (или в несколько строк, но с использованием символа подчеркивания). Также необходимо учитывать, что Инструкции и Инструкции1 представляют собой либо одну инструкцию VBA, либо несколько инструкций, разделенных двоеточием.
Если ключевое слово Else используется, то элемент Инструкции1 может отсутствовать.
Ниже приведены несколько примеров использования сокращенного варианта инструкции If-Then-Else:
If a = 1 Then a = 2 Else a = 1
If a = 1 Then a = 2 Else a = 1: b = b + 1
If a = 1 And b = 0 Then Else a = 1: b = b + 1
Инструкция Select Case
Select Case позволяет, подобно инструкции If-Then-Else, делать выбор выполняемых программой действий в зависимости от значения заданного аргумента. При большом количестве альтернатив данная инструкция работает быстрее инструкции If-Then-Else, так как значение проверяемого выражения вычисляется только один раз. Формат инструкции Select Case приведен ниже:
Select Case Проверяемое_выражение
[Case Список_выражений
[Инструкции]]…
[Case Else
[Инструкции]]
End Select
Здесь Проверяемое_выражение – это любое численное или строковое выражение. Список_выражений содержит неограниченное количество выражений, диапазонов значений и условий. Для более детального пояснения ниже приведен формат элемента Список_выражений:
Выражение | Мин_значение To Макс_значение | Is Оператор Выражение _
[, Выражение | Мин_значение To Макс_значение | Is Оператор Выражение]…
Значения элементов приведенной конструкции следующие.
Выражение – это любое численное или строковое выражение (тип элемента Выражение должен соответствовать типу элемента Проверяемое_выражение).
Мин_значение То Макс_значение – используется для задания диапазона значений. Элементы Мин_значение и Макс_значение задают минимальное и максимальное значения диапазона соответственно.
• Is Оператор Выражение – используется для задания условий. Позволяет использовать в инструкции Select Case операторы сравнения. Элемент Оператор – это любой оператор сравнения VBA, кроме Is и Like. Элемент Выражение – это любое выражение, тип которого соответствует типу элемента Проверяемое_выражение.
При соответствии значения элемента Проверяемое_выражение одному из заданных выражений, при попадании значения этого элемента в один из диапазонов или при выполнении одного из заданных условий происходит выполнение инструкций, записанных после соответствующего ключевого слова Case. Если ни одна Case-конструкция не сработала, то выполняются инструкции после сочетания ключевых слов Case Else.
Допустим, что в программе необходимо проверять значение численной переменной intTestValue и выполнять одни действия, когда эта переменная имеет значение 1, 2, 3 или 5, и другие действия – в противном случае. Приведенный ниже фрагмент программы позволяет решить поставленную задачу:
Select Case intTestValue
Case 1 To 3, 5
' Действия при значении переменной intTestValue,_
равном 1, 2, 3 или 5
Case Is < 1, Is > 3
' Действия при значении переменной intTestValue _
меньше 1 или больше 3
End Select
В данном примере необходимо обратить внимание на то, что значение 5 удовлетворяет обеим Case-конструкциям. При обработке инструкции Select Case VBA просматривает конструкции с ключевым словом Case в том порядке, в котором они следуют в программе. Поэтому в приведенном примере при значении переменной intTestValue, равном 5, выполняются инструкции после первого ключевого слова Case.
Не менее просто с помощью инструкции Select Case можно обрабатывать и строковые значения. Ниже приведен пример, в котором выполняются различные действия при значениях строковой переменной strTestValue, начинающихся со строчной и прописной букв латинского алфавита:
Select Case strTestValue
Case "a" To "z"
" Действия, если строка strTestValue начинается _
со строчной буквы латинского алфавита
Case "A" To "Z"
" Действия, если строка strTestValue начинается _
с прописной буквы латинского алфавита
Case Else
" Действия, если строка не начинается с символа _
латинского алфавита
End Select
Инструкции безусловного перехода
С помощью инструкций безусловного перехода можно приступать к выполнению части заданной программы без проверки каких-либо условий. К таким инструкциям относятся GoTo и пара GoSub-Return. Однако перед их рассмотрением необходимо ознакомиться еще с одним элементом языка VBA, без которого данные инструкции использоваться не могут, – с метками.
Метки
Метка – это идентификатор VBA или целое число, которое располагается в начале строки и заканчивается двоеточием. Метки используются для указания строк, на которые можно переходить с помощью инструкций GoTo и GoSub. Примеры меток приведены ниже:
100:
DoSomeAction:
Перерасчет:
После перехода на метку выполняются все инструкции, расположенные после нее до конца процедуры, функции, следующих инструкций GoTo, GoSub или до инструкции Return (см. далее).
Инструкция GoTo
Инструкция GoTo используется для простого перехода к выполнению программы после нужной метки. Формат инструкции следующий:
GoTo Имя_метки
Инструкции, расположенные после GoTo, выполняются только в том случае, если в программе существуют соответствующие инструкции GoTo или GoSub. Рассмотрим пример использования GoTo:
a = 15 + b
If a < 0 Then GoTo 10
' Выполнение действий для значения переменной a больше нуля
10:
' Выполнение действий для значения переменной a меньше нуля
Следует отметить, что частое использование инструкции GoTo в программе не рекомендуется, так как может сделать алгоритм слишком запутанным. GoTo нередко допустимо заменить инструкциями выбора либо вызовом процедуры или функции.
Пара инструкций GoSub-Return
Во времена старого доброго языка Basic инструкции GoSub и Return были незаменимы для программиста. Это было связано с тем, что Basic не был даже процедурным языком программирования: в нем не было процедур и функций, все инструкции записывались в виде единой программы. Чтобы не реализовывать несколько раз одинаковые действия, в этой большой программе выделялись отрезки кода, выполняющие типичные действия, – подпрограммы. Подпрограмма начиналась некоторой меткой и оканчивалась инструкцией Return.
При достижении инструкции Go Sub осуществлялся переход на указанную метку (аналогично инструкции GoTo) – начинала выполняться подпрограмма. При достижении инструкции Return происходил возврат из подпрограммы – выполнение программы продолжалось после последней инструкции Go Sub.
Пара инструкций GoSub-Return в языке VBA работает точно таким же образом, но переходы осуществляются только в пределах процедуры или функции. Формат инструкций GoSub-Return такой:
GoSub Имя_метки
[Инструкции]
Имя_метки:
[Инструкции подпрограммы]
Return
Ниже приведен пример использования инструкций GoSub-Return (в подпрограмме вычисляется квадрат длины гипотенузы прямоугольного треугольника):
a = 5
b = 4
GoSub Calculate
' Другие действия
…
Calculate:
' Подпрограмма
c2 = a ^ 2 + b ^ 2
Return
Следует отметить, что при процедурном, а тем более объектно-ориентированном программировании необходимость использования подпрограмм полностью отпала. Роль подпрограмм выполняют функции и процедуры.
Процедуры и функции
В языке VBA программист должен записывать все инструкции своей программы внутри специальных блоков: функций и процедур. Код внутри процедуры или функции представляет собой подпрограмму, выполняющую требуемые действия. Перед рассмотрением способов создания процедур и функций необходимо узнать, чем же различаются эти два вида подпрограмм в VBA.
Процедура – это подпрограмма, которая выполняет действия, не возвращая никакого значения в качестве результата либо возвращая некоторые значения путем изменения переданных ей параметров. Функция в дополнение к возможностям процедуры может возвращать некоторое результирующее значение.
Далее в этом разделе будут рассмотрены особенности создания и использования процедур и функций в программах на VBA.
Объявление процедур
Для объявления процедуры в VBA используется следующая конструкция:
[Private | Public] [Static] Sub Имя_процедуры [(Список_аргументов)]
[Инструкции]
[Exit Sub]
[Инструкции]
End Sub
Ключевые слова Private и Public данной конструкции задают область видимости процедуры.
• Public – применяется по умолчанию, позволяет создать процедуру, которую можно вызывать из любого места проекта VBA. При использовании в модуле класса она дает возможность создавать общую процедуру (метод) этого класса.
• Private – позволяет создать процедуру, которую можно вызывать только в том модуле VBA, где данная процедура объявлена. При использовании в модуле класса дает возможность создавать личную процедуру (метод) этого класса.
Если в объявлении процедуры используется ключевое слово Static, то значения всех локальных переменных данной процедуры сохраняются между ее вызовами. Это эквивалентно использованию инструкции Static вместо Dim при объявлении каждой локальной переменной внутри процедуры.
Имя_процедуры – это любой корректный идентификатор VBA, который будет употребляться в программе в случае необходимости вызова данной процедуры.
Список_аргументов – содержит описания аргументов, которые принимаются процедурой. Описания аргументов разделяются запятой и имеют следующий формат:
[Optional] [ByVal | ByRef] [ParamArray] Имя_аргумента[()] [As Имя_типа] _
[= Значение_по_умолчанию]
Пояснения элементов, используемых в данной конструкции, приведены в табл. 1.7.
Таблица 1.7. Элементы описания аргумента процедуры
Для выхода из процедуры предусмотрена инструкция Exit Sub. При ее достижении выполнение программы немедленно переходит к инструкции, следующей за вызвавшей процедуру инструкцией.
Ниже приведен пример процедуры, имеющей два аргумента, при этом второй аргумент необязательный и передается по ссылке:
Sub ProcedureExample(ByVal intNumber As Integer, Optional fFlag = True)
' Инструкции процедуры
…
End Sub
Проведенную процедуру можно модифицировать так, чтобы вместо необязательного второго параметра процедура принимала произвольное количество аргументов, из которых формируется массив:
Sub ProcedureExample(ByVal intNumber As Integer, ParamArray varArray())
' Инструкции процедуры
…
End Sub
Внимание!
Два приведенных примера процедур в программе на VBA одновременно присутствовать не могут. Это обусловлено тем, что язык VBA не поддерживает перегрузку процедур и функций (создание процедур и функций с одинаковыми именами, но с разными параметрами).
Вызов процедур
Для вызова процедуры в программе на VBA предусмотрена инструкция Call, формат которой приведен ниже:
[Call] Имя_процедуры [Список_аргументов]
Здесь элемент Имя_процедуры представляет собой идентификатор вызываемой процедуры. Если процедура принимает аргументы, то они должны быть указаны на месте элемента Список_аргументов через запятую. В качестве аргументов в вызывающей процедуре или функции используются константные значения или идентификаторы переменных соответствующих типов.
Эта инструкция позволяет также вызывать и функции, но при этом возвращаемое ими значение получить невозможно.
Примечание
Интересной особенностью инструкции Call является то, что само ключевое слово Call можно опускать. Если ключевое слово Call используется, то список аргументов процедуры необходимо заключать в скобки. В противном случае скобок быть не должно.
Пусть имеется процедура:
Sub ProcedureExample(ByVal intNumber As Integer, ParamArray varArray())
' Инструкции процедуры
…
End Sub
Пусть также имеется процедура TestExample, в которой необходимо вызывать процедуру ProcedureExample. Процедуру TestExample можно реализовать следующим образом:
Sub TestExample()
' Инструкции процедуры
…
' Вызов ProcedureExample
Call ProcedureExample(123, "Значение1", "Значение2", "Значение3")
' Инструкции процедуры
…
End Sub
Если в TestExample не использовать ключевое слово Call, то вызов процедуры будет выглядеть так:
' Вызов ProcedureExample
ProcedureExample 123, "Значение1", "Значение2", "Значение3"
Далее, перед тем как рассматривать особенности передачи значений в процедуры, целесообразно рассмотреть создание и вызов функций. Это связано с тем, что передача параметров в процедуры и функции происходит одинаково.
Объявление функций. Возврат значения
Для объявления функций в VBA используется следующая конструкция:
[Private | Public] [Static] Function Имя_функции [(Список_аргументов)] _
[As Имя_типа]
[Инструкции]
[Имя_функции = Значение]
[Exit Functon]
[Инструкции]
[Имя_функции = Значение]
End Function
Приведенный формат объявления функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub, возможностью указания типа возвращаемого функцией значения (после списка аргументов) и возможностью в теле функции присвоить значение переменной с идентификатором, соответствующим идентификатору этой функции (Имяфункции = Значение). При объявлении функций можно использовать все возможности, доступные при объявлении процедур.
Если тип возвращаемого функцией значения не указан, то подразумевается возвращение значения типа Variant.
Для возврата значения функцией необходимо в нужном ее месте присвоить соответствующее значение переменной с таким же идентификатором, как и идентификатор функции. Часто в функции может быть несколько точек, в которых возвращается значение. Если после получения результата нужно немедленно выходить из функции, то после присвоения Имяфункции = Значение используется инструкция Exit Function. Если на протяжении выполнения функции не было использовано присвоение Имяфункции = Значение, то возвращается значение по умолчанию для соответствующего типа данных (см. подраздел об инициализации переменных).
Ниже приведен пример функции, которая вычисляет квадратный корень из переданного ей аргумента (если аргумент меньше нуля, то возвращается значение -1, сигнализирующее об ошибке):
Function dhSQR(dblValue As Double) As Double
If dblValue < 0 Then
' Недопустимый аргумент функции
dhSQR = -1
Else
' Вычисление квадратного корня
dhSQR = Sqr(dblValue)
End If
End Function
Вызов функций
Для вызова функций допускается также использовать инструкцию Call, например: