Розуміння змінних і констант у макросах Excel

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

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

Константи можуть бути корисними, якщо вам потрібно використовувати те саме велике значення кілька разів. Замість того, щоб копіювати число, ви можете просто написати назву константи. Наприклад, ви можете використовувати константу «Pi» для зберігання числа Pi, яке є постійним значенням. Він дуже великий, і кожного разу його досить важко писати або шукати та копіювати. Так ось, досить написати два символи, і середовище автоматично використовує потрібне число.

Користувачеві Excel необхідно оголошувати змінні, якщо йому час від часу потрібно змінювати значення, що зберігаються в них. Наприклад, ви можете встановити змінну під назвою sVAT_Rate, яка зберігатиме поточну ставку ПДВ для продукту. Якщо він зміниться, ви можете швидко це виправити. Це особливо корисно для тих, хто веде бізнес у Сполучених Штатах, де деякі товари можуть взагалі не обкладатися ПДВ (і цей податок також відрізняється від штату до штату).

Типи даних

Кожен контейнер даних може бути одного з кількох типів. Ось таблиця з описом стандартних типів обробленої інформації. Їх багато, і новачкові спочатку може здатися, що вони повторюють один одного. Але це ілюзорне відчуття. Читайте далі, щоб дізнатися, чому вказувати правильний тип даних так важливо.

Не рекомендується використовувати тип даних, який займає більше місця в пам'яті для невеликих чисел. Наприклад, для числа 1 достатньо використовувати тип Byte. Це позитивно позначиться на продуктивності виконуваного модуля, особливо на слабких комп'ютерах. Але тут важливо не зайти занадто далеко. Якщо ви використовуєте надто компактний тип даних, у нього може не поміститися завелике значення.

Оголошення констант і змінних

Настійно не рекомендується використовувати контейнер даних без його попереднього оголошення. Тоді може виникнути ряд проблем, щоб уникнути яких необхідно написати кілька невеликих рядків коду з перерахуванням змінних або констант.

Для оголошення змінної використовується оператор Dim. Наприклад, так:

Dim Variable_Name як ціле число

Ім'я_змінної — ім'я змінної. Далі записується оператор As, що вказує на тип даних. Замість рядків “Variable_Name” і “Integer” ви можете вставити власне ім’я та тип даних.

Константи також можна оголошувати, але спочатку потрібно вказати їх значення. Один із варіантів:

Const iMaxCount = 5000

