Пользовательские объекты
Освоив использование встроенных объектов VBA и других объектных библиотек, вы, наверное, захотите создать свои собственные объекты. Хотя можно достичь немалого и с помощью обычных процедур типа Sub и Function, выделение части программного кода в виде объектов обладает реальными преимуществами.
* Размещение всего программного кода, обрабатывающего некоторое множество данных, внутри отдельного объекта уменьшает вероятность внесения ошибок при модификации программы.
* Программа будет легче для чтения и понимания.
* Можно создать сколько угодно копий объекта, причем для создания каждой копии понадобится всего пара коротких операторов.
* Упоминание преимуществ полиморфизма, вероятно, потребует дополнительных разъяснений, но... использование одних и тех же свойств и методов с разными классами объектов все же оказывается удобным. А именно это подразумевает полиморфизм. К сожалению, я не могу тут развивать эту тему, но вы должны знать, что существует такая мощная техника программирования. Подробно полиморфизм обсуждается в книгах, цель которых - более глубокое изучение VBA.
Как вы уже знаете (если прочитали главу 12), объект состоит из данных (свойств объекта) и программного кода, изменяющего эти данные (методов объекта). Поскольку свойства являются просто переменными, а методы - процедурами, создание программного кода, задающего объект, не такая уж сложная задача. Но при этом необходимо следовать определенным правилам, чтобы VBA мог распознать, что именно вы собираетесь сделать. Следующие несколько разделов посвящены описанию этих правил.
Создание модулей классов
В VBA класс является шаблоном, по которому создаются подобные объекты. Класс определяет, какие свойства, методы и события должен иметь объект и как должен "вести" себя каждый из этих компонентов.
Чтобы создать класс, начните со вставки нового модуля класса в VBA-проект (для чего выберите Insert=Cl ass Module). Окно модуля класса выглядит и работает точно так же, как и обычное окно программного кода. Прежде чем двигаться дальше, задайте имя нового класса в строке (Name) в окне свойств.
Компоненты определения класса
Типичный класс имеет три главных компонента.
* Объявленные локальными переменные, предназначенные для использования внутри объекта.
* Открытые процедуры свойств, позволяющие процедурам из стандартных модулей прочитать или изменить текущие значения свойств.
* Открытые процедуры методов, задающие действия, выполняемые методами объекта.
Представленное ниже определение простого класса Thermostat включает все три этих компонента. Сам по себе пример не предназначен для выполнения каких-либо полезных задач, но он работает и есть на Web-странице на случай, если вы захотите его испытать. Если же вы предпочтете набрать программный код самостоятельно, с помощью окна свойств назовите модуль класса Thermostat, а затем введите в окне его программного кода следующее:
Private sngDegrees As Single ' переменная свойства
' Программный код процедуры свойства Let Temperature:
Public Property Let Temperature(ByVal snglnput As _
Single)
sngDegrees = snglnput
End Property
' Программный код процедуры свойства Get Temperature:
Public Property Get Temperature() As Single
temperature = sngDegrees
End Property
' Программный код процедуры метода CalculateEnergyUse:
Public Sub CalculateEnergyUse()
Const cstConversionFactor =2.45
Dim dblResult
dblResult = sngDegrees * 365 * cstConversionFactor
MsgBox "Годовой расход энергии на поддержание " & _
"установок термостата оценивается в " & _
dblResult & " Ватт."
End Sub
Объявление переменных класса
Для объявления переменных, которые понадобятся в нескольких свойствах или методах, используйте раздел Declarations в самом начале модуля класса. Всегда объявляйте эти переменные как локальные ( Private ), ведь объекты в основном предназначены для того, чтобы запретить программе получить прямой доступ к данным. Переменные, которые будут использоваться только в одном свойстве или методе, должны там и объявляться.
Для каждого из свойств объекта нужно объявить как минимум по одной переменной. Имя переменной не должно совпадать с именем свойства (чуть позже я объясню, как задать имя свойства).
Можно объявить и другие данные, которые объект будет использовать внутри себя и которые будут недоступными для других частей вашей программы.
Создание процедур свойств
Секрет наделения объекта свойством состоит в написании пары специальных процедур - процедур свойств Property Let и Property Get. Обе процедуры в паре должны иметь одинаковые имена.
Именем свойства будет то, которое вы выберете для процедур Property Let и Property Get. Ясно, что оно должно описывать содержимое или функцию свойства.
Да, и еще: если создаваемое свойство будет представлять ссылку на другой объект, вместо процедуры Property Let в вышеуказанной паре процедур используйте процедуру Property Set. В остальном такое свойство ничем не отличается от свойств, использующих другие типы данных.
Установка свойств объекта с помощью процедур Property Let
Процедура Property Let устанавливает значение свойства. В своей простейшей форме процедура