* Когда объекты вызываются из других приложений и поэтому их нельзя объявить с помощью ранней привязки. Использование объектов из других приложений относится г к углубленным вопросам VBA-программирования (краткое обсуждение которых вы найдете в главах 10 и 19), но вам не мешает знать о таком потенциальном ограничении.
Как вы знаете, переменная типа Variant может хранить информацию любого типа, в том числе и ссылки на объекты. Если вы объявляете переменную без явного указания на то, что это объект, то, выбирая позднюю привязку, вы сможете разместить в ней ссылку на объект позже.
После того как объектная переменная объявлена, перед ее использованием необходимо поместить в нее ссылку на объект. Это делается путем присваивания этой переменной объектного выражения с помощью ключевого слова Set. Например:
Set objShapeObject = ThisDocurcent.Pages(1).Shapes(4)
Обратите внимание, что синтаксис в данном случае немного отличается от того, каким вы присваивали данные обычным переменным (см. главу 9). Точно так же, как в случае данных других типов, между именем переменной и приписываемым ей объектом помещается знак равенства. Единственное отличие в том, что здесь оператор должен начинаться с ключевого слова Set.
Когда доступ к объекту уже не нужен, неплохо освободить объект от привязки к переменной. В результате программа сможет использовать участок памяти, ранее занятый объектом, а вы будете уверены в том, что ваш программный код не внесет по ошибке ненужные изменения в данный объект.
Сделать это совсем просто. С помощью оператора Set присвойте переменной ключевое слово Nothing, как в следующем примере:
Set objPriceIsNoObject = Nothing
Если объект, с которым вы собираетесь работать, еще не существует, вам придется его создать. В простых VBA-программах для этого используется метод Add, предназначенный для создания объектов, встроенных в ваше VBA-приложение, т.е. в приложение, с которым ассоциируется ваш проект. (В некоторых приложениях, возможно, именем такого метода будет что-то типа AddShape или AddDocument - проверьте в справочной системе приложения, чтобы знать точно.)
Самое главное - выяснить, метод Add какого именно из объектов следует применить. Цель - найти объект, который должен служить контейнером для создаваемого объекта. Обычно (но не всегда) подходящий контейнер представляет собой коллекцию.
Например, предположим, что нужно создать новый объект Layer в Visio. Объект Layer соответствует слою изображений в Visio. т.е. группе графических элементов, с которыми можно работать одновременно. Каждый объект Layer принадлежит объекту Layers, представляющему коллекцию из (одного или нескольких) слоев изображений. Исходя из лих соображений, для создания нового слоя вы должны выбрать метод Layers . Add.
Конечно, необходимо идентифицировать тот конкретный объект Layers, в котором
VBA придется создать ваш новый объект Layer. Коллекция Layers принадлежит конкретному объекту Page в объекте Document. Поэтому полностью оператор для создания нового объекта Laye r должен выглядеть примерно так:
ThisDocument.Pages(2).Layers.Add ( "Новый слой")
Объект Layer тоже имеет метод Add, но его нельзя использовать для создания подобного нового слоя. Метод Add объекта Layer добавляет объект Layer в данный слой, а не создает еще один такой же Layer.
Точно так же, если нужно добавить новый слайд в презентации PowerPoint, понадобится примерно такой оператор:
АсtivePresentation.Slides.Add1.ppLayoutTextAndClipart
Как видите, новый слайд тоже добавляется в подходящий объект-контейнер - коллекция Slides.
Ввод длинных ссылок на объекты не приносит слишком много радости, а именно такие ссылки содержат операторы, использующие метод Add, - поэтому имеет смысл при создании объекта сразу же создать и переменную для этого нового объекта. Тогда в следующий раз вместо длинной ссылки на объект в программном коле можно использовать имя переменной. Вот пример использования такого подхода:
Dim objМойМалыш As Glide
Set objМойМалыш = ActivePresentation. Slides .Add 1, _
ppLayoutTextAndClipart
В иных случаях для создания объектов используются другие приемы. Вот несколько вариантов на выбор.
* Создание новой копии объекта, уже существующего в проекте.
* Использование объекта из другого приложения или компонента ActiveX (COM).
* Создание экземпляра объекта на основе класса, созданного вами в модуле класса.
В зависимости от ситуации, при этом используется либо ключевое слово New в объявлении переменной или операторе Set, либо функция Create Object. Здесь я не собираюсь объяснять, как конкретно используется такая техника - она относится к тонким вопросам программирования и обсуждается в главах 10 и 19. Я только обращаю ваше внимание на существование ключевого слова Mev,- и функции CreateObjеct с помощью которых создаются обычные объекты.
Раз уж вы собираетесь использовать переменные для хранения ссылок на объекты, наступит время, когда вы захотите выяснить, ссылается ли данная переменная на тот же объект, что и другая переменная или объектное выражение.
Проверить идентичность двух ссылок на объекты можно с помощью оператора Is. Значением соответствующего выражения будет True, если ссылки идентичны, и False, если ссылки указывают на разные объекты. Вот фрагмент программного кода, иллюстрирующий использование оператора Is:
Dim objObject l As Object, objOb]ect2 As Object
If objObjectl Is objObject2 Then
MsgBox "Это тот же самый объект!"
Else
MsgBox "Это разные объекты."
End If
С помощью оператора Is можно сравнить объектную переменную и с объектным выражением, например, так:
If objObiect3 Is ThisDocument.Pages(2).Shapes(3) Then
Обратите внимание, оператор Is (как и любой другой оператор) нельзя использовать для выяснения идентичности содержимого двух объектов.
Эффективная работа с объектами в программе
Для упрощения работы с объектами в программе в VBA можно использовать две многострочные программные конструкции, называемые операторами With и Each . . .Next.
Использование оператора With
И когда для ссылки на объект используется мнемоническая переменная с коротким именем, и когда используется вполне инструктивное объектное выражение, их приходится вводить снова и снова. Но, оказывается, даже этого можно избежать.
Если в программе один и тот же объект используется в нескольких идущих один за другим операторах, то оператор With позволяет указать объект только один раз. Это не только избавит вас от необходимости печатать имя объекта для каждого из операторов, но и делает программный код более понятным, а его выполнение более быстрым. Например:
With objПолнаяОбъективность
.Name = "Опрос общественного мнения" ' установка свойства Name
.DisplayName ' вызов метода DisplayName
sngРегион = .Area ' выяснение значения свойства Area
intПодтасовка = .Rotate(60) ' вызов метода Rotate (Поворот)
' и сохранение возвращаемого им значения в переменной
End With
Как видите, конструкция With. . .End With может включать операторы, в которых читаются и устанавливаются свойства, вызываются методы. Обратите внимание на то, что данная конструкция не задает цикл - входящие в нее операторы выполняются только один раз.
Конструкции, использующие With, можно вкладывать одну в другую. Это удобно, когда нужно выполнить ряд действий и по отношению к некоторому объекту, и по отношению к одному из содержащихся в нем объектов. Пример предоставляет следующий фрагмент программного кода. В нем выполняются самые различные действия с объектом Block в AutoCAD. Во вложенной структуре With обрабатывается один из графических объектов, содержащихся в объекте Block.
Разобраться в деталях вам помогут комментарии.