Справедливості заради зазначимо, що в деяких випадках можна обійтися без оголошення змінної, але в цьому випадку їм автоматично буде присвоєно тип Variant. Однак це не рекомендується з наступних причин:

  1. Варіант обробляється набагато повільніше, і якщо таких змінних багато, на слабких комп'ютерах обробка інформації може істотно сповільнитися. Здавалося б, що вирішать ці секунди? Але якщо вам доведеться написати велику кількість рядків коду, а потім ще й запустити його на слабких комп'ютерах (які все-таки продаються, враховуючи, що сучасні офісні пакети вимагають багато оперативної пам'яті), можна повністю припинити роботу. Відомі випадки, коли непродумане написання макросів призводило до зависання смартбуків, які мають малий обсяг оперативної пам'яті і не призначені для виконання складних завдань. 
  2. Дозволені помилки в іменах, яких можна запобігти за допомогою оператора Option Explicit, який дозволяє знайти неоголошену змінну, якщо вона знайдена. Це простий спосіб виявлення помилок, оскільки найменша помилка призводить до того, що інтерпретатор не зможе ідентифікувати змінну. А якщо включити режим оголошення змінних, то інтерпретатор просто не дозволить запустити макрос, якщо виявляться контейнери даних, які не були оголошені на самому початку модуля.
  3. Уникайте помилок, викликаних значеннями змінних, які не відповідають типу даних. Зазвичай присвоєння текстового значення цілочисельній змінній викликає помилку. Так, з одного боку, загальний тип присвоюється без оголошення, але якщо вони оголошені заздалегідь, то випадкових помилок можна уникнути.

Тому, незважаючи ні на що, настійно рекомендується оголошувати всі змінні в макросах Excel.

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

  1. Рядки робляться порожніми.
  2. Числа приймають значення 0.
  3. Змінні типу Boolean спочатку вважаються помилковими.
  4. Стандартною датою є 30 грудня 1899 року.

Наприклад, вам не потрібно присвоювати значення 0 цілочисельній змінній, якщо раніше не було зазначено значення. Вона вже містить цей номер.

Опція Явне твердження

Цей оператор дозволяє оголосити всі змінні, які використовуються в коді VBA, і визначити наявність будь-яких неоголошених контейнерів перед виконанням коду. Щоб скористатися цією функцією, просто напишіть рядок коду Option Explicit у верхній частині коду макросу.

Якщо вам потрібно щоразу включати цей оператор у свій код, ви можете зробити це за допомогою спеціального параметра в редакторі VBA. Щоб увімкнути цю опцію, ви повинні:

  1. Перейдіть до середовища розробки по шляху – Інструменти > Параметри.
  2. У вікні, що відкриється після цього, відкрийте вкладку Редактор.
  3. І, нарешті, поставте прапорець поруч із пунктом «Вимагати оголошення змінної».

Після завершення цих дій натисніть кнопку «ОК». 

Ось і все, тепер при написанні кожного нового макросу цей рядок автоматично вставлятиметься вгору коду.

Область застосування констант і змінних

Кожна змінна або константа має лише обмежену область. Це залежить від того, де ви це декларуєте.

Припустимо, у нас є функція Загальна вартість(), і він використовує змінну sVAT_Rate. Залежно від позиції в модулі він матиме різний обсяг:

Варіант явний

Dim sVAT_Rate As Single

Функція Total_Cost() Як Double

.

.

.

End Function

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

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

Варіант явний

Функція Total_Cost() Як Double

Dim sVAT_Rate As Single

   .

   .

   .

End Function

У цьому випадку змінна оголошується всередині процедури, і інтерпретатор видасть помилку, якщо вона використовується в іншій процедурі.

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

Ви можете встановити область констант подібним чином, але ключове слово тут записується разом з оператором Const.

Ось таблиця з гарним прикладом того, як це працює з константами та змінними.

Варіант явний

Публічна sVAT_Rate як єдина

Public Const iMax_Count = 5000

У цьому прикладі ви можете побачити, як ключове слово Public використовується для оголошення змінної, і що потрібно написати в редакторі Visual Basic, щоб оголосити публічну константу. Обсяг цих контейнерів значень стосується всіх модулів.
Варіант явний

Приватна sVAT_Rate як єдина

Private Const iMax_Count = 5000

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

Навіщо потрібні константи та змінні

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

Відповідь виявляється десь в тій же площині, що і щодо використання типів даних, які займають великий простір у пам'яті. Якщо ми маємо справу з величезною кількістю змінних, ми можемо випадково змінити існуючий контейнер. Якщо користувач вказує, що певне значення ніколи не змінюватиметься, то середовище автоматично контролюватиме це.

Це особливо важливо, коли макрос пишеться кількома програмістами. Можна знати, що якась змінна не повинна змінюватися. А інше ні. Якщо ви вкажете оператор Const, інший розробник знатиме, що це значення не змінюється.

Або, якщо є константа з одним ім'ям, а змінна має інше, але схоже ім'я. Розробник може їх просто переплутати. Наприклад, одна змінна, яку не потрібно змінювати, називається Variable11, а інша, яку можна редагувати, називається Variable1. Людина може автоматично, при написанні коду, випадково пропустити зайвий блок і не помітити цього. В результаті буде змінений контейнер для значень, які не варто чіпати.

Або сам розробник може забути, яких змінних він може торкатися, а яких ні. Це часто трапляється, коли код пишеться кілька тижнів, і його розмір стає великим. За цей час дуже легко забути навіть те, що означає та чи інша змінна.

Так, коментарями в цій ситуації можна обійтися, але чи не простіше вказати слово Const?

Висновки

Змінні є важливим компонентом програмування макросів, які дозволяють виконувати складні операції, від обчислень до інформування користувача про певні події або вказівки конкретних значень у клітинках електронної таблиці.

Константи слід використовувати, якщо розробник точно знає, що вміст цих контейнерів не зміниться в майбутньому. Рекомендується не використовувати замість них змінні, оскільки можна випадково зробити помилку.

залишити коментар