VBA є інтерпретується мовою, тобто його інструкції інтерпретуються кожен раз при виконанні програми. Ця мова є загальним для всіх додатків MS Office; на ньому можна з рівним успіхом писати VBA є інтерпретується мовою, тобто його інструкції інтерпретуються кожен раз при виконанні програми. Ця мова є загальним для всіх і не можуть містити додатків MS Office; на ньому можна з рівним успіхом писати програми як для Access, так і для Word або Excel. Спочатку давайте коротко розглянемо синтаксис мови VBA.
Для явного опису змінної використовується оператор Dim.
Dim <имя переменной> As <тип переменной>.
Наприклад, Dim i As Integer, j As Integer Dim x As Double
Рядки можуть бути постійної і змінної довжини. оператор Dim <имя переменной> As String оголошує рядок змінної довжини, а оператор Dim <имя переменной> As String *<количество символов> - фіксованої довжини. наприклад:
Dim str1 As String Dim str2 As String * 20.
Можна ввести вимогу, щоб всі змінні були описані явно. Для цього в розділі описів модуля необхідно задати декларацію Option Explicit. Тоді Access буде автоматично виявляти помилки в написанні імен змінних і контролювати збіг типу змінної і призначаються їй значень.
Змінні мають певну область видимості. Існує чотири рівні видимості:
1. Локальний рівень або рівень процедури. Змінні існують тільки всередині процедури, де вони описані і використовуються;
2. Рівень форми (звіту). Змінні описуються в розділі описів модуля форми (звіту) і є доступними лише для процедур цієї форми (звіту) в той час, коли форма (звіт) відкрита;
3. Рівень модуля. Змінні описуються в розділі описів стандартного модуля і доступні для всіх процедур модуля при відкритій БД;
4. Глобальний рівень. Мінлива записується в розділі описів модуля за допомогою інструкцій Public або Global.
Якщо намагатися використовувати неявно задану змінну в той час, коли вона недоступна, то Access замість неї створить нову змінну з тим же ім'ям, що може привести до важко що виявляється логічним помилок. Це може слугувати додатковим приводом для явного завдання всіх змінних.
Всі змінні мають певний час життя. Для локальних змінних час життя визначається часом використання коду. Кожен раз при новому виклику процедури змінної приписується або Null. або 0, або порожній рядок в залежності від типу. Для створення змінних з часом життя, рівним часу життя додатки, використовується інструкція Static. Проте, статична змінна не може бути використана в інших процедурах. Змінюється лише час її життя, а не область видимості. Якщо станеться повторний виклик тій же самій процедури, в якій була описана статична змінна, то ця змінна збереже своє колишнє значення, яке вона мала в момент завершення роботи цієї процедури при попередньому виклику. Всі змінні в певній процедурі будуть статичними, якщо перед самою процедурою поставити інструкцію Static.
C допомогою ключового слова Dim також можна визначати багатовимірні масиви. Розмірність і число елементів масиву визначається всередині дужок після імені змінної. наприклад:
Dim myArray (20) As String * 10
Dim myArray (5, 5) As Double або Dim myArray (3, 3, 3) As Double
Dim dynArray () As Double
ReDim Preserve dynArray (5, 2, 4)
Під час виконання програми нижню і верхню межі масиву можна визначити за допомогою функцій LBound () і UBound () відповідно. Видалити масив з пам'яті можна за допомогою оператора Erase.
Const pi As Double = 3.1415
Крім змінних вищенаведених типів в VBA можна задавати об'єктні змінні, що застосовуються для зберігання посилань на об'єкти Access. Для кожної колекції основних об'єктів в Access є відповідний їй об'єктний тип, а також загальний тип Object, що приймають посилання на будь-які об'єкти. наприклад:
Dim myObject As Object - змінна будь-якого об'єктного типу,
Dim myControl As Control - змінна типу елемента керування,
Dim myForm As Form - змінна типу форми.
Привласнювати конкретні значення об'єктним змінним можна за допомогою інструкції Set.
Set myForm = Forms! [Моя Форма].
Користувач може також створювати свій тип даних на основі існуючих. Призначений для користувача тип даних вводиться між ключовими словами Type ... End Type.
number As String * 15
type As String * 10
Звернення до поля призначеного для користувача типу проводиться через операцію ".".
Dim tel As tPhone
Заповнити об'єктні змінні, що містять багато властивостей, а також змінні призначеного для користувача типу даних можна за допомогою інструкції With ... End With.
Dim myForm As Form
Set myForm = Forms! [Ім'я форми]
Процедури і функції. Основними компонентами програм на VBA є процедури і функції. Вони являють собою фрагменти програмного коду, укладені між операторами Sub і End Sub або між Function і End Function. У загальному випадку процедури і функції записуються в такий спосіб:
Sub <имя процедуры<[(<аргументы>)]
Function <имя функции> [(<аргументы>)] As <тип возвращаемого значения>
<имя функции> = <возвращаемое значение>
Список аргументів розділяється комами. Функція відрізняється від процедури тим, що її ім'я виступає також в якості змінної і використовується для повернення значення в точку виклику функції. Для виклику процедури з іншої процедури або функції використовується інструкція Call. Спочатку йде ім'я процедури, а потім в дужках список фактичних значень її аргументів. Процедури можна також викликати просто по їх імені без використання інструкції Call. В цьому випадку список аргументів полягає в дужки. Функції викликаються так само, як і процедури, але набагато частіше вони викликаються по їх імені до укладеного в дужки списком фактичних значень аргументів в правій частині оператора присвоювання. наприклад:
Call mySub ( "Ландера", 4, i + 1)
mySub "Ландера", 4, i + 1
total_price = myFunc ([Ціна] * [Кількість], [Доставка])
Sub mySyb (srteet As String, ByVal building As Integer, ByRef apt As Byte)
Function myFunc (full_price As Currency, shipment As Single) As Currency
myFunc = full_price * 1.2 + shipment
Для примусового виходу з процедури і функції використовуються відповідно Exit Sub і Exit Function.
Управління виконанням програми. Управління виконанням програми досягається за рахунок оператора безумовного переходу, операторів розгалуження (умовних операторів) і циклів. Умовні оператори виконують групу команд в залежності від умови. До них відноситься оператор If і Select Case. У найпростішому вигляді оператор If можна записати в один рядок.
If <условие> Then <оператор>
Більш складний варіант використання оператора If наведено нижче:
If <условие> Then
Для завдання вибору дій на основі перевірки цілої групи умов використовується розширений варіант запису оператора If.
If <условие> Then
Else If <условие 2> Then
Якщо вибір дій залежить від різних значень одного і того ж вирази, то замість вкладеного оператора If краще використовувати оператор Select Case ... End Select. Цей оператор визначає, чи є вираз істинним, а також оцінює, чи укладені в певних межах значення цього виразу.
Select Case <имя переменной>
Case <выражение 1> [. <выражение 2>, ...]
(Оператори, що виконуються, якщо значення змінної задовольняють або вираз 1, або вираз 2, або ...)
[Case <выражение 3> To <выражение 4>]
(Оператори, що виконуються, якщо значення змінної знаходиться в діапазоні, який визначається виразами 3 і 4)
[Case Is <выражение отношения>]
(Оператори, що виконуються, якщо значення змінної задовольняє висловом відносини.)
(Оператори, що виконуються, якщо не було виконано жодної з перерахованих вище умов)
Будь-рядку в програмі на VBA можна прикріпити мітку Метка. Перейти на цей рядок програми можна за допомогою оператора безумовного переходу GoTo <метка>. Однак оператори GoTo порушують стиль структурного програмування, і вони застосовуються тільки для обробки помилок в додатку.
Оператори циклу в VBA розрізняються на дві основні групи: цикли з перерахуванням (For ... Next) і цикли з умовою (Do ... Loop).
Оператор For ... Next повторює тіло циклу заданий число раз.
For <счетчик> = <начальное значение> To <конечное значение> [Step <приращение>]
Для виходу з циклу використовується оператор Exit For.
Оператори циклів Do While ... Loop, While ... Wend є синонімами. While ... Wend залишений для сумісності зі старими версіями. Ці оператори повторюють тіло циклу, поки умова приймає значення True.
Do While <условие [=True]>
Оператор Do Until ... Loop виконує тіло циклу до тих пір, поки не буде виконана умова
Do Until <условие [<> True]>
Щоб забезпечити виконання операторів тіла циклу принаймні один раз, можна використовувати наступні варіанти цих циклів.
Loop While <условие [=True]>
Loop Until <условие [=False]>
Для виходу з цих циклів використовується оператор Exit Do.
Для побудови циклу по всіх елементах масиву або колекції використовується інструкція For Each
For Each <элемент> In <коллекция>
де <элемент> - це змінна, яка використовується для посилання на елементи сімейства об'єктів. Наступний приклад заповнить випадає елемента управління ПолеСоСпіском1 назвами всіх елементів управління, розташованих у формі
Dim ctrl As Control
For Each ctrl In Form