Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB_1 Mетодичка-Exel_укр_2.doc
Скачиваний:
3
Добавлен:
17.09.2019
Размер:
1.43 Mб
Скачать

5. Зона дії змінних і процедур

Всі процедури, функції, змінні і константи в VBA мають свою область застосування. Це означає, що вони можуть використовуватися лише у визначеному місці програмного коду — саме там, де вони описані. Наприклад, якщо змінна А описана за допомогою оператора Dim в телі процедури з ім'ям Proc1, саме ця процедура і є її зоною дії. Таким чином, якщо є інша процедура Ргос2, ви не можете використовувати в ній цю ж змінну. Якщо ви спробуєте зробити це, то або отримаєте повідомлення про помилку із-за використання неописаної змінної (в тому випадку, якщо використовується згадуваний ра­ніше оператор Option Explicit), або просто отримаєте іншу змінну — з тим же самим ім'ям, але ніяк не пов'язану з однойменною змінною з першої процедури.

Почнемо з визначення зони дії змінних. У якому місці програми і як саме описана змінна, визначає зону її дії і те, як довго вона "живе" в пам'яті і зберігає привласнене нею значення. Є три різні рівні при визначенні зони дії змінних:

  • рівень процедури;

  • рівень модуля;

  • рівень проекту.

Схема видимості змінних відповідно до об'єктно-орієнтованої моделі контейнерів. Змінні, оголошені в зовнішньому контейнері, доступні процедурам, що входять в цей контейнер (рис1.).

Аби визначити змінну на рівні процедури, її опис поміщається в тіло даної процедури, і тоді це буде локальна змінна даної процедури.

Аби визначити змінну на рівні модуля і зробити її тим самим доступною для спільного використання у всіх процедурах даного модуля, слідує розмістити її опис в секції оголошень модуля — перед текстом яких-небудь про­цедур або функцій. При цьому може використовуватися і явний опис області дії (визначення): замість ключового слова Dim в цьому випадку використовується ключове слово Private. Немає жодної різниці в тому, який з цих описувачів використовується.

Нарешті, аби описати змінну на рівні проекту, необхідно розташувати її опис в секції оголошень одного з модулів проекту і при цьому обов’язково повинно використовуватися ключове слово Public. Описані таким чином зміні можуть використовуватися в будь-якому модулі проекту.

( Замечание )

Все сказане раніше відноситься і до опису, і до визначення зони дії констант, а також масивів.

Для змінних є ще один спосіб їх опису, що не змінює їх рівня, але що дозволяє зберегти значення змінної, описаної на рівні процедури, після завершення роботи даної процедури. Для цього слід використовувати описувач static, тим самим визначаючи її як статичну змінну. Така зміна зберігає виділене нею місце в пам'яті і своє значення навіть після заверше­ння процедури, в якій вона була описана і використана.

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

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

Якщо потрібно описати процедуру, що використовується лише на рівні модуля, то для цього застосовується ключове слово Private. Врахуйте, що таке опис не лише звужує зону дії для процедури, але і забороняє її використання як само­стійної процедури — її можна викликати лише з іншої процедури.

Нарешті, при описі процедур або функцій може використовуватися і ключове слово static. Воно ніяк не впливає на зону дії процедури, але впливає на всі змінні, описані усередині цієї процедури або функції. В цьому випадку всі локальні змінні отримують статус static і тим самим залишаються в пам'яті після завершення такої процедури і при повторному її виклику зберігають свої колишні значення

рис. 1 Схема зони дії змінних

Public – оголошення глобальних зміних і змінна може використовуватися в будь-якій внутрішній процедурі програми.

Змінна var2, var5, var4 визначена лише для процедури 2, 5, 4 відповідно, var3 – у всіх процедурах Модуля 2, var1 - у всіх процедурах Модуля 1, var визначена у всіх модулях і процедурах (рівень проекту).

Розглянемо приклад модуля, що починається таким чином:

Public A1 As String рівень проекту, змінна А1 символьного типу

Private A2 As Integer рівень модуля, змінна А2 типу – коротке ціле

Dim A3 As Single рівень модуля, змінна А2 типу – коротке дійсне число з плаваючою крапкою

Sub Proc1( ) ‘ оголошення початку процедури Proc1

