Аргумент в процедуру можна передавати як посилання, вказавши адресу його розміщення в пам'яті, або як значення.
Якщо аргумент передано по посиланню, то процедура отримує безпосередній доступ до нього і при виконанні може змінювати значення переданого аргументу.
Приклад передачі аргументу по посиланню
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 використовується спосіб передачі аргументів по посиланню.
Якщо аргументом використовується змінна, тип даних якої визначений користувачем, то такий аргумент можна передавати лише як посилання.