- •Содержательный модуль 5. Microsoft Access: программное средство работы с базами и хранилищами данных; основы офисного программирования
- •5.1. Системы управления базами данных
- •5.1.1. Эволюция концепции базы данных
- •5.1.2. Ms Access – настольная субд реляционного типа
- •5.2. Программирование в ms Access
- •5.2.1. Объектные модели ms Access 2002
- •5.2.2. Модули как объекты ms Access
- •5.2.3. Среда программирования ms Access
- •Лабораторные работы Лабораторная работа № 5.1 Базы данных в Internet
- •Лабораторная работа №5.2 Основы работы с таблицами
- •Лабораторная работа № 5.3 Ввод и редактирование данных. Отбор данных
- •2. Задания
- •Лабораторная работа №5.4 Формирование отчетов. Создание диаграмм
- •Лабораторная работа № 5.5 Работа с макросами
- •1. Методические указания
- •2. Задания
- •Виды самостоятельной работы
- •Контрольная работа № 5.1
- •Тесты для самоконтроля
- •Рекомендуемые источники
5.2.2. Модули как объекты ms Access
Код VBAв приложенииAccessсодержится в модулях. Модули являются объектамиAccess, такими же, как таблицы, запросы, формы, отчеты, страницы и макросы, о чем свидетельствует ярлык на панели объектов в окне База данных(Database). Основное содержание модулей –это процедуры на языке VBA.Существуют два типа модулей: стандартные модули и модули класса.
Стандартные модули содержат общие процедуры, которые не связаны с конкретным объектом: формой или отчетом.
Вторым типом модуля в Accessявляетсямодуль класса.Модуль класса отличается от стандартного модуля тем, что, кроме процедур, он содержит описание объекта и используется для создания объектов. Процедуры, определенные в этом модуле, являются методами и свойствами объекта. Примерами модулей класса являются модули форм и отчетов.
Модули форм и отчетов связаны с конкретной формой или отчетом и содержат процедуры обработки событий для этой формы или отчета. Модуль формы не создается сразу при создании новой формы. Он создается и связывается с формой, как только вы попытаетесь создать первую процедуру обработки событий для этой формы или одного из элементов управления формы или же нажмете кнопку Программа (Code) в окне Конструктора формы.
5.2.3. Среда программирования ms Access
Среда программирования в Access включает все средства, необходимые для написания программ отладки процедур VBA.Самым главным компонентом этой среды является редактор кодаVisualBasicEditor(VBE), обладающий богатыми возможностями для облегчения процесса ввода программного кода. Кроме того, среда программирования содержит еще массу диалоговых окон, в которых отображается дополнительная информация, требующаяся как в процессе создания, так и в процессе отладки кода.
Процедуры и функции, их вызов и передача параметров
Основными компонентами программы на VBAявляютсяпроцедурыифункции.Они представляют собой фрагменты программного кода, заключенные между операторамиSubиEndSubили между операторамиFunctionиEndFunction.
Sub<имяПроцедуры> (<аргумент1>, <аргумент2>, ... )
<oпepaторVisualBasicl>
<oператорVisualBasic2>
…
EndSub
Функция отличается от процедуры тем, что ее имя выступает также в качестве переменной и используется для возвращения значения в точку вызова функции.
Function<имяФункции> (<аргумент1>, <аргумент2>, ... )
<операторVisualBasicl>
<операторVisualBasic2>
…
<имяФункции> =<возвращаемое3начение>
EndFunction
Для того чтобы использовать процедуру или функцию, необходимо вызватьее. Процедуру с непустым списком аргументов можно вызвать только из другой процедуры или функции, использовав ее имя со списком фактических значений аргументов в качестве одного из операторов VBA.Функцию же можно вызвать не только с помощью отдельного оператора VBA,но и поместив ее имя со списком фактических значений аргументов прямо в формулу или выражение в программе на VBAили, например, прямо в формулу в вычисляемых полях запросов, форм и отчетовAccess. Процедура с пустым списком аргументов (так называемый командный макрос) может быть вызвана не только из другой процедуры или функции, но и с помощью комбинации клавиш быстрого вызова, команд раскрывающихся меню или кнопок панелей инструментов. Можно также связать такую процедуру с выполнением самых различных событий: например, с открытием формы или отчета, со щелчком мышью по кнопке в форме, с воздействием на элементы управления форм, в частности элементы управленияActiveX. Такие процедуры называютпроцедурами обработки событий.
Если вызываемая процедура имеет уникальное имя и находится в том же модуле, что и вызывающая процедура, то для ее вызова достаточно указать это имя и задать список фактических значений аргументов, не заключая его в скобки. Второй способ вызова процедуры состоит в использовании оператора Call. Сначала идет операторCall, затем имя процедуры и список параметров, в этом случае обязательно заключенный в скобки. Функцию можно вызывать точно так же, как и процедуру, но гораздо чаще используется другой, специфический способ вызова функций: использованием ее имени с заключенным в скобки списком параметров в правой части оператора присваивания.
Вот примеры вызова процедуры под именем CrossRCс передачей ей двух аргументов (константы и выражения):
CrossRC 7, i + 2
или
Call CrossRC(7, i + 2)
Пример вызова двух функций —LeftиMid, и использования возвращаемого ими значения в выражении:
yStr = Left(y, 1) & Mid(y, 2, 1)
Допускается два различных способа передачи переменных процедуре или функции: по ссылкеипо значению.Если переменная передается по ссылке, то это означает, что процедуре или функции будет передан адрес этой переменной в памяти. При этом происходит отождествление формального аргумента процедуры и переданного ей фактического параметра. Тем самым вызываемая процедура может изменить значение фактического параметра: если будет изменен формальный аргумент процедуры, то это скажется на значении переданного ей при вызове фактического параметра. Если же фактический параметр передается по значению, то формальный аргумент вызываемой процедуры или функции получает только значение фактического параметра, но не саму переменную, используемую в качестве этого параметра. Тем самым все изменения значения формального аргумента не сказываются на значении переменной, являющейся фактическим параметром.
Способ передачи параметров процедуре или функции указывается при описании ее аргументов: имени аргумента может предшествовать явный описатель способа передачи. Описатель ByRefзадает передачу по ссылке,aByVal— по значению. Если же явное указание способа передачи параметра отсутствует, то по умолчанию подразумевается передача по ссылке.
Поясним сказанное на примере. Пусть имеются следующие описания двух процедур:
Sub Main()
а = 10
b = 20
с = 30
Call Example1(a, b, с)
Call MsgBox(a)
Call MsgBox(b)
Call MsgBox(c)
End Sub
Sub Example1(x, ByVal y, ByRef z)
x = x + 1
y = y + 1
z = z + 1
Call MsgBox(x)
Call MsgBox(y)
Call MsgBox(z)
EndSub
Вспомогательная процедура Example1 использует в качестве формальных аргументов три переменные, описанные по-разному. Далее в теле этой процедуры каждый из них увеличивается на единицу, а затем их значения выводятся на экран с помощью функцииMsgBox. Основная процедураMainустанавливает значения переменныхa,bи с, а затем передает их в качестве (фактических) аргументов процедуреExample1. При этом первый аргумент передается по ссылке (действует умолчание), второй —по значению, а третий —снова по ссылке. После возврата из процедурыExample1 основная процедура также выводит на экран значения трех переменных, передававшихся в качестве аргументов. Всего на экран выводится шесть значений:
сначала это числа 11, 21и 31(все полученные значения увеличены на 1и выводятся процедуройExample1);
затем это числа 11, 20и 31(эти значения выводятся процедуройMain, причем переменные, переданные по ссылке, увеличились, а переменная, переданная по значению —нет).
Программа может состоять (и обычно состоит) из многих процедур и функций, которые могут располагаться в одном или нескольких модулях.Модули группируются впроекты,при этом в одном проекте могут мирно сосуществовать несколько различных программ, использующих общие модули или процедуры.
Каждая из процедур, находящихся в одном модуле, должна иметь уникальное имя, однако в проекте может содержаться несколько различных модулей. Обычно рекомендуется использовать только уникальные имена процедур в одном проекте, но допустимы и исключения. В том случае, если в проекте содержится несколько различных процедур с одним и тем же именем, необходимо для уточнения имени использовать при вызове процедуры следующий синтаксис:
<имяМодуля>.<имяПроцедуры>
Если при этом имя модуля состоит из нескольких слов, следует заключить это имя в квадратные скобки. Например, если модуль называется "Графические процедуры", а процедура —"Крестик", вызов может выглядеть следующим образом:
[Графические процедуры].Крестик
Допускается также использование процедур, расположенных и в других проектах. При этом может потребоваться еще один уровень уточнения имени:
<имяПроекта>.<имяМодуля>.<имяПроцедуры>
Переменные, константы и типы данных. В VBA для хранения временных значений, передачи параметров и проведения вычислений используются переменные.
Обычно перед тем, как использовать переменную, производится ее объявление для этого используется оператор Dim. Синтаксис этого оператора:
Dim<имяПеременной> [As<типДанных>]
Правила именования переменных. Имя не длиннее 255символов, оно должно начинаться с буквы, за которой могут следовать буквы, цифры или символ подчеркивания. Оно не должно содержать пробелов, знаков препинания или специальных символов, за исключением самого последнего знака. В конце к имени переменной может быть добавлен еще один специальных символов:!# $ % &@
Не допускается использование в качестве имен переменных ключевых слов VBAи имен стандартных объектов. Именно поэтому рекомендуется начинать имена переменных со строчной, а не с прописной буквы. Допускается использование в именах переменных букв не только латинского алфавита, но и кириллицы.
В VBAобъявление переменных не является обязательным.
Пример
Dim i As Integer, j As Integer
Dim x As Double
Для описания констант применяется оператор Const, схожий с оператором описания переменныхDim. Вот синтаксис этого оператора:
Const<имяКонстанты> [As<типДанных>] ==<выражение>,
где <выражение> —это любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы. Например, следующий оператор определяет целую константуmaxLen:
ConstmaxLen% =30
Как и переменные, константы могут содержать значения различных типов данных, но при этом они не меняют своих значений во время выполнения программы.
Типы данных, используемые в VBA, можно найти в справкеAccess.
Ссылки на объекты. Кроме обычных переменных, в Visual Basic часто встречаются переменные, представляющие собой ссылку на объект.
Применение переменной-объекта отличается от использования обычных переменных: нужно не только объявить такую переменную, но и назначить ей соответствующий объект с помощью специального оператора set. Вот синтаксис этого объявления и назначения:
Dim<имяПеременной>AsObject
Set<имяПеременной> =<ссылкаНаОбъект>
Иногда при объявлении такой переменной удобно заранее указать конкретный тип объекта —можно использовать любой конкретный объект из объектной моделиOffice. Приведем пример упомянутого объявления и назначения:
DimMyBaseAsDatabase
SetMyBase =CurrentDb()
Массивы. Массив – это переменная, в которой хранится одновременно несколько значений одинакового типа. Формальное определение массива таково: он представляет собой совокупность однотипных индексированных переменных.
Прежде чем использовать массив, нужно обязательно объявить его с помощью оператора Dimи указать при этом тип хранящихся в массиве значений. Все значения в массиве обязаны принадлежать к одному типу данных. Вот синтаксис оператора объявления массива:
Dim<имяМассива> (<размер1>, <размер2>, ...)As<типДанных>
где указанные в скобках величины <размер1>, <размер2> и т. д. задают размеры массива —количество индексов и максимально допустимое значение для каждого конкретного индекса. При этом индексирование элементов массива по умолчанию начинается с нуля. Так, объявление
DimArrayl (9)AsInteger
определяет одномерный массив из 10элементов, являющихся переменными целого типа, а объявление
Dim Array2 (4, 9) As Variant
определяет двумерный массив из пятидесяти (5х10)элементов, являющихся переменными универсального типаVariant.
Управляющие конструкции. Как и во всех других языках программирования, в VBA имеются различные управляющие конструкции, позволяющие изменять порядок выполнения программы.
Ветвления
Управляющие конструкции ветвления позволяют проверить некоторое условие и, в зависимости от результатов этой проверки, выполнить ту или иную группу операторов. Для организации ветвлений в VBAиспользуются различные формы оператора ветвленияifи оператор выбораSelectCase.
Простейшая, краткая форма оператора ifиспользуется для проверки одного условия, а затем либо выполнения, либо пропуска одного оператора или блока из нескольких операторов. Краткая форма оператора ветвленияifможет иметь как однострочную, так и блочную форму. В одну строку краткая формаifможет быть записана так:
If<условие>Then<оператор>
В блочной форме краткое ветвление выглядит следующим образом:
If<условие>Then
<оператор1>
<оператор2>
EndIf
В качестве условия можно использовать логическое выражение, возвращающее значение TrueилиFalse, или любое арифметическое выражение. Если применяется арифметическое выражение, то нулевое значение этого выражения эквивалентно логическому значениюFalse, а любое ненулевое выражение эквивалентноTrue. В том случае, когда условие возвращает значениеFalse, оператор или блок операторов, заключенных между ключевыми словамиThenиEndIfи составляющих тело краткого оператора ветвления, не будет выполняться.
Полная форма оператора ifиспользуется в тех случаях, когда имеются два различных блока операторов и по результатам проверки условия нужно выполнить один из них. Такая формаIfне может записываться в одну строку и всегда имеет блочную форму записи:
If<условие>Then
<блок0ператоров1>
Else
<блок0ператоров2>
EndIf
Если условие истинно, выполняется первый блок операторов, заключенный между ключевыми словами ThenиElse, а в противном случае –второй блок, заключенный между ключевыми словамиElseиEndIf.
Оператор выбора SelectCase, имеющий следующий синтаксис:
SelectCase<проверяемоеВыражение>
Case<список_значений1>
<блок_операторов1>
Case<список_значений2>
<блок_операторов2>
Case<список3начений3>
<блок_операторов3>
CaseElse
<блок_операторовЕ1sе>
EndSelect
Проверяемое выражение вычисляется в начале работы оператора SelectCase. Это выражение может возвращать значение любого типа, например логическое, числовое или строковое.
Список значений представляет собой одно или несколько выражений, разделенных запятой. При выполнении оператора проверяется, соответствует ли хотя бы один из элементов этого списка проверяемому выражению.
Эти элементы списка выражений могут иметь одну из следующих форм:
<выражение>
в данном случае проверяется, совпадает ли значение проверяемого выражения с этим выражением;
<выражение1> То <выражение2>
в этом случае проверяется, находится ли значение проверяемого выражения в указанном диапазоне значений;
Is<логический0ператор> <выражение>
в третьем случае проверяемое выражение сравнивается с указанным значением с помощью заданного логического оператора; например, условие is >= 10считается выполненным, если проверяемое значение не меньше 10.
Если хотя бы один из элементов списка соответствует проверяемому выражению, то выполняется соответствующая группа операторов и на этом выполнение оператора SelectCaseзаканчивается, а остальные списки выражений не проверяются, т. е. отыскивается только первый подходящий элемент списков выражений. Если же ни один из элементов всех этих списков не соответствует значению проверяемого выражения, выполняются операторы группыElse, если таковая присутствует.
Циклы
В VBAимеется следующие средства организации циклов, которые можно разделить на две основные группы —циклы с условиемDo...Loopициклы с перечислениемFor...Next.
Циклы типа Do...Loopиспользуются в тех случаях, когда заранее неизвестно, сколько раз должно быть повторено выполнение блока операторов, составляющего тело цикла. Такой цикл продолжает свою работу до тех пор, пока не будет выполнено определенное условие. Существуют четыре вида цикловDo...Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки.
Do While <условие> <блокОператоров> Loop |
Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, пока это условие выполняется. |
Do <блокОператоров> Loop While <условие> |
Условие проверяется после того, как операторы, образующих тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, пока это условие остается истинным. |
Do Until <условие> <блокОператоров> Loop |
Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным. |
Do <блокОператоров> Loop Until <условие> |
Условие проверяется после того, как операторы, образующих тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным. |
Имеется также две разновидности оператора цикла с перечислением For.. .Next. Очень часто при обработке массивов, а также в тех случаях, когда требуется повторить выполнение некоторой группы операторов заданное число раз, используется циклFor.. .Nextсо счетчиком. В отличие от цикловDo...Loop, данный тип цикла использует специальную переменную, называемуюсчетчиком,значение которой увеличивается или уменьшается при каждом выполнении тела цикла на определенную величину. Когда значение этой переменной достигает заданного значения, выполнение цикла заканчивается.
Синтаксис этого вида цикла выглядит следующим образом (в квадратные скобки заключены необязательные элементы синтаксической конструкции):
For<счетчик> =<начальное3начение> То <конечное3начение>
[Step<приращение>]
<блок0ператоров>
Next[<счетчик>]
Несколько пояснений к приведенному описанию:
<приращение> —может быть как положительным, так и отрицательным числом. Если использовать отрицательное приращение, то конечное значение должно быть меньше либо равно начальному значению для того, чтобы тело цикла выполнилось хотя бы один раз;
после завершения работы цикла For. ..Nextпеременная, которая использовалась в качестве счетчика, получает значение, обязательно превосходящее конечное значение в том случае, если приращение положительно, и строго меньшее конечного значения, если приращение отрицательно;
если начальное и конечное значения совпадают, тело цикла выполняется лишь один раз.
Рассмотрим еще одну разновидность цикла For...Next, часто использующуюся вVBAпри обработке объектов, составляющихмассивилисемействооднородных объектов. В этой разновидности цикла счетчик отсутствует, а тело цикла выполняется для каждого элемента массива или семейства объектов. Вот синтаксис такого цикла:
ForEach<элемент>In<совокупность>
<блок0ператоров>
Next[<элемент>]
где:
<элемент> —это переменная, используемая для ссылки на элементы семейства объектов;
<совокупность> — это имя массива или семейства.