Dim A4 As Integer рівень процедури, змінна А4 типу – коротке ціле

Static A5 As Integer рівень модуля, змінна А5 типу – коротке ціле

A1 = "Текстовая строка 1" ‘ текстове значення змінної А1

A2 = 2 ‘ присвоєння цілого числа (2) змінної А2

A3 = 3.14 ‘ присвоєння дійсного з плаваючою крапкою числа (3.14) змінної А3

A4 = A4 + 4 ‘ розрахунок значення змінної А4

A5 = A5 + 5 ‘ розрахунок значення змінної А5

MsgBox A4 ‘ вивід значення змінної А4 у вікні повідомлення

MsgBox A5 ‘ вивід значення змінної А5 у вікні повідомлення

Debug.Print "Proc1:", "A4="; A4, "A5="; A5 ‘вивід значення змінної А4,А5 з коментарями(текстом) у вікні відладки

End Sub ‘ оголошення кінця процедури Proc1

Sub Proc2( ) ‘ оголошення початку процедури Proc2

Proc1 ‘ виклик процедури Proc1з поточного модуля

MsgBox Al ‘ вивід значення змінної А4 у вікні повідомлення

MsgBox A2 ‘ вивід значення змінної А4 у вікні повідомлення

MsgBox A3 ‘ вивід значення змінної А4 у вікні повідомлення

MsgBox A4 ‘ вивід значення змінної А4 у вікні повідомлення

MsgBox A5 ‘ вивід значення змінної А4 у вікні повідомлення

Debug.Print "1/Proc2:", "A1="; A1, "A2="; A2, "A3="; A3, "A4="; A4, "A5="; A5

вивід значення змінних А1, А2, А3, А4 та А5 з коментарями(текстом) у вікні відладки

Proc1 ‘ виклик процедури Proc1з поточного модуля

Debug.Print "2/Proc2:", "A1="; A1, "A2="; A2, "A3="; A3, "A4="; A4, "A5="; A5

вивід значення змінних А1, А2, А3, А4 та А5 з коментарями(текстом) у вікні відладки

End Sub ‘ оголошення кінця процедури Proc2

В даному прикладі змінна Al визначена на рівні всього проекту (використано ключове слово Public), змінні А2 і A3 визначені на рівні модуля, зміна А4 — лише на рівні процедури Procl, а змінна А5 хоча і визначена у телі процедури Procl, але описана як статична змінна.

При запуску на виконання процедури Ргос2 станеться наступне: з цієї процедури буде у свою чергу викликана процедура Procl, яка привласнить значення всім п'яти змінним А1, А2, A3, А4 і А5, а потім покаже поточні значення змінних А4 і А5 у вікні повідомлення (MsgBox) та вікні відладки рис.1, яке включається у VBA View → Immediate Window (Debug.Print).

Proc1: A4= 4 A5= 5

1/Proc2: A1= Текстовая строка 1 A2= 2 A3= 3,14 A4= A5=

Proc1: A4= 4 A5= 10

2/Proc2: A1= Текстовая строка 1 A2= 2 A3= 3,14 A4= A5=

Рисунок 1. Результат роботи процедури Proc2, наведеного приклада програми

Після завершення цієї процедури будуть виведені поточні значення змінних А1 — А5 з процедури Ргос2. При цьому виявиться, що змінні А1 — А3 зберегли свої значення, оскільки вони описані на рівні модуля, а змінні А4 і А5 набувають порожніх значень, оскільки зоною дії цих змінних є процедури, в яких вони використовуються. Жодні зміни цих змінних усередині однієї з процедур не мають відношення до аналогічних змінних з дру­гої процедури — насправді це різні змінні, просто для них використовуються співпадаючі імена.

Потім відбувається ще один виклик процедури Procl, і вона знов починає змінювати і виводити на екран значення змінних А4 і А5. При цьому змінна А4 знов набуде значення 4, оскільки при новому виклику процедури для цієї змінної буде заново виділена пам'ять, і вона ініціалізує порожнім значенням. На відміну від А4, змінна А5, описана як статична, збереже своє колишнє значення від попереднього виклику цієї процедури, в результаті її значення при по­вторному виклику опиниться рівним 10.

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