Особенности передачи параметров
При создании и использовании процедур и функций необходимо учитывать некоторые особенности передачи параметров в них. Они общие для процедур и функций. Рассмотрим данные особенности.
Позиционная передача параметров
Этот способ передачи параметров наиболее распространен и применяется практически во всех языках программирования. Во всех предыдущих примерах использовался именно позиционный способ передачи параметров в функции и процедуры. Суть данного способа в том, что при вызове процедуры или функции аргументы записываются в том порядке, в котором они указаны при ее объявлении. Пусть, например, необходимо использовать такую процедуру:
Sub Procedure(Optional intA As Integer = 25, Optional intB As Integer)
' Инструкции процедуры
…
End Sub
Вызов данной процедуры с использованием позиционной передачи параметров выглядит следующим образом:
Procedure 12, 56
или
Call Procedure (12, 56)
Отдельного внимания заслуживает передача необязательных параметров. Необязательные параметры можно пропустить, тогда им будет присвоено значение по умолчанию (см. подраздел об объявлении процедур). Ниже приведены примеры вызова процедуры Procedure с пропуском некоторых параметров по умолчанию:
Procedure 12 Пропущен второй параметр
Procedure, 12 Пропущен первый параметр
Procedure Пропущены оба параметра
Использование именованных параметров
Язык VBA поддерживает также передачу аргументов процедурам и функциям с использованием именованных параметров. Суть данного способа заключается в том, что при вызове функции или процедуры явно указываются имена параметров, которым присваиваются соответствующие значения. При этом порядок передачи не важен.
Для использованной выше процедуры Procedure вызов с применением именованных параметров выглядит следующим образом:
Procedure intA:=12, intB:=56
или
Procedure intB:=56, intA:=12
При использовании именованных параметров значительно упрощается передача необязательных параметров. Чтобы пропустить задание такого параметра, ему просто не нужно ничего присваивать при вызове функции или процедуры, например:
Procedure intB:=56
В данном примере не очень заметны преимущества использования именованных параметров. Другое дело, если необходимо использовать следующую функцию, задав значения только параметров arg3 и arg8:
Function dhManyArg(Optional arg1, Optional arg2, Optional arg3,
_
Optional arg4, Optional arg5, Optional arg6, Optional arg7, _
Optional arg8)
' Инструкции функции
…
End Function
Очевидно, что инструкция
varRes = dhManyArg(,,"text",,,,,142.23)
куда менее наглядна и понятна, чем инструкция
varRes = dhManyArg(arg3:="text",arg8:=142.23)
Передача аргументов по значению или ссылке
Рассмотрим, каким образом в вызываемой процедуре или функции может осуществляться доступ к передаваемым данным. В языке VBA существуют две возможности передачи аргументов: по значению и по ссылке.
При передаче аргумента по значению в вызываемой процедуре или функции создается локальная переменная, в которую копируется все переданное содержимое аргумента. Изменение значения этой локальной переменной никак не отражается на значении переменной, соответствующей аргументу в вызывающей процедуре или функции.
Ниже приведен пример процедуры, принимающей аргумент по значению:
Sub TestByVal(ByVal intArg As Integer)
' Какие-то действия, во время которых значение переменной _
intArg изменяется
...
End Sub
Допустим теперь, что в некоторой процедуре присутствует такая инструкция, как TestByVal intValue. После выполнения этой инструкции значение переменной intValue в вызывающей процедуре останется таким же, каким оно было до вызова процедуры TestByVal.
При передаче аргумента по ссылке дело обстоит иначе: при изменении значения переменной-аргумента в вызываемой процедуре или функции изменяется значение соответствующей переменной в вызывающей процедуре или функции.
Ниже приведен пример процедуры, принимающей аргумент по ссылке:
Sub TestByRef(ByRef intArg As Integer)
' Какие-то действия, во время которых значение переменной _
intArg изменяется
...
End Sub
Допустим, что теперь в другой процедуре присутствует такая инструкция, как TestByRef intValue. После выполнения данной инструкции в вызывающей процедуре значение переменной intValue будет отличаться от первоначального.
Передача аргументов по значению позволяет защитить данные вызывающей процедуры или функции от незапланированного изменения. В то же время передача аргументов по ссылке может использоваться для возврата значений процедурами, а также для возврата функциями более одного значения. Важным моментом является то, что передача больших объемов данных (например, длинных строк) по ссылке происходит значительно быстрее, чем по значению.