Поиск по сайту:


«VBA Программирование объектов приложения»

Файл: 4 КБ
Поделиться:
Освоив, как работают объекты, можно рассмотреть, как использовать их в программах VBA. Однако сначала полезно обсудить программирование объектов приложений. Рассмотрим следующие четыре этапа:
 Определение требований.
 Добавление ссылок на проект.
 Изучение модели объектов.
 Написание кода.
Определение требований. Данный этап весьма прост: требуется понять задачу, которую необходимо решить с помощью VBA. При этом следует максимально точно определить требования, предъявляемые к создаваемому проекту. При детальной разработке необходимо определить назначение конкретных процедур.
Располагая требованиями, можно определить необходимые инструменты. Например, если следует вывести данные в таблице Ехсеl, то требуется работать в Ехсеl. Всестороннее понимание назначения процедур и проекта позволяет сэкономить время и избежать большинства ошибок.
Использование ссылок
Определив используемые в проекте приложения, требуется убедиться, что ним имеется доступ из проекта VВА. Чтобы использовать объекты не только из основного приложения, необходимо добавить ссылки на другие программы в проект VВА.
Чтобы вставить ссылку на библиотеку объектов другого приложения: I
1. Выберите в окне редактора VВА команду Сервис\Ссылки (Тооls\Rеfегеnсеs). В появляющемся диалоговом окне Ссылки выводятся названия доступных библиотек объектов. Имена библиотек, уже используемых в проекте, отмечаются галочкой.
2. Установите флажок напротив имени требуемой библиотеки объектов, чтобы добавить ссылки на нее.
3. Если требуемая библиотека объектов отсутствует в списке, надо нажать на кнопку Обзор (Вгоwsе), чтобы отыскать нужную библиотеку и поместить ее в список.
4. Нажмите кнопку ОК.
Примечание
Объекты хранятся в файлах с расширениями DLL, ТLВ, OLВ, OCX (элементы управления АсtiveХ) и ЕХЕ.
Модель объектов приложения
Для большинства приложений, поддерживающих механизм ОLЕ, число объектов, используемых для поддержки их функциональных возможностей и данных, весьма велико. Простой документ Мicrosoft Wоrd или Microsoft Excel, можно при программировании разделить на множество элементов. Поэтому, прежде чем приступать к написанию программ, которые, например, автоматизируют работу со средствами приложения или обеспечивают доступ к данным, сохраненным в документе, необходимо ознакомиться с моделью объектов (иерархией классов) приложения.
Иерархия классов определяет связь между объектами, содержащимися в библиотеке типов используемого приложения. В модели объектов хранятся очень важные сведения, такие как данные, необходимые для обеспечения доступа к другим объектам. Например, прежде чем работать с содержимым ячеек некоторого диапазона, требуется получить доступ к рабочей книге Excel, а затем к нужному рабочему листу в этой книге.
Почти каждое приложение, поддерживающее механизм ОLЕ, поставляется вместе с описанием иерархии классов. Программы Microsoft Office не являются исключением. В них модель объектов содержится в системе справочной информации. Перед работой с объектами приложения необходимо изучить модель объектов.
Чтобы изучить иерархию классов и чтобы понять, как использовать объекты приложения, рекомендуется воспользоваться окном просмотра объектов.
Использование окна просмотра объектов
Количество приложений, использующих ОLЕ Automation, непрерывно растет. К сожалению, обычно доступен только ограниченный объем справочной информации по работе с объектами этих программ. По этой причине легко понять назначение и использовать средства окна просмотра объектов. Окно Просмотр объектов (Objесt: Вrоwser) - средство VВА, которое позволяет вывести список компонентов требуемой библиотеки, а также свойства и методы заданного объекта.
Окно просмотра объектов легко использовать. Необходимо задать требуемую библиотеку объектов, а затем выбрать нужный объект для вывода его свойств и методов.
Чтобы просмотреть объекты и вывести их свойства и методы:
1. Выберите команду Вид\Просмотр объектов (View\Object Browser), либо на жмите клавишу <F2>. Выводится окно Просмотр объектов.
2. Выберите требуемую библиотеку в списке, расположенном в верхнем правом углу окна. Чтобы просмотреть все библиотеки, участвующие в проекте, выделите в списке элемент Все библиотеки (Аll Libraries). Если нужная библиотека отсутствует в списке, требуется добавить на неё ссылку .
3. Выделите в списке Классы (Class) требуемый класс. Для этого либо щелкните по имени класса, либо несколько раз нажмите клавишу <Таb> для перемещения к списку Классы, а затем используйте клавиши < >, < >, < >, < >, чтобы передвигаться по списку. После выбора класса просмотрите в списке, расположенном в правой части окна просмотра, компоненты класса, т. е. его свойства, константы и методы. Если щелкнуть по элементу, то в нижней части диалогового окна выводится дополнительная информация.
4. Для поиска определенного объекта, метода или свойства, введите их название в списке, расположенном под списком библиотек, а затем нажмите кнопку Поиск (Search). Результаты поиска отображаются в окне Результаты поиска (Search Results).
Проблемы и решения
Не удается найти требуемые объекты и свойства. Вероятно, в проекте не задана ссылка на библиотеку типов, содержащую требуемые объекты. Откройте диалоговое окно Ссылки, и убедитесь, что напротив имени нужной библиотеки стоит галочка.
5. Чтобы увеличить или уменьшить пространство, отведенное для вывода описания объекта, свойства или метода, перетащите полосу, разделяющую списки и дополнительную информацию.
6. Чтобы последовательно перемещаться назад по списку выбранных в ходе работы элементов, нажмите кнопку Назад (Back). Для перемещения вперед по этому списку нажмите кнопку Вперед (Forward).
Написание кода
Описание и создание экземпляров объектов. Чтобы работать с объектами, требуется описать их. Как уже отмечалось ранее, для описания переменных используется инструкция Dim. Экземпляр класса описывается точно так же:
Dim объект as класс
Например, чтобы использовать экземпляр класса Datafile с именем WorkFile, требуется задать следующую инструкцию:
Dim WorkFile as Datafile
Рассмотрим описание экземпляра объекта презентации PowerPoint:
Dim BudgetPresentation as Presentation
С помощью явного задания класса объекта можно ускорить компиляцию программы, т. к. при этом не требуется выполнять дополнительную проверку, которая производится в случае неявного описания:
Dim BudgetPresentation as Object
Dim BudgetPresentation as Variant
Dim BudgetPresentation
Dim WorkingFile as Object
Dim WorkingFile as Variant
Dim WorkingFile
Кроме того, при явном описании нового объекта можно также использовать ключевые слова Private, Public или Static.
Однако явное описание типа указывает только на то, что объект WorkingFile имеет тип DataFile. Чтобы действительно создать экземпляр класса Datafile, необходимо использовать инструкцию Set:
Set объект = New класс
Например, чтобы явно описать объект WorkingEile, а затем создать экземпляр класса Datafile:
Dim WorkFile as Datafile
Set WorkingFile = New Datafile
Чтобы явно описать объект BudgetPresentation, а затем создать экземпляр
презентации PowerPoint:
Dim BudgetPresentation as Presentation
Set BudgetPresentation = New Presentation
В данном примере ключевое слово New используется для создания экземпляра объекта Presentation с именем BudgetPresentation.
Присваивание переменной ссылки на объект. Присваивание переменной ссылки на объект всегда выполняется с помощью инструкции Set:
Set ObjectVariable = SomeObject
Например, чтобы присвоить переменной MyNewTemplate ссылку на объект шаблона Microsoft Word, используйте следующую инструкцию:
Set MyNewTenvplate = Template
Кроме того, некоторые методы возвращают ссылки на объекты. В этом случае также требуется использовать инструкцию Set. Например, метод New класса Microsoft Excel Workbook возвращает ссылку на объект рабочего листа:
Set MyNewWorksheet = ThisWorkbook.new
Удаление объектов. В некоторых случаях требуется удалить как сам экземпляр класса, так и все относящиеся к нему данные. Для этого используется инструкция Set и ключевое слово Nothing:
Set объект = Nothing
Например, чтобы удалить объект WorkingFile, введите следующую инструкцию:
Set WorkingFile = Nothing
Создание модулей класса
Одно из наиболее мощных средств VBA - это возможность создавать собственные классы. Таким образом можно сократить текст программ и многократно использовать методы созданных объектов, что обычно позволяет исключить множество ошибок.
Разработка объектов
Объектно-ориентированное программирование требует от программиста принципиально другого способа мышления, чем при использовании процедурных языков. При разработке структуры объектов необходимо предварительно провести тщательное планирование, т. к. без детального анализа создать класс чрезвычайно трудно, а иногда и весьма долго. Для создания модели объекта можно использовать следующие программы: Rational Rose, Logic Works OOwin/CRT, OMT. Такие же возможности имеет программа Visual Modeler фирмы .Rational Rose, входящая в пакет Visual Studio 6.0
Создание свойств
Для создания свойства требуется предусмотреть возможность выполнения двух операций:
 Получение текущего значения свойства.
 Установка значения свойства.
