Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие.doc
Скачиваний:
153
Добавлен:
02.05.2014
Размер:
1.63 Mб
Скачать

3.3.7. Процедуры vba

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

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

• процедуры, используемые в одной программе, могут использоваться для построения других программ, обычно с незначительными модификациями либо вообще без них.

В Visual Basic для приложений используется несколько типов процедур:

• процедуры Sub выполняют некоторое действие, не возвращая значение;

• процедуры Function выполняют некоторое действие и по результатам его возвращают значение;

• процедуры Property могут возвращать и присваивать значения и устанавливать ссылки на объекты.

Процедуры Sub. Процедура Sub — блок кода, который выполняется в ответ на событие или по вызову. Если код в модуле разбит на процедуры Sub, его намного проще сопровождать или отлаживать.

Синтаксис определения процедуры Sub:

[ Private | Public] [Static] Sub имя_процедуры (параметры)

Инструкции

End Sub

При каждом вызове процедуры выполняются инструкции между Sub и End Sub. Процедуры Sub могут быть помещены в стандартные модули, модули класса и модули формы и отчета.

Параметры процедуры подобны объявляемым переменным, которые передаются из вызы­вающей процедуры.

В VBA следует различать два типа процедур Sub — пользовательские процедуры и процедуры обработки событий.

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

Зачем нужно создавать пользовательские процедуры? Одна из причин в том, что несколько различных процедур обработки событий могут выполнять какое-либо аналогичное дейст­вие. Хорошим стилем программирования будет поместить такие общие инструкции в от­дельной процедуре и вызывать их из процедур событий. Это устраняет потребность в дублировании кода и упрощает сопровождение приложения.

Процедуры обработки событий. Когда объект Visual Basic распознает, что произошло событие, он автоматически вызывает встроенную процедуру, используя имя, соответствующее событию (эти события представ­лены в списке Процедура окна модуля). Так как имя устанавливает ассоциа­цию между объектом и кодом, можно сказать, что процедуры обработки событий присоединены к формам и элементам управления:

• имя процедуры обработки события для элемента управления строится из фактического имени элемента управления (специфицированного в свойстве Имя), символа подчеркивания (_) и имени события. Например, при щелчке командной кнопки, именован­ной Кнопка1, будет вызвана процедура события Кнопка1_Сlick();

• в имени процедуры обработки события для формы объединяется слово " Form" (для отчета — "Report"), символ подчеркивания и имя события. При щелчке на поле формы будет вызвана процедура Form_Click() (как и элементы управления, формы имеют уни­кальные имена, но в именах процедур обработки событий они не используются).

Для всех процедур обработки событий используется один общий синтаксис. Синтаксис для события элемента управления:

PrivateSubимя-элемента-управления_имя-события (параметры)

Инструкции

End Sub

Синтаксис для события формы:

Private Sub Form_имя-события (параметры)

Инструкции

End Sub

Хотя процедуры обработки событий можно написать с самого начала, проще использовать заготовки кода, обеспечиваемые Access; они автоматически включают правильные имена процедур. Шаблон процедуры события можно получить в окне редактора кода, выбрав объект из списка Объект, а затем процедуру из списка Процедура.

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

Процедуры Function. Visual Basic для приложений включает большое количество встроенных функций, выполня­ющих стандартные операции. Это, например, такие функции, как Sqr, Cos или Chr. Кроме того, инструкцией Function можно объявлять пользовательские процедуры Function.

Как и процедура Sub, Function является отдельной процедурой, которая может принимать параметры, выполнять ряд инструкций и изменять значения параметров. В отличие от процедуры Sub, процедура Function может возвращать в вызывающую процедуру некото­рое значение. Между процедурами Sub и Function имеется три различия:

• Обычно функция вызывается включением имени функции и ее параметров в правую часть инструкции или выражения:

возвращаемое значение = функция().

• подобно переменным, процедуры Function имеют типы данных. Тип данного функции определяет тип возвращаемого значения. (В отсутствие предложения As, тип функции — Variant);

• значение функции возвращается присвоением этого значения имени процедуры непос­редственно в теле функции. Когда процедура Function возвращает значение, это значе­ние может затем стать частью большего выражения.

Процедура Function вызывается так же, как и любая встроенная функция Visual Basic.

Создание новых процедур. Чтобы создать новую главную процедуру необходимо ввести заголовок процедуры в окне редактирования кода и нажать <Enter>. Заголовок процедуры предваряется ключевым словом Sub или Function. Например, можно ввести следующее:

