Синтаксис та програмні конструкції VBA
Основи синтаксису
Синтаксис - (грец. складання) розділ граматики, що вивчає поєднання слів у речення. Синтаксис мови VBA - тема, яка багатьом здається нудною, але ставитися до неї слід так само, як до вивчення абетки і таблиці множення: у самій абетці або таблиці множення нічого цікавого немає, але без їх знання не прочитати цікаві книги або зробити важливі обчислення .
Основні синтаксичні принципи VBA:
1. VBA нечутливий до регістру;
2. щоб закоментувати код до кінця рядка, використовується одинарна лапка ( ') або команда REM;
3. символьні значення повинні братися у подвійні лапки ("");
4. максимальна довжина будь-якого імені у VBA (змінні, константи, процедури) - 255 символів;
5. початок нового оператора – це перехід на новий рядок
6. обмежень на максимальну довжину рядка немає (хоча у редакторі в рядку міститься лише 308 символів). В одному фізичному рядку оператори розділяються двокрапками:
MsgBox "Перевірка 1": MsgBox "Перевірка 2"
7. для зручності читання можна об'єднати декілька фізичних рядків в один логічний за допомогою пробілу і знаку підкреслення після нього:
MsgBox "Повідомлення користувачу" _
& VUserName
Оператори
Оператор - це найменша одиниця коду VBA, яка здатна виконуватися. Оператор може оголошувати або визначати змінну, встановлювати параметр компілятора VBA або виконувати яку-небудь дію в програмі.
Арифметичних операторів у VBA всього 7. Чотири стандартних: додавання (+), віднімання (-), множення (*), ділення (/), і ще три:
1. піднесення до степеня (^). Наприклад, 2 ^ 3 = 8;
2. цілочисельні поділ (). Ділить перше число на друге, відкидаючи (не округлюючи) дробову частину. Наприклад, 5 2 = 2;
3. ділення по модулю (Mod). Ділить перше число на друге, повертаючи тільки залишок від ділення. Наприклад, 5 Mod 2 = 1.
Оператор присвоювання в VBA - це знак рівності. Можна записувати так: Let nVar = 10, а можна ще простіше:
nVar = 10. Тут не плутайте знак рівності з оператором рівності. Останній вираз означає "присвоїти змінній nVar значення 10", а якщо рядок виглядає так: If (nVar = 10), то це значить "якщо значення змінної nVar дорівнює 10".
Операторів порівняння у VBA усього 8:
• рівність (=). Наприклад, If (nVar = 10);
• більше, ніж (>) і менше, ніж (<). Наприклад, If (nVar> 10);
• більше або дорівнює (> =) і менше або дорівнює (<=). Наприклад, If (nVar> = 10);
• не дорівнює (<>). Наприклад, If (nVar <> 10);
• порівняння об'єктів (Is). Визначає, посилаються об'єктні змінні на один і той самий об'єкт або на різні. Наприклад, If (objl is obj2);
• подібність (Like). Порівнює рядковий об'єкт із шаблоном і визначає, чи підходить шаблон. Оператори порівняння завжди повертають True (якщо затвердження істинно) або False (якщо твердження хибне).
Особливості порівняння символьних значень:
- при порівнянні символьних значень враховується регістр;
- пробіли у символьних значеннях також враховуються;
- при порівнянні текстових рядків на більше/менше за замовчуванням порівнюються просто двійкові коди символів - які більше або менше. Якщо потрібно використовувати той порядок, який йде в алфавіті, то потрібно скористатися командою Option Compare Text
Загальний синтаксис оператора Like виглядає так: Вираз1 Like Вираз2
При цьому Вираз1 - це будь-який текстовий вираз VBA, а Вираз2 - шаблон, який передається оператору Like. У цьому шаблоні можна використовувати спеціальні символів узагальнення (табл.1).
Логічні оператори використовуються при перевірці умов:
1. And - логічне І. повинні бути істинними обидві умови;
2. Or - логічне АБО. Повинна бути істинною хоча б одна з умов;
3. Not - логічне заперечення. Повертає True, якщо умова помилкова;
4. Xог - логічне виключення. У виразі E1 xor E2 повертає True, якщо тільки E1 = True або тільки Е2 = True, інакше - False;
5. Eqv - еквівалентність двох виразів, повертає True, якщо вони мають однакове значення;
6. Imp - імплікація, E1 imp E2 повертає False, якщо E1 = True і Е2 = False, інакше - True.
Табл.1. Підстановочні символи для оператора like
Підстановочний символ
|
Значення
|
#
|
Будь-яка одна цифра от 0 до 9
|
*
|
Будь-яка кіькість будь-яких символів (включаючи нульову)
|
?
|
Будь-який один символ
|
[а, Ь, с]
|
Будь-який один символ із приведеного у квадратних дужках списку
|
[ !а, Ь, с]
|
Будь-який один символ, окрім приведених у списку
|
Оператори конкатенаціі (тобто злиття символьних значень) використовуються майже у будь-якій програмі. У VBA їх два - (+) або (&). Рекомендується використовувати оператор (&), тому що:
- при використанні (&) виробляється автоматичне перетворення числових значень у рядкові - немає небезпеки допустити помилку:
- при використанні оператора (+) додавання символьного значення до значення типу Null дає Null.
Приклад використання оператора (&): MsgBox "Повідомлення користувачеві" & vUserName
Пріоритет операторів (першість виконання):
1. арифметичні оператори,
2. оператори конкатенаціі,
3. оператори порівняння,
4. логічні оператори.
Якщо у виразі є кілька операторів одного типу, то вони застосовуються у звичайному порядку - зліва направо. При необхідності можна змінювати порядок застосування операторів за допомогою круглих дужок.
Змінні і типи даних
Змінні - це контейнери для зберігання змінюваних даних. Для простоти змінну можна порівняти з номерком у гардеробі - ви здаєте у гардероб якісь дані, у відповідь вам видається номерок. Коли вам знову потрібні ці дані, ви "пред'являєте номерок" і отримуєте їх. Приклад роботи зі змінними у VBA може виглядати так:
Dim nMyAge As Integer
nMyAge = nMyAge +10
MsgBox nMyAge
Перед роботою зі змінною настійно рекомендується її оголосити. Оголошення змінної у нашому прикладі виглядає так:
Dim nMyAge As Integer.
Розшифруємо цей рядок.
Dim - це область видимості змінної. У VBA передбачено 4 ключових слова для визначення області видимості змінних.
1. Dim - використовується у більшості випадків. Якщо змінна оголошена як Dim в області оголошень модуля, то вона буде доступна в усьому модулі, якщо у процедурі - тільки на час роботи цієї процедури. Якщо немає ніяких особливих вимог, то має сенс завжди вибирати область видимості Dim.
2. Private - при оголошенні змінних у стандартних модулях VBA означає те ж, що й Dim. Відмінності проявляються тільки при створенні своїх класів.
3. Public - така змінна буде доступна усім процедурам у всіх модулях даного проекту, якщо її оголосили в області оголошень модуля. Якщо її оголосили всередині процедури, вона буде вести себе як Dim.
4. Static - такі змінні можна використовувати тільки всередині процедури. Ці змінні видно тільки всередині процедури, в якій вони оголошені, зате вони зберігають своє значення між різними викликами цієї процедури. Зазвичай використовуються для накопичення будь-яких значень. Наприклад:
Static nVarl As Integer
nVarl = nVarl + 1
MsgBox nVarl
Друге слово в нашому оголошення - nMyAge - це ідентифікатор (унікальне ім'я) змінної. Правила вибору імен єдині для багатьох елементів (змінні, константи, функції, процедури, тощо). Ім'я:
1. повинно починатися з літери;
2. не повинно містити пропусків і символів пунктуації (виняток - символ підкреслення (_));
3. максимальна довжина - 255 символів;
4. повинне бути унікальним у поточній області видимості;
5.зарезервовані слова (підсвічуються синім кольором у вікні редактора коду і такі, як Y1, SIN, TAN, тощо) використовувати не можна.
При створенні програм VBA настійно рекомендується виконувати угоду про іменування - правила, за якими присвоюються імена об'єктів. Найчастіше використовується:
1.Ім'я змінної має починатися з префіксу, записаного малими літерами. Префікс указує, що саме буде зберігатися у цій змінній:
· str (или s) – string, символьне значення;
· fn (или f) – функція;
· sub – процедура;
· с (або усі букви імені заглавні) – константа;
|
· b – Boolean, логічне значення (True або False);
· d – дата;
· obj (или о) – посилання на об'єкт;
· n – числове значення;
|
2.Імена функцій, методів і кожна змістовна частина у складеному слові має починатися із заглавної букви:
MsgBox objMyDocument.Name
Sub CheckDateSub( )
Третя частина нашого оголошення (AS integer) - це указівка на тип даних змінної. Тип даних визначає, дані якого виду можна буде зберігати у цій змінній. У VBA передбачені такі типи даних:
1. Числові:
• Byte - ціле число від 0 до 255;
• Integer - ціле число від -32 768 до 32 767;
• Long - велике ціле число від -2 147 483 648 до 2 147 483 647;
• Currency-велику десяткове число з 19 позиціями, включаючи 4 позиції після коми;
• Decimal - ще більше десяткове число з 29 позиціями (після коми можна використовувати від 0 до 28 позицій);
• Single і Double - значення з плаваючою комою (Double займає в 2 рази більше пам'яті, при цьому майже удвічі вище точність і у 10 ± 200 діапазон);
Увага: Спроба оголосити змінну із типом Decimal (наприклад, Dim n As Decimal) приведе до - Синтаксична помилка. Щоб отримати можливість працювати із типом Decimal, змінну потрібно спочатку оголосити як Variant або взагалі оголосити без типу (Dim n), оскільки тип даних Variant VBA використовується за умовчанням. Якщо ми призначимо змінній типу Variant числове значення, для якого підходить тільки Decimal, VBA автоматично призначить їй цей тип даних. Крім того, можна явно указати підтип Decimal для змінної типу variant за допомогою функції CDec().
2. Символьні (рядкові – String): змінної довжини (приблизно до 2 млрд символів), фіксованої довжини (приблизно до 65 400 символів));
3. Дата і час (Date - від 01.01.100 до 31.12.9999);
4. Логічний (Boolean - може зберігати лише значення True та False);
5. Об'єктний (Object - зберігає посилання на будь-який об'єкт в пам'яті);
6. variant - спеціальний тип даних, який може зберігати будь-які типи даних.
Можна також використовувати користувацькі типи даних, але їх спочатку потрібно визначити за допомогою виразу type. Зазвичай користувацькі типи даних використовуються як додатковий засіб перевірки уведення користувачем значень (приклад - поштовий індекс).
Наведемо деякі моменти, пов'язані з вибором типів даних для змінних:
• загальний принцип - обирайте найменший тип даних, який може вмістити обрані вами значення. Якщо є якісь сумніви - вибирайте більший тип щоб уникнути виникнення помилок;
• якщо є можливість, краще не використовувати типи даних із плаваючою комою (Single і Double). Робота з ними відбувається повільніше, крім того, можуть бути проблеми при порівнянні за рахунок округлення;
При оголошенні змінної можна не указувати її тип. Наприклад, наше оголошення може виглядати так:
Dim nVarl
У цьому випадку змінна автоматично буде оголошена із типом variant. В принципі, у VBA можна працювати й без оголошення змінних. Наприклад, такий код
nVarl = nVarl + 1
MsgBox nVarl
буде цілком працездатним. Якщо ми використовуємо змінну в програмі без її оголошення, то автоматично буде створена нова змінна типу variant.
Однак оголошувати змінні потрібно обов'язково! І при цьому бажано явно указувати потрібний тип даних. Тому що:
1. скорочується кількість помилок: програма із самого початку відмовиться приймати у змінну значення неправильного типу (наприклад, рядкові замість числового);
2. при роботі з об'єктами підказка за властивостями і методами діє тільки тоді, коли ми спочатку оголосили об'єктну змінну з потрібним типом. Наприклад, в Excel два варіанти коду будуть працювати однаково:
• перший варіант:
Dim oWbk As Workbook
Set oWbk = Workbooks.Add
• другий варіант:
Set oWbk = Workbooks.Add
Але підказка за властивостями і методами об'єкта oWbk буде працювати тільки в першому випадку.
Усі досвідчені розробники взагалі забороняють використовувати змінні без явного їх оголошення. Для цього можна скористатися спеціальною командою компілятора (вона міститься тільки у розділ оголошень модуля): Option Explicit, а можна вставляти цю команду в усі модулі при їх створенні автоматично, встановивши у вікні Options прапорець Require Variable Declarations (меню Tools | Options, вкладка Editor) . Проілюструвати, навіщо вони це роблять, можна на простому прикладі:
Dim n
n = n + 1: MsgBox п
З першого погляду код не повинен викликати жодних проблем і має просто виводити у вікні повідомлення одиницю. Насправді він виведе пусте вікно повідомлення. Причина захована підступно: в третьому рядку п - це зовсім не англійська буква N, а російська П. На вигляд у вікні редактора коду відрізнити їх дуже складно. У той же час компілятор VBA, зустрівши такий код, просто створить нову змінну з типом даних VARIANT, у якій буде пусте значення. На виявлення такої помилки може знадобитися певний час. У той же час при встановленому Option Explicit проблема визначається миттєво. Можна оголосити кілька змінних в одному рядку, наприклад, так:
Dim nVarl As Integer, s1_ As String
Присвоєння значень змінним виглядає так:
nVarl = 30
Якщо потрібно збільшити вже існуюче значення змінної, то команда може виглядати так:
nVarl = nVarl + 1
В обох прикладах знак рівності означає не "дорівнює", а "присвоїти". При присвоєнні значень змінним потрібно пам'ятати про наступне:
1. рядкові значення завжди укладаються в подвійні лапки:
sVarl = "Hello"
2. значення дата / час укладається в символи "решітка" (#):
dVarl = # 05/06/2004 #
Зверніть увагу, що при присвоєнні значення дати/часу таким "явним" способом нам доводиться використовувати прийняті у США стандарти: 05 в даному випадку - це місяць, 06 - день. А відображення цього значення (наприклад, у вікні повідомлення) буде залежати від регіональних налаштувань на комп'ютері користувача;
3. якщо потрібно передати шістнадцяткове значення, то перед ним ставляться символи (&H):
nVarl = &HFFOO
4. Для передачі восьмерічного значення потрібно використовувати набір символів (&O).
У змінних до присвоєння їм значень користувачем міститься:
1. у змінних усіх числових типів даних - 0;
2. у символьних змінних змінної довжини - "" (рядок нульової довжини);
3. у символьних змінних фіксованої довжини - рядок заданої довжини із символами ASCII 0 (ці символи на екран не виводяться);
4. у Variant - спеціальне порожнє значення Empty. Провести перевірку на це значення (тобто чи було присвоєно значення змінної чи ні) можна за допомогою функції IsEmpty();
5. в Object - нічого (немає посилання на жоден з об'єктів).
Завдання для самостійної роботи.
Завдання 1
1. Створіть новий документ Word (Табл.1) і збережіть його як, наприклад, D: СередБал.doc. Уведіть у комірки С2, D2 і E2 цієї таблиці оцінки.
Табл.1
Результати зимової екзаменаційної сесії 2007-2008 навчального року
№ п/п
|
Прізвище І.Б.
|
Інформатика
|
Вища математика
|
Політологія
|
Середній бал
|
25.
|
Кулина Ю.В.
|
5
|
4
|
5
|
|
2. Відкрийте редактор Visual Basic у Word і створіть у своєму проекті новий стандартний модуль.
3. Уведіть у створеному Вами стандартному модулі наступний код:
Public Sub СередняОцінкаToWord()
With Selection.Tables(1)
Selection.InsertFormula Formula:="= (c3+d3+e3)/3", NumberFormat:="0,00"
End sub
4. Відлагодьте код (програму): Debug►Compile.
5. У вікні Word сфокусуйтеся на комірці F3. Виконайте макрос (Alt+F8, тощо) СередняОцінкаToWord і оцініть отримане значення „Середній бал”.
Завдання 2
1. Створіть нову книгу Excel, збережіть її, наприклад, D:LabVariablesOperators.xls. Уведіть у комірки Al, A2 і A3 цієї книги будь-які значення.
2. Відкрийте редактор Visual Basic і створіть у своєму проекті новий стандартний модуль.
3. За допомогою меню Tools►References додайте у ваш проект посилання на бібліотеку Microsoft Word (10.0/11.0/12.0) Object Library (Рис.1):