11.5.3 Работа с объектом Range, его свойства и методы
Объект Word.Range, программная работа с диапазоном в документе, свойства и методы объекта Range, преимущества по сравнению с объектом Selection
Как уже говорилось, чаще всего разработчиками для определения места ввода текста и навигации по документу используется объект Selection. Для этих же целей можно использовать и объект Range. Главное отличие между объектами Range и Selection заключается в том, что объект Selection может определить и пользователь (выделив текст мышью), а объект Range можно определить только программно, и он не зависит от текущего положения указателя или действий пользователя.
Рекомендуется, если это возможно, всегда использовать объект Range вместо объекта Selection. Тем самым мы защищаем себя от возможных ошибок, связанных с действиями пользователя (например, если пользователь в момент, когда программно вводится текст, щелкнет мышью по какому-либо месту в документе).
Формальное определение объекта Range выглядит так: это программный объект, который представляет непрерывный участок текста в документе. Этот объект не зависит от объекта Selection — вы можете работать с объектом Range, не изменяя текущего выделения. Он может не включать в себя ни одного символа (представлять курсор ввода текста).
Объектов Range в каждый момент времени может быть сколько угодно, а объектов Selection — только один.
Как создается объект Range:
- первый способ — воспользоваться методом Range() объекта Document. В этом случае вам потребуется передать номера начального и конечного символа диапазона, а также document story, в который будут отсчитываться эти символы. Например, создать диапазон, который будет включать в себя первые 10 символов документа, можно так:
Dim rngDoc As Range
Set rngDoc = ActiveDocument.Range(Start:=0, End:=10)
- второй способ — воспользоваться свойством Range, которое предусмотрено для огромного количества объектов ( Bookmark, Selection, Table-Row-Cell, Paragraph и т.п.). В этом случае при помощи этого свойства мы получаем объект Range, представляющий данный объект;
- третий способ — воспользоваться большим количеством вспомогательных свойств (Characters, Words, Sentences и т.п.), которые делят текст на отрезки — объекты Range. Эти свойства возвращают коллекции объектов Range. Конечно, если вы создаете коллекцию объектов Range, представляющих каждый символ большого документа, с точки зрения производительности такое решение может быть не самым лучшим;
- четвертый способ — переопределить существующий объект Range. Обычно для этой цели используется метод Range.SetRange();
- ну и, наконец, пятый способ, самый удобный в реальных приложениях. Он заключается в том, что вы вначале создаете шаблон нужного вам документа (договора, приходного ордера, отчета и т.п.), в который при создании помещаете закладки в тем места, в которые потом потребуется произвести вставку данных. Затем программным способом для каждой закладки создается объект Range, и уже с его помощью производится ввод информации (данные о заказчике, сумма в кассовом ордере и т.п.)
Для целей отладки (чтобы убедиться, что объект Range действительно включает в себя тот участок текста, который вы планировали) можно создавать на основе объекта Range объект Selection (то есть выделять диапазон). Для этого у объекта Range предусмотрен метод Select().
Большая часть свойств и методов объекта Range совпадает с аналогичными свойствами и методами объекта Selection (которые мы уже рассмотрели), поэтому рассматривать здесь мы их не будем. Точно так же чаще всего для объекта Range используется одно-единственное свойство Text, которое позволяет ввести в место в документе, представленное этим объектом, нужный текст. Ниже приведена информация о некоторых уникальных методах объекта Range:
- InsertDatabase() — возможно, самый простой метод вставить результат запроса к базе данных в файл Word. Генерирует таблицу на основе возвращаемого результата запроса и вставляет ее по месту, определенному объектом Range. Умеет работать по ODBC, DDE, есть встроенные средства работы с MS Access. Возможности этого метода очень ограничены, поэтому рекомендуется использовать его только в самых простых случаях. Во всех остальных случаях лучше использовать объектную библиотеку ADO (см. предыдущую главу). Пример обращения к файлу Access средствами этого метода может выглядеть так:
With Selection
.Collapse Direction:=wdCollapseEnd
.Range.InsertDatabase _
Format:=wdTableFormatSimple2, Style:=191, _
LinkToSource:=False, _
Connection:="Table.Поставщики", _
DataSource:="C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Борей.mdb"
End With
- IsEqual() — возможность сравнить два объекта Range (или объект Selection и объект Range). Если совпадают начальная позиция в документе, конечная позиция и document story, возвращается True.
- FoneticGuide() — возможность вставить транскрипцию над текстом в документе.
- Relocate() — возможность переставить местами абзацы в диапазоне.
- Select() — как уже говорилось, возможность создать объект Selection на основе объекта Range (то есть просто выделить весь текст в этом объекте). Очень удобно для отладочных целей.
- SetRange() — один из самых важных методов объекта Range. Позволяет изменять этот объект. Например, получить объект Range, в который будет входить текст от начала документа до текущей позиции курсора (или конца выделения), можно при помощи команд
Dim MyRange As Range
Set MyRange = ActiveDocument.Range(Start:=0, End:=0)
MyRange.SetRange Start:=MyRange.Start, End:=Selection.End
MyRange.Select 'для целей демонстрации