Эти две операции выполняются с помощью двух взаимодополняющих друг друга процедур Property Let и Property Get, которые необходимо написать программисту.
Процедура Property Let. Процедура Property Let используется для установки значения свойства, например, для примера с объектом WorkingFile:
WorkingFile.delimiter = "@"
Одна из наиболее важных функций процедуры Property Let заключается в проверке того, является ли устанавливаемое значение допустимым или нет, и если нет, то требуется вывести сообщение об ошибке.
Устанавливаемое значение всегда является в инструкции Property Let пoследним параметром. В следующем примере переменная vNewValue передает значение, которое присваивается свойству Description:I
Public Property Let Description(ByVal vNewValue As Variant)
Description = vNewValue
End Property
Возвращаясь к примеру с объектом Datafile, допустим, что записи содержат числа, буквы, а также точки, поэтому требуется, чтобы разделителем не был ни один из символов, который входит в содержимое полей. Для этого напишем следующую процедуру Property Let, которая перед присваиванием проверяет устанавливаемое значение:
Public Property Let  Delimiter(ByVal vNewValue As Variant)
Dim AscChar as integer
AscChar = Asc(ucase(str$(vNewValue)))
If  (IsNumeric(vNewValue)) Or  (vNewValue = ".") _
[Or  ((AscChar > 64) And  (AscChar  < 91)) Then
Err.Raise  5, "Datafile object: Delimiter Property", "Invalid value"
Else
Delimiter = vNewValue
End If
End Property
Процедура Property Get. Процедура Property Get используется для получения значения свойства, например, для примера с объектом WorkingFile:
MyFilename = WorkingFile.name
Текущее значение свойства обычно хранится в переменной уровня модуля, поэтому процедура Property Get должна присвоить требуемому свойству значение, равное значению этой переменной.
Предположим, что текущее значение свойства Filename хранится в переменной уровня модуля m_filename, поэтому она доступна в любой процедуре класса. Процедура Property Get просто присваивает свойству значение переменной m_filename:
Public Property Get Filename( ) As Variant
Filename = m_filename
End Property
Процедуру Property Get, как и любую другую подпрограмму, можно описать с помощью ключевых слов Public, Private или Static.
Автоматическое создание свойств
С помощью диалогового окна Вставка процедуры (Add Procedure), редактор VBA автоматически создает первую и последнюю инструкции процедур Property Let и Property Get. Затем требуется самостоятельно написать код для установки и получения значений свойства.
Чтобы создать свойство объекта:
1. Откройте окно требуемого модуля класса.
2. Выберите команду Вставка\Процедура (Insert\Procedure). Появляется диалоговое окно Вставка процедуры.
3. Введите имя свойства в поле Имя (Name).
4. Выберите переключатель Свойство (Property).
5. Если свойство имеет общую область определения, т. е. доступно программисту, использующему объект, выберите переключатель Общая (Public). Если же свойство предполагается использовать только в модуле класса, выберите переключатель Личная (Private).
Примечание
Свойства с личной областью определения используются только в модуле класса и не доступны пользователю. Они предназначены для хранения данных, требуемых для выполнения служебных операций, например, запуска методов или установки значения других свойств. Кроме того, если требуется запретить изменение некоторой информации в модуле класса, назначьте этой информации личную область определения.
6. Нажмите кнопку ОК. В модуле класса создается описание процедур
Property Let и Property Get, например, для свойства Inuse:
Public  roperty Get Inuse() As Variant
End Property
Public Property Let Inuse(ByVal vNewValue As Variant)
End Property
Создание методов
Создание методов объектов осуществляется просто. Если метод возвращает данные, то необходимо написать функцию. В обратном случае, требуется подпрограмма. Так или иначе, эти функции или подпрограммы ничем не отличаются от процедур в модулях формы или в простых модулях. Покажем реализацию метода Delete для объекта Datafile. Обратите внимание, что в подпрограмме используется переменная уровня модуля для хранения имени файла. Кроме того, процедура проверяет, используется ли файл другим пользователем или нет.
Public Sub Delete()
If Not (Inuse(m_filename)) Then
Kill m_filename
End If
End Sub
Пример создания объекта
Покажем, как можно создать объекты на примере объекта pedometer. Этот объект используется для вычисления расстояния, которое пешеход может пройти при заданной величине шага и указанном числе шагов. Свойствами объекта pedometer являются число шагов, средняя величина шага, а также используемая при расчетах система мер (метрическая или английская).
Для создания объекта pedometer:
1. Выберите команду Вставка\Модуль класса (Insert\Class Module). Открывается окно нового модуля класса.
2. Нажмите клавишу <F4> и введите имя класса в окне свойств.
3. В разделе описаний модуля опишите переменные уровня модуля, которые используются для хранения текущего значения числа шагов, их величины и выбранной системы мер, продуманно выбирая типы данных.
Например:
Dim m_steps As Long Dim m_size As Single Dim m_system As Integer
4. Чтобы повысить восприятие текста программ, задайте две константы, соответствующие типу используемой системы мер, например:
Const METRIC =1
Const USE = 2
5. Создайте процедуры Property Let и Property Get для свойства Steps (число шагов). В процедурах требуется проверить, что заданный параметр является числом, и, если так, то он больше или равен 0:
Public Property Get Steps( ) As Integer
Steps = vNewSteps
End Property
Public Property Let Steps(ByVal vNewSteps As Integer)
If IsNumeric(vNewSteps) Then
If vNewSteps > -1 Then
m_steps = vNewSteps
Else
Err.Raise 5, "Pedometer:  свойство Steps","Значение должно быть больше или равно 0" 
Else
Err.Raise  5, "Pedometer:  свойство Steps", "Параметр не является числом"
End If
End Property
6. Создайте процедуры Property Let и Property Get для свойства Size (величина шага). В процедурах требуется проверить, что заданный параметр является числом:
Public Property Get Size () As	Variant
Size = m_size
End Property
Public Property Let Size(ByVal vNewValue As Variant)
If Not  (IsNumeric (vNewValue)) Then
Err.Raise 5, "Pedometer:  свойство Size  ", "Параметр не является числом"
Exit  Property
End If
m_size = vNewValue
End Property
7. Создайте процедуры Property Let и Property Get для свойства System (система мер). В процедурах требуется проверить, что заданный параметр имеет допустимое значение:
Public Property Get System ()	As Variant 
System = m_system
End Property
Public Property Let  System(ByVal vNewSystem As Variant)
If vNewSystem <> METRIC And vNewSystem <> USE Then 
Err.Raise  5, "Pedometer:  свойство System", "Недопустимое значение" 
Exit  Property 
End If
m_system = vNewSystem 
End Property
8. Создайте метод, который вычисляет пройденное расстояние. При расчете требуется учесть различия в системах измерений:
Public Function CalculateDistance() As Single 
If m_system = USE Then
CalculateDistance = ((m_steps  * m_size)  * 3) / 1760 
Else
CalculateDistance =   (m_steps * m_size) / 1000 
End If 
End Function