Передача параметрів процедур і функцій в vba
Передача параметрів процедур і функцій в VBA, необов'язкові (optional) параметри, передача за посиланням (ByRef) і за значенням (ByVal), застосування посилань при передачі параметрів
Параметри - значення, які передаються від однієї процедури інший. В принципі, можна обійтися і без параметрів, скориставшись тільки змінними рівня модуля, але при використанні параметрів Новомосковскемость програми поліпшується. Щоб процедура мала можливість приймати параметри, її спочатку потрібно оголосити з параметрами. Наприклад, ось приклад простий функції, яка складає два числа і виводить результат:
Function fSum (nItem1 As Integer, nItem2 As Integer)
fSum = nItem1 + nItem2
Виклик її може виглядати так:
В даному випадку ми оголосили обидва параметри як обов'язкові, і тому спроба викликати функцію без передачі їй будь-якого параметра (наприклад, так: MsgBox (fSum (3))) призведе до помилки "Argument not optional" - "Параметр не є необов'язковим" . Щоб можна було пропускати якісь параметри, ці параметри можна зробити необов'язковими. Для цієї мети використовується ключове слово Optional:
Function fSum (nItem1 As Integer, Optional nItem2 As Integer)
У довідці по вбудованим функціям VBA необов'язкові параметри полягають в квадратні дужки.
Для перевірки того, чи був переданий необов'язковий параметр, використовується або функція IsMissing (якщо для цього параметра був використаний тип Variant), або його значення порівнюється зі значеннями змінних за замовчуванням (нуль для числових даних, порожній рядок для строкових і т.п.)
Виклик функції з передачею параметрів може виглядати так:
nResult = fSum (3, 2)
Однак тут є кілька моментів, які необхідно розглянути.
У нашому прикладі ми передаємо параметри по позиції, тобто значення 3 присвоюється першому параметру (nItem1), а значення 2 - другого (nItem2). Однак параметри можна передавати і по імені:
nResult = fSum (nItem 1: = 3, nItem 2: = 2)
Зверніть увагу, що незважаючи на те, що тут виконується цілком звична операція - привласнення значень, оператор присвоєння використовується не зовсім звичайний - двокрапка зі знаком рівності, як в C ++. При використанні знака рівності виникне помилка.
Звичайно, замість явної передачі значень (як у нас - 3 і 2) можна використовувати змінні. Однак що станеться зі змінними після того, як вони "побувають" в функції, якщо функція змінює їх значення? Чи залишиться це значення за межами функції колишнім або зміниться?
Все залежить від того, як саме передаються параметри - за посиланням (за замовчуванням, можна також використовувати ключове слово ByRef або за значенням - потрібно використовувати ключове слово ByVal).
Якщо параметри передаються за значенням, то фактично в оперативній пам'яті створюється копія цієї змінної і викликається процедурі передається ця копія. Звичайно ж, щоб ви не зробили з цією копією, на вихідну змінну це ніяк не вплине і в викликає процедурі не відіб'ється.
Продемонструвати різницю можна на простому прикладі:
Private Sub TestProc ()
'Оголошуємо змінну nPar1 і присвоюємо їй значення
Dim nPar1 As Integer
'Передаємо її як параметр nItem1 функції fSum
MsgBox (fSum (nItem1: = nPar1, nItem2: = 2))
'А тепер перевіряємо, що стало в нашій змінної nPar1,' після того, як вона побувала в функції fSum:
Function fSum (nItem1 As Integer, nItem2 As Integer)
'Використовуємо значення змінної
fSum = nItem 1 + nItem 2
'А потім її міняємо!
Function fSum (nItem1 As Integer, nItem2 As Integer)
на наступний рядок.
Function fSum (byVal nItem1 As Integer, nItem2 As Integer)
Можна продемонструвати компілятору VBA, що те, що повертає функція, наш абсолютно не цікавить. Для цього досить не укладати її параметри в круглі дужки. Наприклад, у випадку з вбудованою функцією MsgBox це може виглядати так:
а для нашої функції -
Такий код буде працювати абсолютно нормально. Однак, якщо нам буде потрібно все-таки дізнатися, що повертає MsgBox, то доведеться передані йому параметри укладати в круглі дужки:
Для багатьох вбудованих функцій компілятор VBA в принципі не дає можливості ігнорувати значення, що повертається, змушуючи поміщати параметри в круглі дужки і приймати значення, що повертається.