Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
57
Добавлен:
13.04.2015
Размер:
768.51 Кб
Скачать

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<имяПеременной> =<ссылкаНаОбъект>

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

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[<элемент>]

где:

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

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

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