Книга Excel. Трюки и эффекты онлайн - страница 15



Классы в VBA

Язык программирования VBA является объектно-ориентированным, хотя и не поддерживает наследование и полиморфизм. VBA-программист может работать с встроенными классами, а также создавать и использовать свои собственные классы.

Создание класса на VBA

Создание класса на VBA отличается от других языков программирования (таких как C++), в которых описание классов во многом аналогично описанию структур.

В VBA для каждого класса в проект должен быть добавлен отдельный модуль, в который помещается код, реализующий работу класса, – модуль класса. Добавление нового модуля класса осуществляется с помощью команды меню Insert → Class Module (Вставить → Модуль класса) редактора Visual Basic. Имя модулю класса присваивается с помощью окна Properties (Свойства), которое показано на рис. 1.3.

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

Рис. 1.3. Назначение имени классу

Свойства класса

Свойства для классов в VBA могут быть реализованы двумя способами. Первый способ – это использование в модуле класса общих переменных-членов (объявленных с атрибутом Public). Добавим таким способом свойство в созданный ранее класс Class1, в котором будет храниться строка с описанием данных, содержащихся в объекте-экземпляре этого класса:

Public strTag As String

Такой способ реализации свойств является самым простым, однако в нем не предусмотрена возможность контролировать правильность задания параметра и осуществлять какие-либо действия при изменении его значения. Для решения этой проблемы можно использовать второй способ – создание процедур и функций, которые выполняются при установке и получении значений свойств соответственно. Для этих целей в модуле класса применяются обычные объявления процедур и функций, в которых используется ключевое слово Property.

Для получения значения свойства предназначена функция, объявленная с использованием Property Get:

[Public | Private] [Static] Property Get Имя_свойства ([Аргументы]) _

[As Имя_типа]

[Инструкции]

[Имя_свойства = Выражение]

[Exit Property]

[Инструкции]

[Имя_свойства = Выражение]

End Property

Для присвоения значения свойству, не являющемуся ссылкой на объект, предназначена процедура, объявленная с использованием Property Let:

[Public | Private] [Static] Property Let Имя_свойства ([Аргументы,]Значение)

[Инструкции]

[Exit Property]

[Инструкции]

End Property

Для присвоения значения свойству, являющемуся ссылкой на объект, предназначена процедура, объявленная с использованием Property Set:

[Public | Private] [Static] Property Set Имя_свойства ([Аргументы,]Значение)

[Инструкции]

[Exit Property]

[Инструкции]

End Property

Использование процедур и функций с ключевым словом Property очень удобно для создания свойств только для чтения (для этого свойства не реализуются Property Let и Property Set) и свойств только для записи (не реализуется Property Get).

Разберем реализацию свойств ObjectRef и ObjectType для рассматриваемого класса Class1 (частная переменная-член objRef используется для хранения установленной ссылки на объект):

Private objRef As Object

Property Set ObjectRef(objNewRef As Object)

' Задание ссылки хранимого объекта

Set objRef = objNewRef

End Property

Property Get ObjectRef() As Object

' Возврат ссылки на хранимый объект

Set ObjectRef = objRef

End Property

Property Get ObjectType() As String

' Возврат имени типа хранимого объекта

ObjectType = TypeName(objRef)

End Property

Методы класса

Любая функция или процедура, описанная в модуле класса, является методом этого класса. Методы делятся на общие (описаны с использованием Public) и частные (описаны с использованием Private).

Ниже приведена реализация метода для созданного нами класса Class1, при обращении к которому на экран выводится сообщение со значениями атрибутов класса:

Sub ShowInfo()

' Отображение окна со значением свойства strTag и именем типа _

объекта, на который хранится ссылка

MsgBox "strTag = " & strTag & vbCrLf & _

"Object type = " & ObjectType

End Sub

Использование класса в программе

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

Dim obj As Class1

После создания ссылки сам объект создается с помощью инструкции Set:

Set obj = New Class1

Объявление переменной ссылки и создание объекта можно также совместить:

Dim obj As New Class1

Для доступа к свойствам и методам объекта используется точка, например:

obj.strTag = «Некоторый текст»

Set obj.ObjectRef = Nothing

MsgBox obj.ObjectType

obj.ShowInfo

Ниже приведен пример процедуры, которая использует реализованный класс

Class1:

Sub TestClass()

' Создание объекта

Dim obj As New Class1

' Установка свойств

Set obj.ObjectRef = New Collection

obj.strTag = "В этом объекте хранится ссылка на объект

Collection"

' Вызов метода

obj.ShowInfo

End Sub

В результате работы данной процедуры на экран будет выведено окно сообщения, показанное на рис. 1.4.

Рис. 1.4. Окно с информацией о свойствах объекта


Как можно заметить, в процедуре TestClass не происходит явного уничтожения ссылки на объект класса Class1. Дело в том, что ссылка obj – локальная переменная процедуры. А при выходе из процедуры данные всех локальных (не статических) переменных уничтожаются, в том числе удаляются и локальные ссылки на объекты.



Помоги Ридли!
Мы вкладываем душу в Ридли. Спасибо, что вы с нами! Расскажите о нас друзьям, чтобы они могли присоединиться к нашей дружной семье книголюбов.
Зарегистрируйтесь, и вы сможете:
Получать персональные рекомендации книг
Создать собственную виртуальную библиотеку
Следить за тем, что читают Ваши друзья
Данное действие доступно только для зарегистрированных пользователей Регистрация Войти на сайт