Лекция 15н.Область действия переменных и

Реклама
Лекция 13. Область действия переменных и процедур. Модули VBA
Вопрос 1. Область действия переменных и процедур
Все процедуры, функции, переменные и константы в VBA имеют свою область
действия. Это означает, что все они могут использоваться только в определенном
месте программного кода, т.е. там, где они описаны. Например, если переменная А
описана с помощью оператора Dim в теле процедуры с именем Prod, то именно эта
процедура и является ее областью действия. Таким образом, если имеется другая
процедура Ргос2, то использовать в ней эту же переменную нельзя. Если попытаться
сделать это, можно либо получить сообщение об ошибке из-за использования неописанной переменной (в случае, если используется упоминавшийся выше оператор
Option Explicit), либо другую переменную с тем же самым именем, но никак не
связанную с одноименной переменной из первой процедуры.
В каком месте программы и как именно описана переменная, определяет область
ее действия, а также длительность жизни в памяти и сохранения присвоенного ей
значения.
Имеется три различных уровня при определении области действия переменных:
уровень процедуры, уровень модуля и уровень проекта.
Чтобы определить переменную на уровне процедуры, ее описание помещается в
тело этой процедуры. Чтобы определить процедуру на уровне модуля и сделать ее
тем самым доступной для совместного использования во всех процедурах этого
модуля, следует поместить ее описание в секции объявлений модуля (перед текстом
каких-либо процедур или функций). При этом можно использовать и явное описание
области действия, т.е. вместо ключевого слова Dim использовать в этом случае
ключевое слово Private.
Наконец, чтобы описать переменную на уровне проекта, необходимо расположить ее
описание в секции объявлений одного из модулей проекта и при этом обязательно
использовать ключевое слово Public. Описанные таким образом переменные могут
использоваться в любом модуле проекта. Все сказанное относится к описанию и
определению области действия констант и массивов.
Для переменных имеется еще один способ описания, не изменяющий их уровня, но
позволяющий сохранить значение переменной, описанной на уровне процедуры,
после завершения работы этой процедуры. Для этого используют описатель Static, т.е.
определяют такую переменную как статическую. Эта переменная сохраняет
выделенное ей место в памяти и свое значение даже после завершения процедуры, в
которой она была описана и использована.
Тем не менее, статическая переменная не может быть использована в других
процедурах. Изменяется лишь время ее жизни, но не область действия. Если
произойдет повторный вызов той же самой процедуры, в которой была описана
статическая переменная, то эта переменная сохранит свое прежнее значение,
которое она имела в момент завершения работы этой процедуры при предыдущем
вызове. Обыкновенные (не статические) переменные всякий раз инициализируются
заново и получают при входе в процедуру пустые значения.
Процедуры и функции имеют только два уровня областей действия: уровень
модуля и уровень проекта. По умолчанию используется уровень проекта. Таким
образом процедура или функция может быть вызвана любой другой процедурой или
функцией в этом проекте. При описании процедур и функций на уровне проекта
может также использоваться необязательное ключевое слово Public, но никакого
воздействия на процедуру наличие или отсутствие этого слова не оказывает.
Если требуется описать процедуру, используемую только на уровне модуля,
применяется ключевое слово Private. Такое описание не только сужает область
действия для процедуры, но и запрещает ее использование как самостоятельной, т.е.
эту процедуру можно вызвать только из другой процедуры.
1
Наконец, при описании процедур или функций может использоваться и ключевое
слово Static. Оно никак не влияет на область действия процедуры, но воздействует на
все переменные, описанные внутри этой процедуры или функции. В этом случае все
локальные переменные получают статус Static и тем самым сохраняются в памяти
после завершения такой процедуры и при повторном ее вызове сохраняют свои
прежние значения.
Пример 5. Описание модуля:
Public А1 As String
Private A2 As Integer
Dim A3 As Single
Sub Proc1 0
Dim A4 As Integer
Static A5 As Integer
Al = "Текстовая строка 1"
A2 = 2
A3 = 3.14
A4 = A4+4
A5 = A5+5
MsgBox A4
MsgBox A5
End Sub
Sub Proc2 ( ) Proc1
MsgBox A1
MsgBox A2
MsgBox A3
MsgBox A4
MsgBox A5
Proc1
EndSub
В этом примере переменная Al определена на уровне всего проекта (использовано ключевое
слово Public), переменные А2 и А1 — на уровне модуля, переменная А4 — только на уровне
процедуры Proc1, а переменная А5 хотя и определена в теле процедуры Proc1, но описана как
статическая переменная.
При вызове процедуры Ргос2 происходит следующее: из этой процедуры, в свою очередь,
вызывается процедура Proc1, которая присваивает значения всем пяти переменным А1... А5, а затем
показывает текущие значения переменных А4 и А5 в диалоговом окне.
После завершения этой процедуры выводятся текущие значения переменных А1... А5 из
процедуры Ргос2. При этом оказывается, что переменные А1...АЗ сохранили свои значения,
поскольку они описаны на уровне модуля, а переменные А4 и А5 принимают пустые значения, поскольку областью их действия являются процедуры, в которых они используются. Никакие
изменения этих переменных внутри одной из процедур не имеют отношения к аналогичным
2
переменным из другой процедуры, так как на самом деле это разные переменные, просто для них
используются совпадающие имена.
Затем происходит еще один вызов процедуры Proc1, и она вновь начинает изменять и выводить
на экран значения переменных А4 и А5. При этом переменная А4 вновь получает значение 4,
поскольку при новом вызове процедуры для этой переменной заново выделяется память, и она
будет инициализирована пустым значением. В отличие от А4 переменная А5, описанная как
статическая переменная, сохраняет свое прежнее значение от предыдущего вызова этой
процедуры, и в результате ее значение при повторном вызове оказывается равным 10.
Код VBA в приложении Access собран в модули. Модули являются такими же объектами Access,
как таблицы, запросы, формы, отчеты, страницы и макросы, о чем свидетельствует ярлык на панели
объектов в окне База данных (Database). Основное содержание модулей — это процедуры на языке
VBA. Существует 2 типа модулей: стандартные и модули класса.
Стандартные модули содержат общие процедуры, которые могут использоваться в разных
местах приложения: при обработке событий в разных объектах, для вычисления значений в разных
запpocax или формах, а также вызываться из других модулей и т.д. Эти процедуры не связаны с
конкретным объектом: формой или отчетом. Они могут использоваться для объявления глобальных
(т.e. доступных из всех окон приложения) переменных, констант, типов, внешних процедур.
Если в процедурах модуля нет ссылок на конкретные объекты данного приложения (формы,
отчеты, элементы управления), то такой модуль может с успехом использоваться другими приложениями Access.
Список стандартных модулей приложения всегда можно увидеть, нажав кнопку [Модули] (Modules)
в окне База данных (Database), в котором обычно и выполняется работа с этими модулями. Если
выделить в окне базы данных Борей (Northwind) модуль Служебные функции (Utility Functions) и
нажать кнопку [Конструктор] (Design), то откроется окно редактора кода VBA, в котором можно
увидеть содержание этого модуля, состоящего из двух строк описания и одной процедуры —
функции IsLoaded (рис. 13.1).
Рис. 13.1. Функция IsLoaded
Это пример универсальной функции, проверяющей, загружена ли форма, имя которой передается
ей в качестве аргумента. Приведенная функция никак не связана не только с объектом, но и с
данным приложением и может использоваться как в нем самом, так и в любом другом приложении.
3
Рис. 13.2. Диалоговое окно свойств формы
Модуль класса отличается от стандартного модуля тем, что кроме процедур он содержит описание
объекта и используется для создания объектов. Процедуры, определенные в этом модуле, являются
методами и свойствами объекта. Примерами модулей класса являются модули форм и отчетов.
Модули форм и отчетов связаны с конкретными формой и отчетом и содержат процедуры
обработки событий для этих формы и отчета. Модуль формы не создается сразу при создании новой
формы. Он создается и связывается с формой, как только производится попытка создать первую
процедуру обработки событий для этой формы или одного из элементов управления формы, либо
нажимается кнопка [Программа] (Code) в окне конструктора формы. Чтобы убедиться в этом, можно
открыть любую форму приложения Борей (Northwind) в режиме конструктора и посмотреть ее
свойства. На вкладке Другие (Others) есть свойство Наличие модуля (Has Module), которое должно
иметь значение Нет (No). После нажатия кнопки [Программа] (Code), которая служит для
открывания редактора кода VBA, это свойство будет иметь значение Да (Yes) (рис. 13.2).
В окне редактора кода VBA отображается объект Форма (Form), а справа от него — поле со
списком событий, с которыми могут быть связаны процедуры VBA (рис. 13.3).
Если в модуле для некоторого события существует процедура, то это событие выделяется в
списке жирным шрифтом. В данном случае таких событий нет, так как обработка событий в форме
Клиенты (Customers), которую мы открыли, выполняется с помощью макросов. При попытке
открытия редактора VBA автоматически создается модуль формы, который будет иметь название
FогmКлиенты, и в нем процедура обработки события Load.
Рис. 13.3. Окно редактора кода VBA
Открыть форму из программы VBA и изменить какие-то свойства этой формы или свойства ее
элементов управления можно двумя методами.
4
1. Использование макрокоманды OpenForm, как метода объекта DoCmd, например:
DoCmd.OpenForm "Товары"
Forms!Товары.RecordSource = "Товары клиента"
2. Использование ссылки на соответствующий модуль класса,
например:
Form_Toвapы.Visible = True
Form_Toвapы.RecordSource = "Товары клиента"
В обоих случаях при выполнении программы открывается стандартный экземпляр формы Товары
(Products) и подменяется источник записей для этой формы.
Формы и отчеты являются стандартными классами объектов в Access, однако можно использовать
модули класса и для создания специальных объектов. В этом случае имя, под которым сохраняется
модуль класса, становится именем специального объекта. Процедуры типа Sub и Function,
определенные в модуле класса, при этом станут методами объекта, а процедуры типа Property Let,
Property Get и Property Set — свойствами объекта. Для описания метода, не возвращающего никакое
значение, используется процедура Sub, а для описания метода, возвращающего некоторое
значение, — процедура Function. Процедура Property Get возвращает значение свойства объекта.
Процедура Property Set присваивает значение свойству объекта. Процедура Property Let устанавливает значение свойства, не принадлежащего объекту.
Для создания стандартного модуля или модуля класса необходимо выполнить следующие
действия:
• выбрать команду Модуль (Module) или Модуль класса (Class Module) в меню Вставка (Insert)
(рис. 13.4). При этом откроется редактор кода VBA с пустым окном модуля;
• создать необходимые процедуры и описания;
• сохранить модуль, нажав кнопку [Сохранить] (Save) на панели инструментов. При этом откроется
диалоговое окно Сохранение (Save), в которое нужно ввести имя нового модуля и нажать кнопку
[ОК].
После этого новый модуль появится в списке модулей окна базы данных. Чтобы его открыть,
можно нажать кнопку [Конструктор] (Design) окна базы данных или в режиме конструктора формы
или отчета нажать кнопку [Программа] (Code) на панели инструментов.
Окно Object Browser позволяет просматривать все объекты, их свойства и методы, доступные для
текущего проекта. Эти объекты могут быть встроенными объектами Access или VBA, а также объектами, которые созданы в приложении или входят во внешние биб-
Рис. 13.4. Создание нового модуля 5
Рис. 13.5. Окно просмотра объектов
лиотеки, на которые имеются ссылки в текущем проекте. Вызвать окно просмотра объектов можно
еще тремя способами:
• нажать клавишу [F21];
• нажать кнопку [Object Browser] на панели инструментов;
• выбрать команду View, Object Browser.
Окно Object Browser состоит из нескольких списков (рис. 13.5), которые обеспечивают
трехуровневое представление информации.
Список Проект/библиотека (Project/Library) в левом верхнем углу окна содержит перечень всех
библиотек и проектов, на которые имеются ссылки в данном проекте. Как минимум он включает в
себя библиотеку Access, библиотеку VBA, библиотеку текущего проекта.
При выборе из списка одной из библиотек в нижнем, левом поле Classes отображается список
следующего уровня — перечень всех объектов, входящих в эту библиотеку. Например, если выбрать
библиотеку Access, то в списке Classes можно увидеть много знакомых объектов. Выбрав один из
них (например, DoCmd), в правом поле Members of можно увидеть все методы этого объекта. Если
бы мы выбрали объект Form, то в правом поле отобразились бы все свойства и методы объекта
Form.
При этом в нижней части окна, которая называется Область описания, отображается описание
выбранного элемента.
Вопрос 2. Инструментальные средства отладки
Помимо интеллектуального редактора текста профессиональная среда программирования должна
содержать инструментальные средства отладки, которые призваны дать разработчику максимально ясное представление о том, как работает его программа. И уже искусство разработчика
позволит, используя все имеющиеся в его распоряжении средства, быстро выявить ошибки. Набор
средств отладки в Access широк. Это и специальное меню Откладка (Debug), и во многом
дублирующие его кнопки на панели инструментов, и специальные окна отладки.
В табл. 13.1 представлено описание команд отладки, а на рис. 13.6 показаны меню Отладка
(Debug) и специальная панель инструментов Debug.
Таблица 13.1
Назначение команд отладки
6
Рис.13.6. Меню и панель инструментов Debug
7
Скачать