VBA Word, как это делается
Продолжение. Начало в ©7,11
Методов у объекта Document более 50, некоторые из них мы рассмотрим ниже (табл. 1).
Так как методы объектов предназначены для выполнения каких-либо действий над объектом, их можно попробовать каким-то образом сгруппировать для удобства пользования. Из представленных в таблице методов можно выделить группы методов, такие как методы Save и SaveAs, которые отвечают за сохранение и производство копий документа; методы ClosePrintPreview и PrintPreview, имеющие отношение к просмотру документа перед печатью; методы RemoveNumbers, Protect и UnProtect имеют отношение к защите документа от изменений; методы Redo, Undo и UndoClear - к возможности возврата действий; методы AutoFormat, CopyStylesFromTemplate и FitToPages - к формату документа. А методы GoTo, Range и Select, пожалуй, самые востребованные при работе с документом, они позволяют выделить часть документа и представить его как объект для обработки.
Рассмотрим примеры применения методов. Метод Сlose
Синтаксис метода:
выражение.Close(SaveChanges, OriginalFormat, RouteDocument)
где
выражение - выражение, которое возвращает объект Document или Documents.
SaveChanges - необязательный параметр. Определяет сохраняющееся действие для документа. Возможна одна из следующих WdSaveOptions констант:
wdDoNotSaveChanges - не сохранять,
wdPromptToSaveChanges - выдать запрос перед сохранением,
wdSaveChanges - сохранить без предупреждения.
OriginalFormat - необязательный параметр, определяет формат сохранения для документа. Возможна одна из следующих WdOriginalFormat констант:
wdOriginalDocumentFormat - в оригинальном формате документа (не изменяя его),
wdPromptUser - по выбору пользователя,
wdWordDocument - формат Word (.doc).
RouteDocument - необязательный параметр. True, если документ направляется следующему получателю.
Эта строка кода закрывает и сохраняет без какого-либо предупреждения активный документ.
ActiveDocument.Close SaveChanges:=wdSaveChanges
Следующий код выдает перед закрытием активного документа запрос на его сохранение. Если пользователь нажимает кнопку "Отмена" в диалоговом окне, то генерируется ошибка 4198 (команда потерпела неудачу) и отображается соответствующее сообщение, если нажимается кнопка "Нет", то документ закрывается без сохранения изменений.
On Error GoTo МеткаОшибки
ActiveDocument.Close SaveChanges: =wdPromptToSaveChanges, OriginalFormat:= wdPromptUser
МеткаОшибки:
If Err = 4198 Then MsgBox "Закрытие документа отложено" Метод ComputeStatistic
Синтаксис метода:
выражение.ComputeStatistics(Statistic, IncludeFootnotesAndEndnotes)
где
выражение - выражение, которое возвращает объект Document.
Statistic - обязательный параметр, задающий вид статистики. Может быть задан одной из следующих WdStatistic констант:
wdStatisticCharacters - подсчет символов,
wdStatisticCharactersWithSpaces - подсчет символов вместе с пробелами,
wdStatisticLines - подсчет строк,
wdStatisticPages - подсчет страниц,
wdStatisticParagraphs - подсчет параграфов,
wdStatisticWords - подсчет слов.
IncludeFootnotesAndEndnotes - необязательный параметр. Задается равным True, чтобы включить сноски и концевые сноски. Значение параметра по умолчанию False.
Следующий макрос отображает число слов, символов и пробелов в третьем параграфе активного документа.
Public Sub статистика()
'определяем объект для статистики
Set myRange = ActiveDocument.Paragraphs(3).Range
'запоминаем число слов в переменной
wordCount = myRange.ComputeStatistics(Statistic:=wdStatisticWords)
'запоминаем число символов
charCount = myRange.ComputeStatistics(Statistic:=wdStatisticCharacters)
'запоминаем число пробелов
spacecount = myRange.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces)
'формируем вид диалогового окна
MsgBox "Третий параграф содержит всего"_
& Chr(13) & "слов " & wordCount _' функция CHR(13) возвращает символ Конец абзаца,т.е.
& Chr(13) & "символов " & charCount _' мы при помощи этой функции как бы нажимаем на
& Chr(13) & "включая пробелы " & spacecount ' клавишу ENTER
End Sub Чтобы вывести статистику о выбранном фрагменте текста в документе (рис. 1), требуется всего лишь сменить объект статистики, а для этого меняем первую строку макроса. В следующем коде vbCr - это константа Visual Basic, которая задает конец абзаца.
Public Sub статистика()
'задаем объект статистики
Set myRange = Selection.Range
wordCount = myRange.ComputeStatistics(Statistic:=wdStatisticWords)
charCount = myRange.ComputeStatistics(Statistic:=wdStatisticCharacters)
spacecount = myRange.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces)
MsgBox "В выбраном фрагменте текста содержится всего " _
& vbCr & "слов " & wordCount _
& vbCr & "символов " & charCount _
& vbCr & "включая пробелы " & spacecount
End Sub Метод FitToPages
Синтаксис метода:
выражение.FitToPages
где
выражение - выражение, которое возвращает объект Document.
В следующем макросе делается попытка уменьшить индекс страницы активного документа на единицу. Так как метод может сгенерировать ошибку, необходимо предусмотреть реакцию на нее.
On Error GoTo errhand
ActiveDocument.FitToPages
errhand:
If Err = 5538 Then MsgBox "Уменьшение страниц невозможно"
Следующий код примера пытается уменьшать на одну страницу каждый открытый документ из набора Documents.
For Each doc In Documents
doc.FitToPages
Next doc Метод PrintOut
Синтаксис метода:
выражение.PrintOut(Background, Append, Range, OutputFileName, From, To, Item, Copies, Pages, PageType, PrintToFile, Collate, FileName)
где
выражение - выражение, которое возвращает Application, Document или объект Window.
Background - необязательный параметр, если нужна печать в фоновом режиме, то этот параметр устанавливается в True.
Append - необязательный параметр. True, если нужно добавить документ в файл вывода, указанный параметром OutputFileName. False , если записать поверх содержания OutputFileName.
Range - необязательный параметр. Диапазон страницы. Может быть одна из следующих WdPrintOutRange констант:
WdPrintAllDocument - печатать весь документ,
WdPrintCurrentPage - печатать текущую страницу,
WdPrintFromTo - печать выбранных страниц,
WdPrintRangeOfPages - печать диапазона страниц,
WdPrintSelection - печать выбранного фрагмента.
OutputFileName - необязательный параметр. Если PrintToFile в True, этот параметр определяет путь и имя выходного файла.
From - необязательный параметр. Номер первой страницы, если параметр Range установлен в wdPrintFromTo.
To - необязательный параметр. Номер последней страницы, когда Range установлен в wdPrintFromTo.
Item - необязательный параметр. Элемент, который будет напечатан. Может быть одна из следующих WdPrintOutItem констант: wdPrintAutoTextEntries, wdPrintComments, wdPrintDocumentContent, wdPrintKeyAssignments, wdPrintProperties или wdPrintStyles.
Copies - необязательный параметр. Определяет число копий, которые будут напечатаны.
Pages - необязательный параметр. Номера страниц и диапазоны номеров страниц, которые будут напечатаны, разделенные запятыми. Например, " 2, 6-10 " (страница 2 и страницы с 6 по 10).
PageType - необязательный параметр. Тип страниц, которые будут напечатаны. Может быть одна из следующих WdPrintOutPages констант: wdPrintAllPages, wdPrintEvenPagesOnly или wdPrintOddPagesOnly. (Все страницы диапазона, четные или нечетные листы.)
PrintToFile - необязательный параметр. True, чтобы переслать выводимый документ в файл. Нужно определить имя файла в OutputFileName.
Collate - необязательный параметр. При печати многократных копий документа, True, если печатается весь документ перед печатью следующей копии.
FileName - необязательный параметр. Путь и имя файла документа, который будет напечатан. Если этот параметр опущен, печатается активный документ. Параметр доступен только с объектом Application.
Следующая строка кода печатает текущую страницу из активного документа:
ActiveDocument.PrintOut Range:=wdPrintCurrentPage
Следующая строка кода печатает первые три страницы документа из активного окна.
ActiveWindow.PrintOut Range:=wdPrintFromTo, From:="1", To:="3"
Метод RunAutoMacro
Синтаксис метода:
выражение.RunAutoMacro (Which)
где
выражение - выражение, которое возвращает объект Document.
Which - обязательный параметр. Определяет автомакрокоманду для выполнения. Это может быть одна из следующих WdAutoMacros констант: wdAutoClose, wdAutoExec, wdAutoExit, wdAutoNew, или wdAutoOpen.
Следующая строка кода запускает на выполнение макрокоманду AutoOpen в активном документе.
ActiveDocument.RunAutoMacro Which:=wdAutoOpen Метод Save
Метод Save имеет три вида синтаксиса.
Синтаксис 1:
выражение.Save
Сохраняет указанный документ или шаблон. Если документ или шаблон не был сохранен прежде, диалоговое окно Save As запрашивает пользователя относительно имени файла.
Синтаксис 2:
выражение.Save(NoPrompt, OriginalFormat
Сохраняет все документы в наборе Documents. Если документ не был сохранен прежде, диалоговое окно Save As запрашивает пользователя относительно имени файла.
Синтаксис 3:
выражение.Save(Comment)
Сохраняет версию указанного документа с комментариями.
Выражение - в синтаксисе 1 это выражение, которое возвращает объект Document или Template.
В синтаксисе 2 выражение, которое возвращает объект Documents.
В синтаксисе 3 выражение, которое возвращает объект Versions.
NoPrompt - необязательный параметр. Если он равен True, то Word автоматически сохраняет все документы. Если False, то Word запрашивают пользователя о сохранении каждого документа, в который были внесены изменения после последнего сохранения.
OriginalFormat - необязательный параметр. Определяет формат, под которым сохраняются документы. Может быть одна из следующих WdOriginalFormat констант: wdOriginalDocumentFormat, wdPromptUser, или wdWordDocument.
Comment - необязательный параметр. Определяет строку комментариев для сохранения в версии файла.
Следующая строка кода сохраняет активный документ, если в него были внесены изменения с последнего сохранения.
If ActiveDocument.Saved = False Then ActiveDocument.Save
Следующий код автоматически сохраняет каждый документ в наборе Documents без первого запроса к пользователю.
Documents.Save NoPrompt:=True, OriginalFormat:=wdOriginalDocumentFormat Метод SaveAs
Синтаксис метода:
выражение. SaveAs (FileName, FileFormat, LockComments, Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter)
где
выражение - выражение, которое возвращает объект Document.
FileName - необязательный параметр. Имя для документа. Значение по умолчанию - текущая папка и имя файла. Если документ ранее не был сохранен, используется имя, заданное по умолчанию (например, Doc1.doc). Если документ с указанным именем файла уже существует, то документ записывается поверх без начального запроса пользователя.
FileFormat - необязательный параметр. Определяет формат для сохранения документа. Может быть одна из следующих WdSaveFormat констант: wdFormatDocument, wdFormatDOSText, wdFormatRTF, wdFormatDOSTextLineBreaks, wdFormatTemplate, wdFormatText, wdFormatTextLineBreaks, или wdFormatUnicodeText.
LockComments - необязательный параметр. True, чтобы блокировать документ для комментариев.
Password - необязательный параметр. Строка пароля для открытия документа.
AddToRecentFiles - необязательный параметр. True, чтобы добавить документ в список недавно используемых файлов в меню File.
WritePassword - необязательный параметр. Строка пароля для защиты от изменений документа.
ReadOnlyRecommended - необязательный параметр. True, для того чтобы Word предлагал состояние "только для чтения" всякий раз при открытии документа.
EmbedTrueTypeFonts - необязательный параметр. True для сохранения шрифтов TrueType в документе.
SaveNativePictureFormat - необязательный параметр. Если графика была импортирована из Macintosh, True, чтобы сохранить только версию Windows импортированной графики.
SaveFormsData - необязательный параметр. True, чтобы сохранить данные, введенные пользователем в форме как запись данных.
SaveAsAOCELetter - необязательный параметр. Если документ имеет приложенный mailer, то True, чтобы сохранить документ.
Следующая строка кода сохраняет активный документ как Test.rtf в текстовом формате RTF.
ActiveDocument.SaveAs FileName:= "Text.rtf", FileFormat:=wdFormatRTF
Следующий пример сохраняет активный документ в формате текстового файла, с расширением ".txt".
Здесь функция InStr используется для определения позиции первого вхождения одной строки в другую строку. С ее помощью находится позиция точки (.), отделяющей имя файла от его расширения.
myDocname = ActiveDocument.Name
pos = InStr(myDocname, ".")
If pos > 0 Then 'если точка обнаружена
myDocname = Left(myDocname, pos - 1) 'имя свобождается от точки
myDocname = myDocname & ".txt" 'добавляется расширение
ActiveDocument.SaveAs FileName:=myDocname, FileFormat:=wdFormatText
End If
Следующий код сохраняет документ "MyDoc.doc" с паролем защиты от изменений и затем закрывает документ.
With Documents("MyDoc.doc")
.SaveAs WritePassword:="8марта"
.Close
End With Метод Range
Метод Range является одним из самых популярных методов объекта Document.
Синтаксис метода:
выражение.Range(Start, End)
где
выражение - выражение, которое возвращает объект Document.
Start - стартовая позиция символа.
End - конечная позиция символа.
Значения символьных позиций текста начинаются с 0 (нулевой) в начале документа. Считаются все символы, включая скрытые и непечатаемые. Если не определяется стартовая и конечная позиции, весь документ будет возвращен как объект Range.
Следующая строка кода применяет полужирное форматирование к диапазону из первых 10 символов в активном документе.
ActiveDocument.Range(Start:=0, End:=10). Bold = True
Следующая строка кода создает диапазон, который начинается в начале активного документа и заканчивается в конце выбора. Если текст в документе не выбран, то Selection.End возвратит точку, где находится курсор. Диапазон в этом случае будет определен от начала документа до точки курсора.
Set myRange = ActiveDocument.Range (Start:=0, End:=Selection.End)
Этот пример создает переменную диапазона myRange, описывая параграфы с начала третьего по конец шестого в активном документе.
Set aDoc = ActiveDocument
If aDoc.Paragraphs.Count >= 6 Then
Set myRange = aDoc.Range(aDoc.Parag-raphs(3).Range.Start, aDoc.Paragraphs(6). Range.End)
End If Метод Select
Другим важным методом объекта Document является метод Select, который возвращает выбор в тексте как объект.
Синтаксис метода:
выражение.Select
где
выражение - выражение, которое возвращает объект Document.
Следующий код выбирает первый параграф в активном документе.
ActiveDocument.Paragraphs(1).Range.Select
А этот пример выбирает строку 1 в таблице 1 в Report.doc.
Documents("Report.doc").Tables(1).Row-s(1).Select События объекта Document
Событий у объекта Document всего три и нам не составит труда их все рассмотреть (табл. 2).
Как видно из таблицы 2, объект Document поддерживает три события - Close, New и Open. Процедуры, отвечающие на эти события, следует записывать в модуле класса с именем "ThisDocument".
Чтобы записать процедуру обработки события, нужно предпринять ряд действий:
1. В окне Проект редактора VBA, под проектом Normal или проектом вашего документа, установите курсор на строке ThisDocument и дважды щелкните (или нажмите кнопку Программа в этом же окне) (рис. 2).
2. Выберите строку Document из раскрывающегося списка объектов (рис. 3).
3. Выберите событие из раскрывающегося списка процедур (рис. 4).
Пустая подпрограмма будет добавлена к модулю класса.
4. Введите в процедуру команды Visual Basic, которые вам нужно выполнить, когда произойдет событие. Событие Close
Синтаксис заголовка процедуры:
Private Sub Document_Close ()
Замечание. Если процедура события сохранена в шаблоне, то она выполнится, когда документ, основанный на том шаблоне, закрыт и когда сам шаблон закрыт (если он был открыт как документ).
Следующий пример показывает процедуру обработки события Close в проекте документа, которая выполняется только при закрытии документа.
Private Sub Document_Close ()
MsgBox " Закрытие документа "
Конец Sub
Следующий пример делает резервную копию документа на файл-сервере при закрытии документа. (Процедура сохранена в документе, не в шаблоне.)
Private Sub Document_Close()
ThisDocument.Save
ThisDocument.SaveAs "\\network\backup\" & ThisDocument.Name
End Sub Событие New
Синтаксис события:
Private Sub Document_New ()
Замечание. Процедура для события New выполняется, только если она сохранена в шаблоне. То есть, ее надо поместить в модуль класса ThisDocument в шаблоне Normal или в другом, если вы используете свой шаблон.
Следующий пример показывает процедуру события New в проекте Normal, которая выполнится, когда будет создан новый документ, основанный на шаблоне Normal.
Private Sub Document_New ()
MsgBox " Новый документ был создан "
Конец Sub
Следующий пример упорядочивает все открытые окна, когда создан новый документ, основанный на шаблоне. (Процедура была сохранена в шаблоне, не в документе.)
Private Sub Document_New()
Application.Windows.Arrange wdTiled
End Sub Событие Open
Синтаксис события:
Private Sub Document_Open ()
Замечание. Если процедура события сохранена в шаблоне, то она выполнится, когда новый документ, основанный на том шаблоне, открыт и когда шаблон открыт как документ.
Этот пример выдает сообщение при открытии документа.
Private Sub Document_Open()
Msgbox "Документ открыт"
End Sub
Замечание. В отличие от макрокоманд автозапуска, процедуры события в шаблоне Normal не имеют глобальных возможностей. Они выполняются, если приложенный шаблон - Нормальный шаблон.
Если макрокоманда автозапуска существует в документе и приложенном шаблоне, выполнится только макрокоманда автозапуска, сохраненная в документе. Если процедура события для Документа существует в документе и его приложенном шаблоне, выполнятся обе процедуры события. Резюме
1. Важным свойством для объекта Document является свойство ActiveDocument, возвращающее текущий документ.
2. Возвратить объект из коллекции объектов можно при помощи свойства Item по его номеру в коллекции или по имени.
3. Документ можно открывать, сохранять, печатать, закрывать с помощью методов.
4. Для работы непосредственно с записями текста необходимо вернуть диапазон или выбор текста. Это делается с помощью методов Range и Select.
5. При помощи свойств объекта можно защищать документ паролем.
6. С помощью процедур обработки событий объекта Document можно устанавливать или изменять свойства документа при его открытии, закрытии или создании нового документа.
В следующей статье поговорим об объектах Selection и Range.
Сергей Малышев
|