Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 1....doc
Скачиваний:
73
Добавлен:
17.12.2018
Размер:
1.88 Mб
Скачать

Метод Select и свойство Selection

Рассматривая в приложении Word объект Range, мы видели, что он может быть получен как результат вызова метода Range объектов одних классов и свойства Range объектов других классов. Свойством Range обладают объекты более низких уровней иерархии - коллекции слов и ячеек, абзацы и строки. Считается, что в каждый такой объект вложен объект Range, задающий диапазон, связанный с объектом. При вызове свойства этот существующий объект возвращается, и с ним можно работать. У объектов верхнего уровня иерархии: Application, Windows - встроенного диапазона нет, но зато есть метод Range, позволяющий создать новый объект этого класса.

С объектом Selection ситуация аналогична. И здесь свойство Selection возвращает уже существующий объект, а метод Select позволяет создать новый объект. Но здесь ситуация двойственна - объекты, имеющие свойство Range, обладают методом Select и, наоборот, объекты верхнего уровня иерархии имеют свойство Selection. Объяснение очевидно: объект Selection существует в единственном экземпляре в каждом подокне, и поэтому объекты более низких уровней иерархии просто не могут иметь встроенное свойство Selection. Им могут обладать только объекты класса Pane (подокно), Windows и Application.

Рассмотрим синтаксис метода Select:

  • Sub Select()

  • Sub Select([Replace])

В первом случае создается новая область выделения - объект Selection, во втором - область выделения можно расширить или заменить в зависимости от значения параметра Replace. Заметьте: метод Select реализован не как функция, явно возвращающая результат, а как процедура (Sub), которая объекта Selection не возвращает. Создание этого объекта - результат побочного эффекта этой процедуры. Созданный объект связывается с объектами верхнего уровня иерархии: окном и приложением. Его можно получить, обратившись к глобальному свойству Selection. Но Вы не можете получить ссылку на этот объект, а, следовательно, не можете создать переменную этого класса, так, как это могли делать при работе с объектами класса Range (вспомните переменную MyRange из наших примеров). Это предохраняет нас от соблазна "обмануть систему" и иметь две переменные - два объекта Selection одновременно.

Типичный и правильный способ работы с объектом Selection таков:

  • Создается или выбирается объект, область которого должна быть выделена.

  • Для этого объекта вызывается метод Select, возвращающий в качестве результата объект Selection.

  • Проводится работа с объектом Selection в области выделения.

  • Если нужно перейти к новой области выделения, то либо область выделения перемещается (как в нашем примере), либо повторяются действия, начиная с первого пункта.

Рассмотрим пример, в котором пользователь переключается между двумя областями выделения

Sub WorkWithTwoReg()

'Переключение между двумя областями выделения документа

'Создание двух областей

Dim myRange1 As Range

Dim myRange2 As Range

Dim i As Byte

Dim Answer As Variant ' Выбор пользователя

'Добавляем новый документ

Documents.Add

With ActiveDocument

'Добавляем 7 абзацев в текст созданного документа

For i = 1 To 7

.Paragraphs.Last.Range.Text = "Абзац " & i

.Paragraphs.Add

Next i

Set myRange1 = .Range(Start:=.Paragraphs(2).Range.Start, _

End:=.Paragraphs(3).Range.End)

Set myRange2 = .Range(Start:=.Paragraphs(6).Range.Start, _

End:=.Paragraphs(7).Range.End)

Answer = InputBox(prompt:=" Выберите область выделения (1/2)", _

Default:=1)

If Answer = 1 Then

myRange1.Select

'Макрос ItInSel работает с первой выделенной областью

ItInSel

Else

myRange2.Select

'Макрос ItInSel работает со второй выделенной областью

ItInSel

End If

End With

End Sub

Пример 1.9. (html, txt)

В этом макросе почти все применяемые средства хорошо знакомы. До сих пор мы не пользовались только стандартным для Visual Basic методом InputBox, который открывает диалоговое окно, позволяющее принять ввод пользователя. Заметьте, что работу в выделенной области осуществляет процедура ItInSel. Ее можно было сделать довольно сложной, но мы ограничились одним оператором:

Public Sub ItInSel()

Selection.Font.Italic = True

End Sub

Анализируя этот макрос, обратите внимание на два обстоятельства:

  • Если мы хотим постоянно работать с некоторыми областями, имеет смысл создать соответствующие им объекты. "Хранителями" областей выступают объекты класса Range В нашем примере это переменные myRange1 и myRange2. Объекты Selection появляются в последнюю минуту, когда область нужно выделить и начать с ней работать.

  • Работа с объектом Selection может быть предпочтительнее, так как явные ссылки заменяются косвенными. Это позволяет создать процедуру, не зависимую от области. Подобную ситуацию демонстрирует вызов процедуры ItInSel.