Программирование на VBA в Access
VBA является интерпретируемым языком, то есть его инструкции интерпретируются каждый раз при выполнении программы. Этот язык является общим для всех приложений MS Office; на нем можно с равным успехом писать VBA является интерпретируемым языком, то есть его инструкции интерпретируются каждый раз при выполнении программы. Этот язык является общим для всех и не могут содержать приложений MS Office; на нем можно с равным успехом писать программы как для Access, так и для Word либо Excel. Вначале давайте кратко рассмотрим синтаксис языка VBA.
Объявление переменных.Переменные в Access можно объявлять явно и неявно. Имена переменных должны начинаться с буквы пробелов или других знаков пунктуации, кроме знака подчеркивания. Также нельзя использовать зарезервированные слова. Число символов в имени не должно превышать 225. При неявном задании переменной ей автоматически присваивается универсальный тип Variant. Переменная такого типа может принимать любые значения (этот тип по умолчанию имеют все данные, непосредственно полученные из таблиц и запросов) и дополнительно пустое значение Null. Проверить, содержит ли переменная какое-либо значение, можно с помощью функции IsNull().
Переменные определенных типов можно задавать либо с помощью суффиксов (определенного символа, записываемого сразу после имени переменной), либо с помощью явного объявления типа. Имеются следующие типы данных:
Byte | Currency @ |
Integer % | String $ |
Long & | Date |
Single ! | Boolean |
Double # | Variant |
Для явного описания переменной используется оператор 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
Нумерация элементов массива начинается с 0, поэтому для первого примера будет зарезервирована память для массива, состоящего из 21 элемента, для второго – 6 на 6. При объявлении массива можно определять не только верхнюю границу массива, но и нижнюю. Например, Dim my Array(1 то 20) As String.
В VBA допускается использование динамических массивов. Для этого при описании переменной число элементов массива опускается, а затем применяется инструкция ReDim для объявления реального размера массива. При этом все элементы массива обнуляются. Для сохранения значений элементов массива применяется инструкция Preserve.
Dim dynArray( ) As Double
ReDim Preserve dynArray (5, 2, 4)
Во время выполнения программы нижнюю и верхнюю границы массива можно определить с помощью функций LBound() и UBound() соответственно. Удалить массив из памяти можно с помощью оператора Erase.
Константы в VBA описываются с помощью ключевого слова Const. Вместе с объявлением константы также необходимо произвести ее инициализацию.
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.
Type tPhone
number As String*15
type As String*10
End Type
Обращение к полю пользовательского типа производится через операцию “.”.
Dim tel As tPhone
tel.number = 3334455
tel.type = "Мобильный".
Заполнить объектные переменные, содержащие много свойств, а также переменные пользовательского типа данных можно с помощью инструкции With … End With.
Dim myForm As Form
Set myForm = Forms![Имя формы]
With myForm
.Top=1000
.Left=1000
.Width=5000
. Height=4000
End With.
Создание комментариев.Любой текст, следующий за символом ‘, воспринимается как комментарий.
Процедуры и функции.Основными компонентами программ на VBA являются процедуры и функции. Они представляют собой фрагменты программного кода, заключенные между операторами Sub и End Sub или между Function и End Function. В общем случае процедуры и функции записываются следующим образом:
Sub <имя процедуры< [(<аргументы>)]
<операторы>
End Sub
Function <имя функции> [(<аргументы>)] As <тип возвращаемого значения>
<операторы>
<имя функции> = <возвращаемое значение>
End Function
Список аргументов разделяется запятыми. Функция отличается от процедуры тем, что ее имя выступает также в качестве переменной и используется для возвращения значения в точку вызова функции. Для вызова процедуры из другой процедуры или функции используется инструкция Call. Вначале идет имя процедуры, а затем в скобках список фактических значений ее аргументов. Процедуры можно также вызывать просто по их имени без использования инструкции Call. В этом случае список аргументов не заключается в скобки. Функции вызываются так же, как и процедуры, но гораздо чаще они вызываются по их имени с заключенным в скобки списком фактических значений аргументов в правой части оператора присваивания. Например:
Call mySub("Ландера", 4, i+1)
mySub "Ландера", 4, i+1
total_price = myFunc([Цена]*[Количество], [Доставка])
Допускается два различных способа передачи переменных процедуре или функции: по ссылке или по значению. По умолчанию переменные передаются по ссылке (объявление ByRef). При изменении значения переменной внутри процедуры это изменение остается и при выходе из этой процедуры. Переменные можно передавать и по значению. Тогда изменение значения такой переменной не будет воздействовать на значение переменной, переданной в процедуру или функцию. Для этого используют объявление ByVal. В общем виде объявление аргументов производится следующим образом BуVal/ByRef <имя аргумента> [( )] [As <тun>]. Например:
Sub mySyb(srteet As String, ByVal building As Integer, ByRef apt As Byte)
Forms![Клиенты]![Адресс] = srteet & " " & building & ", " & apt
End Sub
Function myFunc(full_price As Currency, shipment As Single) As Currency
myFunc = full_price * 1.2 + shipment
End Function
Для принудительного выхода из процедуры и функции используются соответственно Exit Sub и Exit Function.
Управление выполнением программы.Управление выполнением программы достигается за счет оператора безусловного перехода, операторов ветвления (условных операторов) и циклов. Условные операторы выполняют группу команд в зависимости от условия. К ним относится оператор If и Select Case. В простейшем виде оператор If можно записать в одну строку.
If <условие> Then <оператор>
Более сложный вариант использования оператора If приведен ниже:
If <условие> Then
<операторы>
Else
<операторы>
End If
Для задания выбора действий на основе проверки целой группы условий используется расширенный вариант записи оператора If.
If <условие> Then
<операторы>
Else If <условие 2> Then
<операторы>
Else
<операторы>
End If
Если выбор действий зависит от различных значений одного и того же выражения, то вместо вложенного оператора If предпочтительнее использовать оператор Select Case … End Select. Этот оператор определяет, является ли выражение истинным, а также оценивает, заключены ли в определенных пределах значения этого выражения.
Select Case <имя переменной>
Case <выражение 1> [ , <выражение 2>, …]
(операторы, выполняемые, если значения переменной удовлетворяют или выражение 1, или выражение 2, или …)
[Case <выражение 3> To <выражение 4>]
(операторы, выполняемые, если значение переменной находится в диапазоне, определяемом выражениями 3 и 4)
[Case Is <выражение отношения>]
(операторы, выполняемые, если значение переменной удовлетворяет выражению отношения.)
[Case Else]
(операторы, выполняемые, если не было выполнено ни одно из вышеперечисленных условий)
End Select
Любой строке в программе на VBA можно присвоить метку Метка:. Перейти на эту строку программы можно с помощью оператора безусловного перехода GoTo <метка>. Однако операторы GoTo нарушают стиль структурного программирования, и они применяются только для обработки ошибок в приложении.
Операторы цикла в VBA различаются на две основные группы: циклы с перечислением (For … Next) и циклы с условием (Do … Loop).
Оператор For…Next повторяет тело цикла заданное число раз.
For <счетчик> = <начальное значение> To <конечное значение> [Step <приращение>]
<операторы>
Next <счетчик>
Для выхода из цикла используется оператор Exit For.
Операторы циклов Do While … Loop, While … Wend являются синонимами. While … Wend оставлен для совместимости со старыми версиями. Эти операторы повторяют тело цикла, пока условие принимает значение True.
Do While <условие [=True]>
<операторы>
Loop
Оператор Do Until … Loop выполняет тело цикла до тех пор, пока не будет выполнено условие
Do Until <условие [< > True]>
<операторы>
Loop
Чтобы обеспечить выполнение операторов тела цикла по крайней мере один раз, можно использовать следующие варианты этих циклов.
Do
<операторы>
Loop While <условие [=True]>
или
Do
<операторы>
Loop Until <условие [=False]>
Для выхода из этих циклов используется оператор Exit Do.
Для построения цикла по всем элементам массива или коллекции используется инструкция For Each
For Each <элемент> In <коллекция>
<операторы>
Next <элемент>
где <элемент> – это переменная, используемая для ссылки на элементы семейства объектов. Следующий пример заполнит выпадающий список элемента управления ПолеСоСписком1 названиями всех элементов управления, расположенных в форме
Dim ctrl As Control
For Each ctrl In Form
ПолеСоСписком1.AddItem ctrl.Name
Next ctrl
Дата добавления: 2016-10-26; просмотров: 4400;