Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_ЭИ / эи_ч2.doc
Скачиваний:
98
Добавлен:
13.04.2015
Размер:
2.99 Mб
Скачать

5.2.2. Модули как объекты ms Access

Код VBA в приложении Access содержится в модулях. Модули являются объектами Access, такими же, как таблицы, запросы, формы, отчеты, страницы и макросы, о чем свидетельствует ярлык на панели объектов в окне База данных (Database). Ос­новное содержание модулей – это процедуры на языке VBA. Существуют два типа модулей: стандартные модули и модули класса.

Стандартные модули содержат общие процедуры, которые не связаны с конкретным объектом: формой или отчетом.

Вторым типом модуля в Access является модуль класса. Модуль класса отличается от стандартного модуля тем, что, кроме процедур, он содержит описание объекта и используется для создания объектов. Процедуры, определенные в этом модуле, являются методами и свойствами объекта. Примерами модулей класса являются модули форм и отчетов.

Модули форм и отчетов связаны с конкретной формой или отчетом и содержат процедуры обработки событий для этой формы или отчета. Модуль формы не создается сразу при создании новой формы. Он создается и связывается с формой, как только вы попытаетесь создать первую процедуру обработки событий для этой формы или одного из элементов управления формы или же нажмете кнопку Программа (Code) в окне Конструктора формы.

5.2.3. Среда программирования ms Access

Среда программирования в Access включает все средства, необходимые для написания программ отладки процедур VBA. Самым главным компонентом этой среды является редактор кода Visual Basic Editor (VBE), обладающий богатыми возможностями для облегчения процесса ввода программного кода. Кроме того, среда программирования содержит еще массу диалоговых окон, в которых отображается дополнительная информация, требующаяся как в процессе создания, так и в процессе отладки кода.

Процедуры и функции, их вызов и передача параметров

Основными компонентами программы на VBA являются процедуры и функции. Они представляют собой фрагменты программного кода, заключенные между оператора­ми Sub и End Sub или между операторами Function и End Function.

Sub <имяПроцедуры> (<аргумент1>, <аргумент2>, ... )

<oпepaторVisualBasicl>

<oператорVisualBasic2>

End Sub

Функция отличается от процедуры тем, что ее имя выступает также в качестве пере­менной и используется для возвращения значения в точку вызова функции.

Function <имяФункции> (<аргумент1>, <аргумент2>, ... )

<операторVisualBasicl>

<операторVisualBasic2>

<имяФункции> = <возвращаемое3начение>

End Function

Для того чтобы использовать процедуру или функцию, необходи­мо вызвать ее. Процедуру с непустым списком аргументов можно вызвать только из другой процедуры или функции, использовав ее имя со списком фактических значений аргументов в каче­стве одного из операторов 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 задает передачу по ссылке, a ByVal — по значению. Если же явное указание способа передачи параметра отсутствует, то по умолчанию подразу­мевается передача по ссылке.

Поясним сказанное на примере. Пусть имеются следующие описания двух процедур:

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)

End Sub

Вспомогательная процедура 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:

Const maxLen% =30

Как и переменные, константы могут содержать значения различных типов данных, но при этом они не меняют своих значений во время выполнения программы.

Типы данных, используемые в VBA, можно найти в справке Access.

Ссылки на объекты. Кроме обычных переменных, в Visual Basic часто встречаются переменные, пред­ставляющие собой ссылку на объект.

Применение переменной-объекта отличается от использования обычных перемен­ных: нужно не только объявить такую переменную, но и назначить ей соответст­вующий объект с помощью специального оператора set. Вот синтаксис этого объ­явления и назначения:

Dim <имяПеременной> As Object

Set <имяПеременной> = <ссылкаНаОбъект>

Иногда при объявлении такой переменной удобно заранее указать конкретный тип объекта — можно использовать любой конкретный объект из объектной модели Of­fice. Приведем пример упомянутого объявления и назначения:

Dim MyBase As Database

Set MyBase = CurrentDb()

Массивы. Массив это переменная, в которой хранится одновременно несколько значений одинакового типа. Формальное определение массива таково: он представляет собой совокупность однотипных индексированных переменных.

Прежде чем использовать массив, нужно обязательно объявить его с помощью оператора Dim и указать при этом тип хранящихся в массиве значений. Все значения в массиве обязаны принадлежать к одному типу данных. Вот синтаксис оператора объявления массива:

Dim <имяМассива> (<размер1>, <размер2>, ...) As <типДанных>

где указанные в скобках величины <размер1>, <размер2> и т. д. задают размеры массива — количество индексов и максимально допустимое значение для каждого конкретного индекса. При этом индексирование элементов массива по умолчанию начинается с нуля. Так, объявление

Dim Arrayl (9) As Integer

определяет одномерный массив из 10 элементов, являющихся переменными целого типа, а объявление

Dim Array2 (4, 9) As Variant

определяет двумерный массив из пятидесяти (5х10) элементов, являющихся пере­менными универсального типа Variant.

Управляющие конструкции. Как и во всех других языках программирования, в VBA имеются различные управ­ляющие конструкции, позволяющие изменять порядок выполнения программы.

Ветвления

Управляющие конструкции ветвления позволяют проверить некоторое условие и, в зависимости от результатов этой проверки, выполнить ту или иную группу операторов. Для организации ветвлений в VBA используются различные формы оператора ветвления if и оператор выбора Select Case.

Простейшая, краткая форма оператора if используется для проверки одного условия, а затем либо выполнения, либо пропуска одного оператора или блока из нескольких операторов. Краткая форма оператора ветвления if может иметь как однострочную, так и блочную форму. В одну строку краткая форма if может быть записана так:

