Поиск…
Синтаксис
- Идентификатор_имя [ аргументы ]
- Идентификатор вызова [[ аргументы ]]
- [Let | Set] expression = ИдентификаторName [ (аргументы) ]
- [Let | Set] ИдентификаторName [ (arguments) ] = выражение
параметры
параметр | Информация |
---|---|
ИмяИдентификатора | Имя процедуры для вызова. |
аргументы | Список аргументов, разделенных запятыми, которые должны быть переданы процедуре. |
замечания
Первые два синтаксиса предназначены для вызова процедур Sub
; обратите внимание, что первый синтаксис не содержит круглых скобок.
См. Это сбивает с толку. Почему бы просто не использовать круглые скобки? для подробного объяснения различий между двумя первыми двумя синтаксисами.
Третий синтаксис предназначен для вызова процедур Function
и Property Get
; когда есть параметры, скобки всегда обязательны. Ключевое слово Let
является необязательным при назначении значения , но ключевое слово Set
требуется при назначении ссылки .
Четвертый синтаксис предназначен для вызова процедур Property Let
и Property Set
; expression
в правой части присваивания передается параметру значения свойства.
Синтаксис неявного вызова
ProcedureName
ProcedureName argument1, argument2
Вызовите процедуру по ее имени без каких-либо круглых скобок.
Кронштейн
Ключевое слово Call
требуется только в одном случае:
Call DoSomething : DoSomethingElse
DoSomething
и DoSomethingElse
- вызываемые процедуры. Если ключевое слово Call
было удалено, то DoSomething
будет анализироваться как метка строки, а не вызов процедуры, который нарушит код:
DoSomething: DoSomethingElse 'only DoSomethingElse will run
Возвращаемые значения
Чтобы получить результат вызова процедуры (например, Function
или процедуры получения Property Get
), поместите вызов в правую часть задания:
result = ProcedureName
result = ProcedureName(argument1, argument2)
Скобки должны присутствовать, если есть параметры. Если процедура не имеет параметров, скобки являются избыточными.
Это смущает. Почему бы просто не использовать круглые скобки?
Круглые скобки используются для включения аргументов вызовов функций . Использование их для вызовов процедур может вызвать непредвиденные проблемы.
Поскольку они могут вводить ошибки, как во время выполнения, передавая возможно непреднамеренное значение для процедуры, так и во время компиляции, просто будучи недействительным синтаксисом.
Во время выполнения
Резервные круглые скобки могут вводить ошибки. Учитывая процедуру, которая принимает ссылку на объект как параметр ...
Sub DoSomething(ByRef target As Range)
End Sub
... и вызывается с круглыми скобками:
DoSomething (Application.ActiveCell) 'raises an error at runtime
Это вызовет ошибку времени выполнения «Требуемый объект» # 424. Другие ошибки возможны и в других обстоятельствах: здесь ссылка на объект Application.ActiveCell
Range
оценивается и передается по значению независимо от сигнатуры процедуры, указывающей, что target
будет передана ByRef
. Фактическое значение, переданное ByVal
в DoSomething
в приведенном выше фрагменте, - Application.ActiveCell.Value
.
Скобки заставляют VBA оценивать значение выражения в квадратных скобках и передавать результат ByVal
вызываемой процедуре. Когда тип оцениваемого результата не соответствует ожидаемому типу процедуры и не может быть неявно преобразован, возникает ошибка времени выполнения.
Во время компиляции
Этот код не сможет скомпилировать:
MsgBox ("Invalid Code!", vbCritical)
Поскольку выражение ("Invalid Code!", vbCritical)
не может быть оценено до значения.
Это будет скомпилировано и работает:
MsgBox ("Invalid Code!"), (vbCritical)
Но определенно будет выглядеть глупо. Избегайте избыточных скобок.
Синтаксис явного вызова
Call ProcedureName
Call ProcedureName(argument1, argument2)
Явный синтаксис вызова требует ключевого слова Call
и круглых скобок вокруг списка аргументов; круглые скобки являются избыточными, если нет параметров. Этот синтаксис был устаревшим, когда в VB был добавлен более современный неявный синтаксис вызова.
Необязательные аргументы
Некоторые процедуры имеют необязательные аргументы. Необязательные аргументы всегда появляются после необходимых аргументов, но процедура может быть вызвана без них.
Например, если функция, ProcedureName
должна иметь два обязательных аргумента ( argument1
, argument2
) и один необязательный аргумент optArgument3
, его можно было бы назвать как минимум четырьмя способами:
' Without optional argument
result = ProcedureName("A", "B")
' With optional argument
result = ProcedureName("A", "B", "C")
' Using named arguments (allows a different order)
result = ProcedureName(optArgument3:="C", argument1:="A", argument2:="B")
' Mixing named and unnamed arguments
result = ProcedureName("A", "B", optArgument3:="C")
Структура вызываемого здесь заголовка функции будет выглядеть примерно так:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String) As String
Ключевое слово Optional
указывает, что этот аргумент можно опустить. Как уже упоминалось ранее, любые необязательные аргументы, введенные в заголовок, должны появляться в конце после любых необходимых аргументов.
Вы также можете указать значение по умолчанию для аргумента в том случае, если значение не передается функции:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String = "C") As String
В этой функции, если аргумент для c
не указан, значение будет по умолчанию равно "C"
. Если задано значение , это переопределит значение по умолчанию.