Procedure 12 Пропущен второй параметр
Procedure, 12 Пропущен первый параметр
Procedure Пропущены оба параметра
Использование именованных параметров
Язык VBA поддерживает также передачу аргументов процедурам и функциям с использованием именованных параметров. Суть данного способа заключается в том, что при вызове функции или процедуры явно указываются имена параметров, которым присваиваются соответствующие значения. При этом порядок передачи не важен.
Для использованной выше процедуры Procedure вызов с применением именованных параметров выглядит следующим образом:
Procedure intA:=12, intB:=56
или
Procedure intB:=56, intA:=12
При использовании именованных параметров значительно упрощается передача необязательных параметров. Чтобы пропустить задание такого параметра, ему просто не нужно ничего присваивать при вызове функции или процедуры, например:
В данном примере не очень заметны преимущества использования именованных параметров. Другое дело, если необходимо использовать следующую функцию, задав значения только параметров 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.