Примечание
Интересной особенностью инструкции 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, например:
Call dhSQR(16.324)
или
dhSQR 16.324
Однако при этом теряется возвращаемое функцией значение. Для использования возвращаемого значения идентификаторы функций необходимо включать в выражения справа от знака равенства или другого оператора. Тогда в момент вычисления значения выражения, в состав которого входит идентификатор функции, происходит вызов данной функции, а возвращенное ей значение подставляется в исходное выражение вместо идентификатора функции. Например, в результате обработки каждого из следующих выражений в переменную dblRes будет записано значение 5:
dblRes = dhSQR(25)
dblRes = 1 + dhSQR(16)
Точно таким же образом вызываются все встроенные функции VBA, например
IsArray, SQR и Array.
Особенности передачи параметров