Sub UpdateForm ()

или

Function SchetSumma () ' Можно даже без скобок

Access отвечает, завершая шаблон для новой процедуры (вводит скобки параметров и инструкцию End Sub или End Function).

Выбор существующих процедур. Для просмотра существующей пользовательской процедуры в текущем модуле, нужно в окне редактиро­вания кода выбрать Общая область из списка Объект и затем выбрать процедуру в окне Процедура.

Для просмотра процедуры обработки события, нужно выбрать соответствующий объект из списка Объект в окне редактирования кода и затем выбрать событие в окне Процедура.

Для просмотра процедуры в другом модуле необходимо:

1. Из меню Вид выбрать Просмотр объектов или нажать кнопку Просмотр объектов на панели инструментов.

2. В списке Проект/Библиотека окна Просмотр объектов выбрать проект.

3. Выбрать модуль из списка Классы и найти процедуру в списке Компоненты.

4. Дважды щелкнуть процедуру или выбрать Описания в контекстном меню окна Просмотр объектов или нажать кнопку Описания. Откроется окно нужного модуля.

Вызов процедур. Методы вызова процедур варьируются в зависимости от типа вызывающей процедуры и от того, как процедура используется в приложении.

В следующих разделах показано, как вызывать процедуры Sub и Function.

Вызов процедур Sub. Процедура Sub отличается от процедуры Function тем, что процедура Sub не может вызы­ваться вводом ее имени внутри выражения. Вызов Sub — автономная инструкция. Кроме того, в имени Sub не возвращается значение, как это имеет место для функции. Однако, подобно Function, Sub может изменять значения любой переданной ей переменной.

Вызвать процедуру Sub можно двумя способами:

' Обе следующие инструкции вызывают процедуру Sub Proc1

Call Proc1 (Argument1, Argument2)

Proc1 Argument1, Argument2

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

Если ключевое слово Call опущено, нужно также опустить круглые скобки вокруг пара­метров.

Вызов процедур Function. Обычно процедура Function, написанная программистом, вызывается аналогично встроен­ной функции Visual Basic, то есть с использованием ее имени в выражении:

' Все следующие инструкции вызовут функцию ToDec

Print 10 * ToDec

X = ToDec

If ToDec = 10 Then Debug.Print "Значение вне допустимого интервала"

X = Function1(10 * ToDec)

Можно также вызвать функцию аналогично процедуре Sub. Например, обе следующие инструкции вызывают функцию Year:

Call Year (Now)

Year Now

При вызове функции, таким образом, Visual Basic отбрасывает возвращаемое значение.

Вызов процедур других модулей. Процедуры Public в других модулях могут вызываться отовсюду в проекте. Возможно, потребуется специфицировать модуль, который содержит вызываемую процедуру. Это будет зависеть от того, в каком модуле размещена процедура: формы (отчета), класса или стандартном.

Процедуры в формах и отчетах. Все вызовы снаружи модуля формы должны указывать на модуль формы (или отчета), содержащий процедуру. Если, например, процедура, именованная Sub1, находится в моду­ле отчета Счет, то вызвать процедуру из этого модуля можно, используя такую инструкцию:

Call Report_Счет.Subl (параметры)

Процедуры в модулях классов. Как и при вызове процедуры формы, вызов процедуры в модуле класса должен квалифици­роваться переменной, которая указывает на экземпляр класса. Например, DemoClass — экземпляр класса Class1:

Dim DemoClass as New Class1

DemoClass.Subl

Однако, в отличие от формы или отчета, имя класса не может непосредственно использо­ваться как спецификатор при обращении к экземпляру класса. Вначале должен быть объяв­лен экземпляр класса как объектная переменная (в нашем случае — DemoClass), и далее этот экземпляр должен адресоваться именем переменной.

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

Если два или больше модуля содержат процедуры с одинаковыми именами, придется квалифицировать их именем модуля. Вызов такой процедуры из модуля выполняет проце­дуру данного модуля. Например, если процедура с именем CommonName имеется в моду­лях Модуль1 и Модуль2, то вызов CommonName из Модуль2 запустит процедуру CommonName в Модуль2, но никак не процедуру CommonName в Модуль1.

Если из Модуль1 требуется вызвать процедуру CommonName, определенную в Модуль2, нужно использовать такую инструкцию:

Moдyль2.CommonName (параметры)

Соседние файлы в предмете Базы данных