Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
EDO_VBA.doc
Скачиваний:
3
Добавлен:
11.08.2019
Размер:
494.08 Кб
Скачать

8.2. Зона видимості процедур

За умовчанням усі процедури VBA (за винятком процедур обробки подій) визначаються як відкриті (Public). Це означає, що їх можна викликати з будь-якої частини програми — з того ж модуля, з іншого модуля, з іншого проекту. Оголосити процедуру як Public можна так:

Public Sub Farewell()

оскільки процедура визначається як Public за умовчанням, то можна і так:

Sub Farewell()

Можна оголосити процедуру локальною:

Private Sub Farewell()

В цьому випадку цю процедуру можна буде викликати тільки з того модуля, в якому вона розташована. Таке рішення іноді може запобігти помилці, пов'язаній з викликом процедур, не призначених для цього, з інших модулів.

Можна обмежити зону видимості відкритих процедур (тих, які у вас визначені як Public) в якомусь модулі рамками одного проекту. Для цього досить в розділі оголошень цього модуля вписати рядок

Option Private Module

Якщо при оголошенні процедури використовувати ключове слово Static, то усі змінні в цій процедурі автоматично стануть статичними і будуть зберігати свої значення і після завершення роботи процедури. Наприклад:

Private Static Sub Farewell()

8.3. Оголошення процедур

Оголосити процедуру можна вручну, наприклад, додавши в код рядок:

Private Sub Farewell()

При цьому редактор коду автоматично додасть рядок End Sub і лінію-роздільник. А можна оголосити процедуру, скориставшись меню Insert | Procedure. Різниці немає ніякої.

8.4. Передача параметрів

Параметри — це значення, які передаються від однієї процедури до іншої. В принципі, можна обійтися і без параметрів, скориставшись тільки змінними рівня модуля, але при використанні параметрів прозорість програми покращується. Щоб процедура мала можливість приймати параметри, її спочатку треба оголосити з параметрами. Далі приведений приклад простої функції, яка додає два числа і повертає результат:

Function fSum(nItem1 As Integer, nItem2 As Integer)

fSum = nItem1 + nItem2

End Function

Її виклик може виглядати так:

MsgBox fSum(3, 2)

В даному випадку ми оголосили обидва параметри як обов'язкові, і тому спроба викликати функцію без передачі їй якого-небудь параметра (наприклад, 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(nItem1:= 3, nItem2:= 2)

Зверніть увагу, що, попри те, що тут виконується цілком звична операція — присвоєння значень, оператор присвоєння використовується не зовсім звичайний — двокрапка зі знаком рівності (:=), як в C++. При використанні знаку рівності виникне помилка.

Звичайно, замість явної передачі значень (fSum(3, 2)) можна використовувати змінні. Проте що станеться зі змінними після того, як вони "побувають" у функції, якщо функція змінює їх значення? Чи залишаться ці значення за межами функції колишніми або зміняться?

Усе залежить від того, як саме передаються параметри : по посиланню (по замовчуванню, можна також використовувати ключове слово byRef) або за значенням (ключове слово byVal).

Якщо параметри передаються по посиланню, то фактично в ту, що викликається процедуру передається посилання на цю змінну в оперативній пам'яті. Якщо цю змінну в процедурі, що викликається, змінити, те значення зміниться і в зухвалій функції. Це прийняте в VBA поведінка за умовчанням. Якщо параметри передаються за значенням, то фактично в оперативній пам’яті створюється копія цієї змінної і в процедуру, що викликається, передається ця копія. Звичайно ж, щоб ви не зробили з копією, на початкову змінну це ніяк не вплине і в викликаючій процедурі не відіб'ється. Продемонструвати різницю можна на простому прикладі:

Private Sub TestProc()

'Оголошуємо змінну nPar1 і привласнюємо їй значення

Dim nPar1 As Integer

nPar1 = 5

'Передаємо її як параметр nItem1 функції fSum

MsgBox fSum(nItem1:=nPar1, nItem2:=2)

'А тепер перевіряємо, що стало в нашій змінній nPar1

'після того, як вона побувала у функції fSum

MsgBox nPar1

End Sub

Function fSum(nItem1 As Integer, nItem2 As Integer)

'Використовуємо значення змінної

fSum = nItem1 + nItem2

'А потім її міняємо!

nItem1 = 10

End Function

Перевірте, що буде, якщо поміняти рядок оголошення функції :

Function fSum(nItem1 As Integer, nItem2 As Integer)

на іншу:

Function fSum(byVal nItem1 As Integer, nItem2 As Integer)

Можна продемонструвати компілятору VBA, що значення, що повертається функцією, нас абсолютно не цікавить. Для цього досить не брати її параметри в круглі дужки. Наприклад, для нашої функції це може виглядати так:

fSum 3, 2

Такий код працюватиме абсолютно нормально. Проте якщо нам потрібно все-таки дізнатися, що повертає функція, то потрібно її параметри брати в круглі дужки:

nResult = fSum(3, 2)

Для багатьох вбудованих функцій компілятор VBA в принципі не дає можливості ігнорувати значення, яке повертається, примушуючи поміщати параметри в круглі дужки і набувати повертаного значення. У протилежному випадку він повідомляє про синтаксичну помилку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]