If <условие> Then <оператор>

В блочной форме краткое ветвление выглядит следующим образом:

If <условие> Then

<оператор1>

<оператор2>

End If

В качестве условия можно использовать логическое выражение, возвращающее зна­чение True или False, или любое арифметическое выражение. Если применяется арифметическое выражение, то нулевое значение этого выражения эквивалентно логическому значению False, а любое ненулевое выражение эквивалентно True. В том случае, когда условие возвращает значение False, оператор или блок операторов, заключенных между ключевыми словами Then и End If и составляющих тело краткого оператора ветвления, не будет выполняться.

Полная форма оператора if используется в тех случаях, когда имеются два различ­ных блока операторов и по результатам проверки условия нужно выполнить один из них. Такая форма If не может записываться в одну строку и всегда имеет блочную форму записи:

If <условие> Then

<блок0ператоров1>

Else

<блок0ператоров2>

End If

Если условие истинно, выполняется первый блок операторов, заключенный между ключевыми словами Then и Else, а в противном случае – второй блок, заключен­ный между ключевыми словами Else и End If.

Оператор вы­бора Select Case, имеющий следующий синтаксис:

Select Case <проверяемоеВыражение>

Case <список_значений1>

<блок_операторов1>

Case <список_значений2>

<блок_операторов2>

Case <список3начений3>

<блок_операторов3>

Case Else

<блок_операторовЕ1sе>

End Select

Проверяемое выражение вычисляется в начале работы оператора Select Case. Это выражение может возвращать значение любого типа, например логическое, числовое или строковое.

Список значений представляет собой одно или несколько выражений, разделенных запятой. При выполнении оператора проверяется, соответствует ли хотя бы один из элементов этого списка проверяемому выражению.

Эти элементы списка выражений могут иметь одну из следующих форм:

  • <выражение>

в данном случае проверяется, совпадает ли значение проверяемого выражения с этим выражением;

  • <выражение1> То <выражение2>

в этом случае проверяется, находится ли значение проверяемого выражения в указанном диапазоне значений;

  • Is <логический0ператор> <выражение>

в третьем случае проверяемое выражение сравнивается с указанным значением с помощью заданного логического оператора; например, условие is >= 10 счита­ется выполненным, если проверяемое значение не меньше 10.

Если хотя бы один из элементов списка соответствует проверяемому выражению, то выполняется соответствующая группа операторов и на этом выполнение оператора Select Case заканчивается, а остальные списки выражений не проверяются, т. е. отыскивается только первый подходящий элемент списков выражений. Если же ни один из элементов всех этих списков не соответствует значению проверяемого вы­ражения, выполняются операторы группы Else, если таковая присутствует.

Циклы

В VBA имеется следующие средства организации циклов, которые можно разделить на две основные группы — циклы с условием Do... Loop и циклы с перечислением For...Next.

Циклы типа Do... Loop используются в тех случаях, когда заранее неизвестно, сколько раз должно быть повторено выполнение блока операторов, составляющего тело цикла. Такой цикл продолжает свою работу до тех пор, пока не будет выполне­но определенное условие. Существуют четыре вида циклов Do... Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки.

DoWhile<условие>

<блокОператоров>

Loop

Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, пока это условие выполняется.

Do

<блокОператоров>

LoopWhile<условие>

Условие проверяется после того, как операторы, образующих тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, пока это условие остается истинным.

DoUntil<условие>

<блокОператоров>

Loop

Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным.

Do

<блокОператоров>

LoopUntil<условие>

Условие проверяется после того, как операторы, образующих тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным.

Имеется также две разновидности оператора цикла с перечислением For.. . Next. Очень часто при обработке массивов, а также в тех случаях, когда требуется повто­рить выполнение некоторой группы операторов заданное число раз, используется цикл For.. . Next со счетчиком. В отличие от циклов Do... Loop, данный тип цик­ла использует специальную переменную, называемую счетчиком, значение которой увеличивается или уменьшается при каждом выполнении тела цикла на определен­ную величину. Когда значение этой переменной достигает заданного значения, вы­полнение цикла заканчивается.

Синтаксис этого вида цикла выглядит следующим образом (в квадратные скобки заключены необязательные элементы синтаксической конструкции):

For <счетчик> = <начальное3начение> То <конечное3начение>

[Step <приращение>]

<блок0ператоров>

Next [<счетчик>]

Несколько пояснений к приведенному описанию:

  • <приращение> — может быть как положительным, так и отрицательным числом. Если использовать отрицательное приращение, то конечное значение должно быть меньше либо равно начальному значению для того, чтобы тело цикла вы­полнилось хотя бы один раз;

  • после завершения работы цикла For. .. Next переменная, которая использова­лась в качестве счетчика, получает значение, обязательно превосходящее конеч­ное значение в том случае, если приращение положительно, и строго меньшее конечного значения, если приращение отрицательно;

  • если начальное и конечное значения совпадают, тело цикла выполняется лишь один раз.

Рассмотрим еще одну разновидность цикла For... Next, часто использующуюся в VBA при обработке объектов, составляющих массив или семейство однородных объектов. В этой разновидности цикла счетчик отсутствует, а тело цикла выполняется для каждого элемента массива или семейства объектов. Вот синтаксис такого цикла:

For Each <элемент> In <совокупность>

<блок0ператоров>

Next [<элемент>]

где:

<элемент> — это переменная, используемая для ссылки на элементы семейства объектов;

<совокупность> это имя массива или семейства.

Соседние файлы в папке пособие_ЭИ