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. Решение задачи (html, txt)
Как видите, в этом примере мы используем исключительно объект Selection для работы с текстом документов. Обратите внимание на то, что мы нигде специально не храним информацию о выделенной области первого документа. Создав второй документ, мы просто делаем его активным и работаем с ним, используя его объект Selection. В это время выделение сохраняется в исходном документе. Однако, если в это время пользователь случайно или умышленно изменит выделение текущего документа — программа будет работать неправильно — она выделит не тот фрагмент, который был передан ей для обработки, а совсем другой.
