* определив диапазоны с помощью метода Range объекта Document.
Использование свойства Range
Открытый документ Word уже содержит объекты Range, соответствующие многим его элементам. Каждый абзац, а также таблица, отдельная ячейка таблицы, комментарий или нижний колонтитул (и это далеко не полный список) определяют диапазоны. Вы можете считать, что все эти диапазоны существуют в некотором виртуальном мире, пока не вы не обратитесь к ним с помощью свойства Range соответствующего объекта. Например, для определения объекта Range, соответствующего первому абзацу активного документа, вам следует использовать объектную ссылку следующего вида.
ActiveDocumep.t. Paragraphs (1) . Range
Поскольку подобные стандартные диапазоны уже существуют в Word, вы можете использовать объектные ссылки на них напрямую, обходясь без каких-либо переменных. Это особенно хорошо подходит для тех ситуаций, когда вам необходим один конкретный диапазон для одной операции. Например, приведенная ниже инструкция копирует вторую таблицу в документе в буфер обмена, используя метод Сору объекта Range:
ActiveDocument.Tabl es[2) .Range.Copy
Если несколько инструкций используют один и тот же диапазон, вы можете использовать конструкцию With... для ускорения как ввода кода программы, так и ее выполнения. Ниже приведен пример кода, который проводит сортировку абзацев в третьем разделе документа, отображая первое предложение полужирным:
With ActiveDocument.Section(3).Range
.Sort Sort Order := wdSortOrderAscending
.Sentences ( 1).Range.Bold = True
End With
Приведенный выше пример иллюстрирует, как объект Range содержит другие объекты, в свою очередь содержащие диапазоны. Инструкция в третьей строке обращается к дипазону, соответствующему первому предложению в исходном диапазоне, после чего отображает его полужирным. Также обратите внимание на то, что вы не можете применить форматирование непосредственно к объектам, таким как слова, предложения или абзацы; для того чтобы это сделать, вам следует использовать их свойства Range.
Если вы планируете использовать диапазон в нескольких инструкциях, которые не следуют одна за другой, вам придется присвоить диапазон переменной. Это позволит вам быстрее составить код программы, а также в конечном итоге ускорить ее выполнение.
Объекты 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 можно создавать один из другого. Эта возможность оказывается чрезвычайно важной, так как многие функции редактирования работают только с диапазонами. В противоположность этому, единственный способ отобразить содержимое диапазона пользователю- выделить его. Используйте следующие простые приемы.