Стив Каммингс - VBA для чайников
Объекты Selection также обладают свойством Range. Это значительно упрощает использование свойств и методов, принадлежащих объектам Range существующих выделенных областей. Приведенный ниже пример присваивает диапазон выделенной области переменной, перемещает выделенную область, после чего преобразует текст прописными буквами:
Set deRange = Selection.Range
Selection.Move Unit := wdParagraph, Count := 3
DeRange.Case = wdLowerCase
Определение диапазонов с помощью метода Range
Если существующие объекты не содержат текст, с которым вы хотите работать, создайте собственный объект Range. В любом открытом документе вы сможете определить столько объектов Range, сколько вам нужно. При этом используется метод Range документа, который требует от вас указания начальной и конечной точек диапазона в терминах расположения символа в документе. Например, ознакомьтесь со следующим примером:
ActiveDocument.Range(Start:= 10, End:=2 0)
Приведенное выше выражение представляет собой объектную ссылку на диапазон, который начинается с 11-го символа и заканчивается 20-м символом. Значение расположения символа на самом деле означает место слева от данного символа. Например, значение, равное 0, соответствует первому символу в документе, а значение 10 указывает на точку между 10-м и 31-м символами. Word считает все символы в документе, включая скрытые и непечатаемые знаки.
Для создания диапазона, который станет всего лишь местом расположения и не содержит никакого текста, присвойте начальному и конечному значениям, определяющим диапазон, одно и то же число. Для включения в объект Range всего документа используйте метод Range этого документа без каких-либо аргументов или же используйте свойство Content документа.
Объект Range создать совсем несложно (если вам известны положения начального и конечного символов, которые вы решили включить в диапазон).
Проблема возникает в том случае, когда вам необходимо работать с произвольным количеством символов в произвольном месте документа. Чаще всего вам необходимо работать с текстом в определенной части документа. Вы можете начать диапазон с существующей закладки, с начала выделенной области или с определенного слова или фразы, о наличии которых в документе вам точно известно.
Для определения диапазона, базирующегося на одном из подобных критериев, используйте свойства Start или End объекта Selection, Range или Bookmark, чтобы определить месторасположение в документе интересующего вас символа. Если вам необходимо создать состоящий из десяти символов диапазон, который будет начинаться с вкладки Forget MeNot, вам пригодится следующая инструкция;
With ActiveDocument
Set myEkMark = .Bookmarks("ForgretMeNot")
Set homeOnTheRange = _
.Fange( Start := myBkMark, End := myBkMark + 10)
End With
Ниже приведен еще один пример, иллюстрирующий использование свойства Range для поиска абзаца, определения в нем некоторого слова, а также создания нового диапазона, начинающегося с этого слова. В данном случае аргумент End опущен, поэтому диапазон начинается с указанного слова и продолжается до окончания документа:
With ActiveDocument
Set firstWord = .Paragraphs(160).Range.Words(3)
Set RangeTop = .Range( Start := first Word.Start )
End With
В разделе "Поиск и замена текста с помощью VBA в Word", дальше в настоящей главе, я покажу, что использование ключевого слова Find совместно с диапазоном или выделенной областью определяет объект, который будет содержать только найденный текст. После того как инструкция Find найдет в диапазоне или выделенной области фразу, свойства Start и End того же диапазона или выделенной области теперь будут указывать на начало и конец найденного текста.
Работа с текстом в Word VBA
Объекты Range и Selection являются отправными точками для практически любых операций, которые вы сможете выполнять с текстом с помощью Word VBA. Некоторые из этих действий можно применять к документам в целом, но в общем случае вам необходим диапазон или выделенная область, прежде чем вносить изменения.
У объектов Range и Selection достаточно много общего, но есть и несколько ключевых отличий. Оба объекта представляют непрерывные последовательности символов, над которыми вы сможете выполнять различные операции. Оба объекта имеют много общих свойств и методов. Однако некоторые свойства и методы уникальны для выделенных областей, а другие - для диапазонов. Значительные различия состоят и в том, что объект Selection соответствует выделению в области окна: тексту, графическому изображению или любому другому объекту, в то время как объекты Range существуют независимо от выделенной области и всегда содержат текст.
Используйте объект Selection в том случае, если ваша процедура зависит от пользователя, например, он должен указать текст, с которым будут проведены определенные действия, или в том случае, если вам необходимо показать пользователю, какой именно текст будет изменен. В других ситуациях намного лучше подходят объекты Range. Они обеспечивают большую скорость выполнения программ и меньше отпугивают пользователя: Word обновляет содержимое экрана при каждом изменении содержимого выделенной области, а при изменении диапазона содержимое экрана не обновляется. Кроме того, изменения диапазонов не отражаются на выделенных областях, созданных пользователем.
Несмотря на их различия, объекты Selection и Range можно создавать один из другого. Эта возможность оказывается чрезвычайно важной, так как многие функции редактирования работают только с диапазонами. В противоположность этому, единственный способ отобразить содержимое диапазона пользователю- выделить его. Используйте следующие простые приемы.
* Для выделения диапазона используется его метод Select. Например, для объекта RangeR команда имеет вид RangeR. Select.
* Для получения доступа к диапазону, представляющему то же содержимое, что и выделенная область, используется свойство Range.
Помните: если метод, относящийся к текстовым данным, вызывается для диапазона, а вы хотите применить его к выделенной области, просто включите в свой код инструкцию Selection . Range . ИмяМетода.
Word VBA предлагает целый ряд методов для перемещения и изменения размеров диапазонов и выделенных областей. В настоящем разделе я рассматриваю только самые важные из них; для знакомства с другими методами вам придется обращаться к справочной системе.
Метод Expand увеличивает существующий диапазон или выделенную область, добавляя блок текста в их конец. Блок может представлять собой символ, слово, абзац или что-нибудь другое. Вы можете добавить только один заранее определенный блок; кроме того, добавление подобных блоков в начале диапазона или выделенной области не допускается.
Для добавления к выделенной области слова, которое будет следовать сразу за ней, используйте такую инструкцию:
Selection.Expand(wdWord)
Вы можете использовать любую из следующих констант для расширения объекта; wdCharct er, wdWord, wdSent ence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow, wdTable и (только для объектов Selection) wdLine. По умолчанию используется константа wdWord.
Теперь нам следует остановиться на одном щекотливом моменте: объекты Selection (но не диапазоны) также содержат метод Expand. Этот метод включает соответствующее средство Word, которое позволяет расширять выделенную область при перемещении указателя мыши. Каждый раз, когда программа вызывает метод Extend, выделенная область увеличивается на блок текста, который следует сразу за точкой вставки: текущее слово, предложение, абзац, выделенный фрагмент пли целый документ. Если вы указали аргумент в виде одного символа, например, Selection.Expand ( "С" ). выделенная область будет расширена вплоть до первого встретившегося указанного символа.
Word VBA позволяет вам повторно определять начало и конец диапазона или выделенной области. Только имейте в виду, что методы, в имени которых присутствует слово Move, изменяют расположение диапазона или выделенной области: они не перемещают текст, который содержится в указанном объекте.
Метод Move изменяет диапазон или выделенную область, начиная с их сжатия, отмечая их расположение, а в них уже нет никакого текста. Расположение совпадает с началом исходного объекта. После этого метод Move перемещает "сжатый" объект в соответствии с вашими инструкциями. По окончании перемещения вы можете использовать методы Expand и Mover,nd для наполнения объекта текстом.
Приведенный ниже пример перемещает именованный диапазон в документе на два абзаца назад. Обратите внимание на то, что вы используете именованную константу в качестве значения аргумента Uni t (список всех допустимых именованных констант приведен в разделе
"Расширение диапазонов и выделенных областей" раньше в этой главе). Аргумент Count представляет собой целое положительное число, если вы хотите перемешать объект вперед по документу (т.е. к его концу), или отрицательное, если вы хотите перемещать объект назад по документу. В приведенном ниже примере аргументы не заключены в скобки, поскольку возвращенное методом значение (количество перемещенных элементов) здесь не используется: