Расширение объектной модели

Программист может дополнить встроенную в 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). Не забывайте при этом указать место, так как по умолчанию элементы добавляются в конец коллекции. Если элемент коллекции – объект, то, очевидно, что нельзя изменить объект, то есть ссылку на него, но можно изменить любое его свойство (значение).

 
 

 


8   24 (16) aaa (*)   Мама мыла раму
cl   cl(1) ob2 cl(2)   ob1     obj

 

 

Рисунок 7 – Коллекция и объектная переменная

 

На рисунке 7 показана коллекция cl, содержащая два элемента cl(1), cl(2). Первый элемент коллекции содержит объект (точнее – ссылку на него) ob1. Второй элемент коллекции содержит ссылку на объект ob2. Связь между первым элементом коллекции и вторым условно показана стрелкой, хотя программисту не дается возможность работать с этой ссылкой. Кроме того, показана реализация ссылки, число в скобках – адрес следующего элемента коллекции, а звездочка – признак конца. В программе описана еще и объектная переменная obj, которая указывает на объект ob2. Таким образом, к объекту obj1 можно добраться только как к элементу коллекции, а к объекту obj2 – и как к элементу коллекции и через переменную. Номера вверху – это условные номера ячеек оперативной памяти.