Читаем без скачивания VBA для чайников - Стив Каммингс
Шрифт:
Интервал:
Закладка:
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.
Разобраться в деталях вам помогут комментарии.
With Block.Item("Монстр")
' Объект Block с именем "Монстр" делает следующее:
' переименовывает Block с помощью свойства Name
.Name = "Душечка"
' Выясняет число объектов в нем, с помощью свойства Count
intЧислоОбъектов = .Count
' Вызывает метод AddCircle
' для центра = 0 и для радиуса = 5
AddCircle (0#, 5#)
With.Item (1)
' эта вложенная структура With ссылается на первый
' графический объект в объекте Block
' графический объект перемещается с помощью метода Move
.Move (15, 20)
' изменяется свойство Color этого графического объекта
.Color = 221
End With
End With
Данный пример не иллюстрирует, что вы можете использовать значения, возвращаемые свойствами или методами объекта, в условных операторах и других выражениях. Например, во внешнюю структуру With можно было бы добавить следующий фрагмент программного кода:
IntНовыйЦвет = InputBox (" Введите число, задающее " _
& "цвет первого объекта в блоке " & .Name)
If .Count > 12000
MsgBox "Да этот блок просто гигант!"
End If
Вообще-то, управляющем структурам VBA (группам операторов, предназначенных для управления потоком выполнения программы) посвящена глава 8, но одну из таких структур мы рассмотрим здесь, потому что она используется только с объектами. Как аналог идеи цикла For. .Loop, в VBA структура For Each. . .Next представляет множество операторов, относящихся ко всем объектам в некоторой коллекции. Правда, хотя обе структуры выглядят очень похоже, между ними есть существенные различия по сути, и For
Each. . . Next проще в использовании. Вот синтаксис:
For Each элемент In группа
(операторы для выполнения при каждом проходе цикла)
Next элемент
Ключевым различием в использовании For Each. . .Next и For. . .Next является то, что здесь вам не требуется указывать число повторений выполнения цикла- это за вас выяснит VBA. В операторе For Each с помощью переменной элемент определяется тип объекта в коллекции, а с помощью аргумента группа задается коллекция, с которой нужно работать.
Следующий простой пример работает в AutoCAD, где коллекция Blocks является коллекцией объектов Block и каждый объект Block содержит неограниченное число графических объектов типа Cone (конус) или 3DFace (трехмерная поверхность). В этом фрагменте программного кода всего лишь отображается имя каждого объекта Block из коллекции Blocks:
Dim objB As Block
For Each objB In Blocks
Debug.Print objB.Name
Next objB
Ясно, что этот пример мир не переворачивает, но вы должны видеть его потенциальную мощь. Структура For Each. . .Next может вызывать любую комбинацию действий, доступных после вызова методов и свойств объектов, входящих в коллекцию.
Когда вам нужна определенная игла в коробке с иглами, другие иглы вас не интересуют.
Чтобы выполнить определенные действия по отношению к одному конкретному объекту в коллекции, используйте внутри структуры For Each. . .Next оператор If. . .Then.
Когда условие If... Then обнаружит объект вашей мечты, дальше искать станет бессмысленно, и тогда быстрый выход из цикла обеспечит оператор Exit For.
Снова обратившись к коллекции Blocks из AutoCAD, рассмотрим следующий пример:
Dim objК As Block
For Each objK In Blocks
If objK.Name = "Ерунда"
objK.Delete
Exit For
End If
Next objK
В этом примере вложенная конструкция If. . . Then используется для того, чтобы обнаружить объект Block с именем "Ерунда" среди всех объектов Block в коллекции Blocks.
После того- и только после того- как нужный Block найден, выполняются операторы внутри структуры If... Then. "Выполняются" здесь относится, главным образом, к первому из операторов, который удаляет объект Block. Миссия завершена. Цикл больше не нужен, поэтому Exit For прерывает его, и программа может продолжить свою работу.
Глава 13. Тонкости хранения данных: массивы и коллекции.
В этой главе ...
~ Использование массивов для управления наборами элементов одного и того же типа
~ Многомерные массивы
~ Объект Collection как альтернатива массивам
~ Создание своих собственных типов данных для работы с информацией, состоящей из родственных данных различных типов
К этому моменту вы должны чувствовать себя уверенно при работе с переменными хранящими данные любых типов, - от обычных чисел и строк текста до сложных, имеющих мощный потенциал, объектов. Но бывает, что ни один из встроенных типов данных VBA разработчика не устраивает. Часто необходимо работать с некоторым набором однотипных данных как с единым целым. В таких случаях используются массивы - структурированные боксы для хранения множеств элементов данных одинакового типа.
Работать с множествами элементов различных типов позволяют объекты Collection (коллекции), которые создаются на основе соответствующего встроенного класса VBA, При некоторых ограничениях использование коллекций бывает целесообразнее, чем применение массивов.
Иногда удобнее создать свой собственный пользовательский тип данных. Как и переменные, пользовательские типы данных упрощают восприятие программного кода и позволяют обращаться к отдельным, но родственным в некотором смысле, элементам как к частям единого целого. Но массив данных пользовательского типа оказывается еще удобнее, если приходится иметь дело с группами сложных составных наборов информации.