О стоимости курса |
Редактирование документов, автоматически выполняемые макросы
11.1. Объект Selection
Выше нам уже встречался и объект Selection, и объект Range. Здесь пришло время поговорить о них подробнее, обсудить особенности их использования.
Напомню, что объект Application.Selection представляет собой выделенный участок документа или, если ничего не выделено, позицию курсора. Именно этим объектом пользуется макрорекордер при записи макроса, выполняющего какие-либо операции с текстом.
У Selection есть два основных применения. Первое — автоматическое создание документов, не требующее правки шаблонов и других подобных операций. И второе — работа с фрагментом документа, предварительно выделенного пользователем.
Выделения можно создавать и программно, но эту методику практически никогда не используют на практике. Например, код листинга 11.1 выделяет седьмое слово в документе и форматирует его курсивом:
ActiveDocument.Words.Item(7).Select Selection.Font.Italic = TrueЛистинг 11.1. Выделяем седьмое слово и форматируем его
Предположим, мы используем такую конструкцию в шаблоне для автоматического форматирования текста. Если мы правильно рассчитаем номер слова, которое нужно отформатировать (или отредактировать, вставить в документ и т.д.) — то все будет работать правильно. Но стоит нам отредактировать шаблон — даже совсем немного, но так, что количество слов в нем изменится, наш макрос будет работать неправильно.
Объект Selection обычно используют без объявления объектной переменной. Например, для вставки в выделенную позицию документа текста "Привет" достаточно конструкции листинга 11.2.
Selection.Text = "Привет"Листинг 11.2. Добавляем текст в выделенную позицию документа
Минус использования Selection при автоматической обработке текста зависит от того, что он слишком чувствителен к действиям пользователя. Например, мы напишем программу, которая, имитируя выделение фрагментов текста с клавиатуры, обрабатывает текст. Если во время обработки текста пользователь вмешается, случайно кликнув мышью в документе, работа такой программы будет нарушена.
Рассмотрим основные свойства и методы объекта Selection.
11.2. Методы объекта Selection
11.2.1. ClearFormatting — очистить форматирование
Этот метод очищает форматирование выделенного участка документа.
11.2.2. Copy, Cut, Paste, Delete
Методы Copy и Cut, соответственно, копируют и вырезают выделенный фрагмент в буфер обмена, а метод Paste — вставляет материалы из буфера в область выделения.
Метод Delete удаляет выделенный фрагмент
11.2.3. InsertAfter, InsertBefore — добавление текста
Как следует из их названий, методы InsertAfter и InsertBefore позволяют вставить текст после или до выделения. Существуют и другие методы, название которых начинается с Insert. Они позволяют вставлять множество других объектов в выделенную область. Например, InsertBreak вставляет разрыв страницы, колонки или раздела, InsertCells вставляет в выделенную таблицу ячейки и т.д.
11.2.4. TypeBackspace — удалить символ
Удаляет один символ, предшествующий позиции курсора, имитируя нажатие клавиши Backspace на клавиатуре.
11.2.5. TypeParagraph — перевод строки
Имитирует нажатие клавиши Enter на клавиатуре — вставляет в текст знак перевода строки.
11.2.6. TypeText — вывести текст в документ
Вводит в документ текст. У метода есть лишь один параметр — Text. Он должен содержать тот текст, который должен быть выведен в документ. Ниже мы рассмотрим примеры, где используется этот метод.
11.2.7. WholeStory — выделить весь документ
Позволяет выделить весь документ. Пожалуй, это единственный удобный метод программного управления выделением.
11.3. Свойства объекта Selection
11.3.1. Bookmarks и другие
Это свойство возвращает коллекцию Bookmarks, которая содержит все закладки, имеющиеся в выделении. Существуют подобные свойства для символов ( Characters ), таблиц ( Tables ) и многих других коллекций объектов. Работа с ними ни чем не отличается от работы с аналогичными коллекциями, входящими в Document.
11.3.2. End и Start
Эти свойства позволяют узнать и модифицировать, соответственно, конечную ( End ) и начальную ( Start ) позиции выделения.
11.3.3. Font — шрифт
Это свойство позволяет узнавать и настраивать параметры шрифта выделенного фрагмента. Например, код, приведенный в листинге 11.3 форматирует текст. Пояснения к примеру приведены в комментариях.
'Полужирный Selection.Font.Bold = wdToggle 'Курсивный Selection.Font.Italic = wdToggle 'Подчеркнутый Selection.Font.Underline = wdUnderlineSingle 'Гарнитура Arial Narrow Selection.Font.Name = "Arial Narrow" 'Размер шрифта - 14 Selection.Font.Size = 14 'Цвет шрифта - красный - из 'перечисления wdColorR Selection.Font.Color = wdColorRedЛистинг 11.3. Форматируем текст
11.3.4. Information — подробности о выделении
Позволяет узнать подробности о выделении. Это свойство может принимать параметр типа wdInformation, который и определяет, что именно возвратит свойство.
11.3.5. Range — переход от Selection к Range
Это свойство позволяет получить объект Range, соответствующий выделению.
Например, этим свойством можно воспользоваться так, как показано в листинге 11.4.
Dim obj_Range As Range Set obj_Range = Selection.RangeЛистинг 11.4. Получаем объект Range из Selection
11.3.5. Text — текст выделения
Это свойство позволяет получить текст, содержащийся в выделении, и изменить его.
11.4. Пример работы с Selection
11-01-Selection.docm— пример к п. 11.4.
Рассмотрим пример использования вышеперечисленных свойств и методов (а заодно – и некоторых других), решив небольшую задачу.
11.4.1. Задание
Создать новый документ, и добавить в него текст, который был выделен в текущем документе. Каждое слово этого текста надо напечатать отдельно, с новой строки. Каждое слово должно предваряться таким текстом: "Слово №x:", где x — номер слова в выделенном тексте. После вывода слов нужно подсчитать количество слов и количество букв в этих словах и вывести строку "Всего обработано "x" слов, состоящих из "xx" букв". Готовый документ сохранить на диске C:\, задав в качестве его имени такую структуру:
"Имя_исходного_документа"+ "текущая дата"+ "обработано".docm
После того, как слова будут выведены, нужно заключить выделенный участок исходного документа в скобки, отметить синим цветом шрифта и выделить первый символ текущего выделения.
11.4.2. Решение
Создадим новый макрос ( Copy_To_File ), воспользовавшись окном Макросы, которое можно открыть с вкладки Вид.
Добавим в макрос код из листинга 11.5.
'Переменая для хранения ссылки на новый документ Dim obj_NewDoc As Document 'Для ссылки на исходный документ Dim obj_OurDoc As Document 'Динамический массив для хранения слов Dim WordsArray() As String 'Переменная для хранения количества слов Dim WordsCount 'Переменная для формирования строк, 'которые выводятся в новый документ Dim OutString 'Переменная для хранения количества 'символов в обработанных словах Dim LettersCount 'В этой переменной будем создавать 'имя файла Dim NewDocName 'Запишем ссылку на активный документ 'Для того, чтобы вернуться в него 'после работы с новым документом Set obj_OurDoc = ActiveDocument WordsCount = Selection.Words.Count LettersCount = Selection.Characters.Count ReDim WordsArray(WordsCount) 'Переносим слова из выделения 'в массив для удобства работы с ними For i = 1 To WordsCount WordsArray(i) = Selection.Words.Item(i) Next i 'Создадим новый документ Set obj_NewDoc = Documents.Add 'И сделаем его активным obj_NewDoc.Activate 'Теперь объект Selection относится к активному 'документу и мы начинаем вводить в него данные Selection.TypeText ("Список выделенных слов") Selection.TypeParagraph For i = 1 To WordsCount OutString = "Слово №" + Str(i) + ": " + _ WordsArray(i) Selection.TypeText (OutString) Selection.TypeParagraph Next i Selection.TypeText ("Всего обработано " + _ Str(WordsCount) + _ " слов(а), в которых содержится " + _ Str(LettersCount) + " символа(ов)") 'Создаем имя нового документа NewDocName = obj_OurDoc.Name + " " + _ Str(Date) + " Обработано.docx" 'Установим корневой каталог диска C: 'для сохранения нового файла по умолчанию ChangeFileOpenDirectory "C:\" 'Используем метод SaveAs для 'автоматического сохранения 'документа ActiveDocument.SaveAs _ FileName:=NewDocName, _ FileFormat:=wdFormatDocumentDefault 'Закрываем активный документ ActiveDocument.Close 'Активируем документ, в котором мы выделяли 'слова obj_OurDoc.Activate 'Отмечаем обработанный участок 'скобками и выделением синим цветом Selection.InsertAfter (") ") Selection.InsertBefore (" (") Selection.Font.Color = wdColorBlue 'Выделяем первый символ текущего выделения и 'выводим сообщение о том, что операция 'выполнена Selection.Characters(1).Select MsgBox ("Выполнено!")Листинг 11.5. Решение задачи
Как видите, в этом примере мы используем исключительно объект Selection для работы с текстом документов. Обратите внимание на то, что мы нигде специально не храним информацию о выделенной области первого документа. Создав второй документ, мы просто делаем его активным и работаем с ним, используя его объект Selection. В это время выделение сохраняется в исходном документе. Однако, если в это время пользователь случайно или умышленно изменит выделение текущего документа — программа будет работать неправильно — она выделит не тот фрагмент, который был передан ей для обработки, а совсем другой.