Аргумент в процедуру можно передавать как ссылку, указав адрес его размещения в памяти, или как значение.
Если аргумент передан по ссылке, то процедура получает непосредственный доступ к нему и при выполнении может изменять значение переданного аргумента.
Пример передачи аргумента по ссылке
Sub myArg(a)
a = a * 10
End Sub
Sub myCode()
Dim b
b = 5
Call myArg(b)
MsgBox b
End Sub
В данном примере, процедура myArg является вызываемой, а процедура myCode – вызывающей.
В процедуре myCode, переменной b присваивается значение 5. Затем, с помощью ключевого слова Call вызывается процедура myArg, которой в качестве аргумента передаётся переменная b. В процедуре myArg, полученная переменная b умножается на 10. Далее с помощью оператора MsgBox на экран выводится диалоговое окно с текущим значением переменной b (это значение будет 50, поскольку 5 * 10 = 50).
Если аргумент передаётся как значение, то процедура получает копию передаваемого аргумента, и поэтому изменение аргумента внутри этой процедуры уже не оказывает никакого влияния на исходную переменную. То есть, значение аргумента, который передаётся вызываемой процедуре по значению, всегда остаётся неизменным в вызывающей процедуре, независимо от того какие действия выполняются в вызываемой процедуре.
Для того, чтобы передать аргумент по значению, используют ключевое слово ByVal, которое указывают перед именем аргумента в вызываемой процедуре.
Пример передачи аргумента как значения
Sub myArg(ByVal a)
a = a * 10
End Sub
Sub myCode()
Dim b
b = 5
Call myArg(b)
MsgBox b
End Sub
В данном примере, значение переменной b в вызываемой процедуре myArg не изменится. Поэтому, оператор MsgBox выведет на экран диалоговое окно, в котором будет отображено значение переменной b равное 5.
Примечание.
По умолчанию, в VBA используется способ передачи аргументов по ссылке.
Если в качестве аргумента используется переменная, тип данных которой определён пользователем, то такой аргумент можно передавать только как ссылку.
