Расширение объектной модели
Программист может дополнить встроенную в Word или Excel объектную модель, хотя такое дополнение во многом ограничено. К некоторым объектам можно приписать свойства, методы, обработчики событий. Это – только объекты, видимые в окне проекта. Так, например, к документу Word можно добавить свойства и методы, написанные Вами, можно добавить свойства к листам Excel. Но невозможно приписать свойства к абзацу, ячейке и т.п. Добавляемые свойства описываются в общей области объекта (General, на самом верху перед первой процедурой). Описание такое же, как и описание переменных.
Пример.
Пусть в окне кода, связанном с листом Sheet1, Вы написали следующее:
Public maxcena as Integer
Тогда в модуле вы можете обратиться к этому свойству следующим образом:
ActiveWorkbook.Sheet1.maxcena=56
Помните, что эти свойства не сохраняют значения между запусками документа! Если же Вам требуется сохранить данные между открытиями WORD-файла, то статические переменные, статические свойства встроенной объектной модели Вам не подойдут, поскольку под эти свойства-переменные память выделяется и инициализируется при открытии документа. Если Вам требуется сохранить какие-то значения, то есть сохранить "состояние" документа, воспользуйтесь встроенным в объектную модель Word объектом Variables. Он позволяет создавать, удалять хранимые поименованные переменные.
Пример.
Создание хранимой поименованной переменной:
ThisDocument.Variables.Add "nn", "567"
Обращение к ней, может быть, например, таким:
MsgBox ActiveDocument.Variables("nn")
Или таким:
MsgBox ActiveDocument.Variables(1)
Во встроенной модели множество экземпляров некоторого класса обычно объединяются в коллекции. Так мы имеем дело с коллекцией документов, листов, параграфов, ячеек и т.п. Это разумно по следующей причине. Объект – это некоторый фрагмент ОП, обладающий определенной структурой. В объектной переменной надо сохранить адрес этого фрагмента. А так как часто неизвестно, сколько Вы будете создавать объектов заданного класса, то наилучший вариант – предложить Вам коллекцию экземпляров, то есть динамический набор.
Таким образом, получается, что создание объекта некоторого встроенного типа – это добавление элемента в коллекцию, а уничтожение объекта – это удаление элемента из коллекции. Обычно выполняется это с помощью методов ADD, REMOVE.
Программист может описать свои классы, то есть типы, объединяющие свойства, методы и обработчики событий. Класс описывается в одном модуле класса. В одном проекте допускается описание нескольких классов. Экземпляры классов, то есть объекты создаются при помощи служебного слова New. Объектная переменная – это по существу указатель на область памяти, выделенную по New. О классах мы поговорим позже.
VBA не позволяет сформировать ActiveX объект. Но во многом аналогичный ему VB (самостоятельная среда разработки приложений, не встроенная в Office) позволяет это сделать. Реально ActiveX объект - это просто сохраненный пользовательский класс, получивший уникальное имя.
Коллекция
В VBA есть интересный объект – коллекция (Collection). Он представляет собой упорядоченное множество элементов. К элементам коллекции можно обратиться, используя метод Item, параметром которого следует указать имя элемента или его номер. Элементами коллекции могут быть переменные базовых типов, объекты или определяемые пользователем типы. В одну коллекцию можно помещать элементы разных типов.
Коллекция по своей природе близка к массиву и к списку. В отличие от массива коллекция имеет динамическую длину, элементы могут иметь разный тип, и элемент коллекции не имеет постоянного номера. Так, при удалении второго элемента коллекции первый элемент сохраняет номер, а третий становится вторым, четвертый – третьим и т.д. В отличие от списка возможен прямой доступ к элементу коллекции по номеру или имени.
В программе разрешается опускать .Item. Удобный способ перебрать элементы коллекции – воспользоваться циклом FOR EACH (ниже см. пример).
Учитывайте, что при помещении в коллекцию значения объектной переменной, Вы заносите ссылку на область памяти, занятую объектом. А при включении в коллекцию переменной базового типа, Вы заносите значение переменной. Поэтому дальнейшие изменения объекта отразятся и на элементе коллекции. А изменения не объектной переменной никак не отразятся на элементе коллекции.
Sub test1()
Dim cl As New Collection
x1 = 12
yy = "eeeeeeeee"
cl.Add x1
cl.Add yy
For Each c In cl
MsgBox c
Next
yy = "qqqq"
For Each c In cl
MsgBox c
Next
Еще важное замечание: невозможно изменить элемент коллекции, его можно только удалить (Remove) и включить новый (Add). Не забывайте при этом указать место, так как по умолчанию элементы добавляются в конец коллекции. Если элемент коллекции – объект, то, очевидно, что нельзя изменить объект, то есть ссылку на него, но можно изменить любое его свойство (значение).
![]() |
![]() | 24 (16) | aaa | (*) | Мама мыла раму | |||||
cl | cl(1) | ob2 | cl(2) | ob1 | obj |
Рисунок 7 – Коллекция и объектная переменная
На рисунке 7 показана коллекция cl, содержащая два элемента cl(1), cl(2). Первый элемент коллекции содержит объект (точнее – ссылку на него) ob1. Второй элемент коллекции содержит ссылку на объект ob2. Связь между первым элементом коллекции и вторым условно показана стрелкой, хотя программисту не дается возможность работать с этой ссылкой. Кроме того, показана реализация ссылки, число в скобках – адрес следующего элемента коллекции, а звездочка – признак конца. В программе описана еще и объектная переменная obj, которая указывает на объект ob2. Таким образом, к объекту obj1 можно добраться только как к элементу коллекции, а к объекту obj2 – и как к элементу коллекции и через переменную. Номера вверху – это условные номера ячеек оперативной памяти.