Книга: VBA для чайников

Использование оператора With

Использование оператора 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 прерывает его, и программа может продолжить свою работу.

Оглавление книги


Генерация: 1.301. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз