VBA для чайников
Шрифт:
dictBigCats.Add "Лев", "Рычащий и лохматый"
dictBigCats.Add "Пантера", "Черная, а не розовая"
Лучше, чем коллекции
Объекты Dictionary в некоторых довольно важных деталях совершеннее подобных им объектов Collection, которые обсуждались в главе 12, по следующим причинам.
* Не требуется знать имена элементов для доступа к ним и к соответствующим им значениям, поскольку возможен доступ ко всем элементам сразу с помощью цикла For Each . . . Next.
For Each airplane in dictBiplanes
MsgBox dictBiplanes(airplane)
Next
* Можно изменить значение элемента, используя имя элемента, просто присвоив новое значение:
dictVacationDestinations ("Number1") = "Fresno"
* В коллекциях приходится сначала удалять исходный элемент, а затем добавлять новый.
* Можно удалить все элементы словаря с помощью метода RemoveAll. Для выполнения той же задачи в коллекции приходится использовать цикл For Each . . . Next.
За неимением места здесь не обсуждаются приемы сортировки элементов словарей и выбора подмножеств элементов, удовлетворяющих заданным критериям. Замечу лишь, что такие типичные для баз данных функции реализовать со словарями достаточно просто. Подробные инструкции и примеры программного кода вы найдете в статье Bruce McKinney, Understanding the Dictionary Class, Visual Basic Programmer's Journal, July 1999, (издательство Fawcette Technical Publications), доступной также через Internet по адресу www.vbpj.com.
Пользовательские объекты
Освоив использование встроенных объектов 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 ), ведь объекты в основном предназначены для того, чтобы запретить программе получить прямой доступ к данным. Переменные, которые будут использоваться только в одном свойстве или методе, должны там и объявляться.