VBA в Word Объект Word.Document, программная работа со свойствами и методами документа в VBA
После того, как мы при помощи объекта Application запустили Word, при помощи коллекции Documents создали (или открыли, или нашли среди уже открытых) — в общем, получили ссылку на нужный нам документ, можно выполнять с этим документом различные действия, реализованные при помощи свойств, методов и событий объекта Document. У этого объекта десятки свойств и методов, и здесь мы рассмотрим только наиболее важные и часто используемые из них. Для самостоятельного рассмотрения будут оставлены очевидные и редкоиспользуемые свойства.
Обратите внимание, что к объекту Document можно обращаться и не создавая специальную объектную переменную. Существует еще по крайней мере три способа получения доступа к объекту Document:
- работать с документом как с элементов коллекции Documents. Формате обращения может выглядеть, например, так: Documents.Item(1);
- использовать специальное ключевое слово ThisDocument. При помощи него можно получить ссылку на объект документа, которому принадлежит исполняемый программный модуль, например:
- использовать свойство объекта Application ActiveDocument. Это свойство возвращает нам объект активного документа:
Самые важные свойства объекта Document представлены ниже:
- ActiveWritingStyle — текущий активный стиль (заголовок определенного уровня, обычный текст, гиперссылка и т.п.). Рекомендуется проверить перед вводом текста.
- AttachedTemplate — возможность подключить шаблон (со всеми макросами, стилями, записями автотекста и т.п.) или проверить, какой шаблон подключен (вручную это можно сделать через меню Сервис ->Шаблоны и надстройки).
- Background — возвращает объект Shape, представляющий фоновый рисунок (фоновые рисунки видны только в режиме Web-документ);
- BuiltInDocumentProperties — возможность получить ссылку на коллекцию DocumentProperties с одноименными объектами, представляющими встроенные свойства документа (название, автор, категория, комментарии и т.п.);
- Characters — возвращает коллекцию объектов Range, каждый из которых представляет один символ. Это свойство есть не только у объектов Document, но и у объектов Selection и Range. Может использоваться, например, для выполнения операция поиска и замены или статистических подсчетов (например, для если переводчику платят за количество символов);
- Content — свойство, возвращающее объект Range, представляющий главную цепочку документа (main document story). Если говорить проще — просто текст документа, без колонтитулов, сносок, комментариев и т.п.
- CustomDocumentsProperty — свойство, возвращающее коллекцию объектов DocumentProperties, представляющих пользовательские свойства документа. Можно использовать для сохранения вместе с документом любых значений переменных. Очень удобно, например, для подсчета количества открытий документов, флажков печатался/не печатался, сколько раз вызывалась та или иная функция, на каких компьютерах и каким пользователем открывался и т.п.
- DefaultTabStop — определить отступ по умолчанию при использовании символа табуляции. По умолчанию — 35 пунктов, что примерно равно 1,25 см;
- DisableFeatures — отключить возможности, которые понимают только последние версии Word (для совместимости с пользователями, у которых на компьютерах стоят старые версии). Обычно само свойство DisableFeatures просто включает этот режим, а конкретный уровень совместимости задается при помощи свойства DisableFeaturesIntroducedAfter.
- DoNotEmbedSystemFonts — не вставлять в документ системные шрифты (по умолчанию для русского, японского и т.п. вставляются). Позволяет сократить размер документа — но тогда пользователи в системе, где не стоит русский язык, не смогут прочесть этот документ.
- EmbedTrueTypeFonts — очень полезное свойство, если вы работаете с документом в месте, где используются экзотические шрифты (например, в издательстве). Вставка true-type шрифтов гарантирует, что получатели документа будут видеть его точно таким же, как и создатель.
- Envelope — позволяет получить ссылку на специальный объект Envelope, который используется для создания почтовых конвертов.
- Fields — возможность получить ссылку на коллекцию Fields одноименных объектов. Очень полезна при работе с полями.
- Footnotes — возможность получить коллекцию сносок.
- свойства Formatting… — что показывать в списке стилей в панели инструментов Форматирование.
- FormFields — аналогично Fields, но в этом случае мы получаем ссылку на поля в формах.
- FulName — полное имя объекта (вместе с путем к нему в файловой системе или Web). Доступно, конечно, только для чтения.
- GrammarChecked — пометить весь документ, как проверенный с точки зрения грамматики (фактически отключить проверку грамматики для данного документа). Такое же свойство существует и у объекта Range. Коллекцию ошибок, выловленных при проверке грамматики, можно получить при помощи свойства GrammaticalErrors, а выделить ошибки зеленым волнистым подчеркиванием (если они еще не выделены) — при помощи свойства ShowGrammaticalErrors. Для орфографических ошибок существует аналогичные свойства SpellingChecked, SpellingErrors и ShowSpellingErrors.
- HasPassword — проверить, назначен ли пароль для указанного документа. Password — назначить пароль. По причине крайней слабости парольной защиты пароли в Word, Excel и Access использовать не рекомендуется.
- Indexes — возвращает коллекцию индексов (то есть предметных указателей) для документа.
- Name — возвращает имя документа (без пути к нему).
- OpenEncoding — возвращает кодовую страницу, которая использовалась для открытия документа. Для русского языка по умолчанию, конечно, 1251.
- PageSetup — позволяет получить ссылку на одноименный объект. Используется, конечно, в основном при реализации печати.
- Paragraphs — возвращает ссылку на коллекцию абзацев в данном документе.
- Path — возвращает путь к документу в файловой системе (без имени). Может пригодиться, чтобы создать еще один файл по тому же пути.
- Permission — возможность получить доступ к объекту Permission, который позволяет управлять системой внутренних разрешений документа Word (не разрешений файловой системы).
- PrintRevisions — печатать или нет пометки редактора (иборьбы) вместе с документом. По умолчанию — печатать.
- ProtectionType — проверить защиту данного документа (разрешено все, или только комментарии, чтение, изменения в полях форм и т.п.). Сама защита устанавливается при помощи метода Protec()t.
- ReadOnly — здесь объяснений не требуется. Это свойство доступно только на чтение (поскольку соответствующий атрибут устанавливается в файловой системе).
- RemoveDateAndTime и RemovePersonalInformation — удалить информацию о дате и времени произведенных изменений и всю информацию о пользователе из документа (включая свойства документа). Может быть полезным при создании файла-образца.
- Saved — очень важное свойство. Позволяет определить, изменялся ли документ со времени последнего изменения.
- SaveEncoding — позволяет явно указать (или получить) кодировку, которая будет использоваться при сохранении документа.
- SaveFormat — позволяет получить информацию о формате документа (DOC, RTF, TXT, HTML и т.п.). Доступно только для чтения.
- Sections — возвращает коллекцию разделов документа. Sentences — то же самое для предложений. Аналогично работают свойства Shapes , Styles, Subdocuments, Tables, Windowsи Words .
- Type — возвращает тип документа (обычный, шаблон или Web-страница с фреймами).
- Variables — еще одно очень удобное свойство. Можно использовать для сохранения своих служебных данных вместе с документом, как и пользовательские атрибуты ( custom attributes), но в отличие от пользовательских атрибутов документа, пользователям эти свойства не видны.
Теперь — о самых важных методах объекта Document:
- Activate() — этот метод позволяет сделать указанный вами документ активным (например, для ввода текста).
- AddToFavorities() — добавить ссылку на документ в каталог "Избранное". Может быть полезным, если пользователь будет работать с ним постоянно.
- CheckSpelling() и CheckGrammar() — запустить проверку орфографии и грамматики соответственно.
- Close() — закрыть документ. Можно закрыть с сохранением (по умолчанию), а можно — без (если указать соответствующий параметр).
- Compare() — сравнить документ с другим и сгенерировать редакторские пометки в местах, где обнаружены различия.
- DataForm() — возможность редактирования форм данных — то есть данных, которые в документе разделены разделителями полей и строк. Вообще говоря, формы данных в Word рекомендуется использовать только в случае крайней необходимости — гораздо больше дл работы с упорядоченными данными приспособлены Excel и Access.
- DetectLanguage() — определить язык текста. Проверка производится по предложениям, на основе сверки слов в них со встроенными словарями. Такая проверка производится автоматически во время ввода текста или открытия нового документа. Чтобы заново провести проверку языков, свойство LanguageDetected нужно перевести в False.
- FitToPages() — очень интересный метод. Размер шрифта автоматически меняется таким образом, чтобы текст стал занимать на одну страницу меньше. Можно использовать для устранения "висячих страниц" и других проблем верстки.
- FollowHyperlink() — открыть указанный вами документ в соответствующем приложений (если HTML, то в Internet Explorer).
- GoTo() — очень мощный метод, существует для объектов Document, Range и Selection. В первых двух случаях он возвращает объект Range, в третьем — просто перемещает указатель ввода текста на нужное место. Умеет переходить на начало страницы, строки, закладки, комментария, таблицы, секции, поля, ссылки, формулы и т.п. Может на определенный номер этого объекта, первый, последний, следующий и т.п. Очень удобно использовать для установки указателя в нужное место для автоматического ввода текста.
- Merge() — возможность произвести слияние двух документов. Метод очень сложный и мощный, основывается на применении редакторских пометок.
- PresentIt() — открывает данный документ Word в PowerPoint.
- PrintOut() — очень сложный метод, который позволяет вывести на печать весь документ или его часть. Принимает два десятка параметров (все — необязательные). Может использоваться для объектов Application, Document и Window.
- PrintPreview() — перевести документ в режим предпросмотра.
- Protect() — возможность ограничить внесения изменений в документ при помощи пароля или IRM.
- Range() — очень важный метод. Возвращает объект Range (он будет рассмотрен ниже), принимает в качестве параметров номер начального символа диапазона и номер конечного символа.
- Redo() — повторить последнее действие. В качестве параметра принимает количество последних действий, возвращает True, если повтор был произведен успешно.
- Repaginate() — переразбить документ на страницы. Обычно используется, если автоматическая разбивка была ранее отключена.
- Save() — смысл этого метода очевиден. Если документ еще не сохранялся, открывается диалоговое окно Save As.
- SaveAs() — очень мощный и сложный метод. Можно определить путь для сохраняемого документа, его формат, кодировку, пароли на открытие и изменение документа, вставку шрифтов и многое другое. Очень полезный метод, например, для автоматической конвертации документов.
- Select() — позволяет просто выделить весь документ. Этот метод существует для очень большого количества объектов, в том числе Selection и Range.
- TransformDocument() — исключительно мощный метод, но только для программистов, которые хорошо разбираются в XML и XSLT. Позволяет применить к документу таблицу преобразований стилей (Extensible Stylesheet Language Transformation, XSLT), при помощи которой можно поменять все, что угодно.
- Undo() — отменить определенное количество последних действий. По синтаксису и принципам работы — полный аналог Redo().
- UndoClear() — очистить буфер отмены изменений, чтобы пользователь не смог откатить произведенные действия.
- UnProtect() — снять защиту с документа (определенную методом Protect() или на графическом интерфейсе). Может быть очень полезным перед программным внесением изменений в защищенный документ.
Часто используемых событий у объекта Document всего три — New() (можно определить только для шаблона, срабатывает, когда на основе этого шаблона создается новый документ), Open() и Close(). Все эти свойства очевидны и изначально доступны в окне редактора кода Visual Basic.
VBA Excel. Управление приложением Word
Экземпляр приложения Word необходим для того, чтобы с его помощью создавать новые документы или открывать существующие для редактирования из кода VBA Excel.
Создать новый экземпляр объекта Word.Application можно при помощи раннего или позднего связывания, используя при позднем связывании функцию CreateObject. Подключиться к открытому экземпляру приложения Word можно только при помощи позднего связывания, используя функцию GetObject.
Раннее связывание приложения Word
Создание нового экземпляра Word.Application и присвоение ссылки на него переменной myWord:
‘Создание экземпляра приложения Word
‘с ранней привязкой одной строкой
Dim myWord As New Word . Application
‘Создание экземпляра приложения Word
‘с ранней привязкой двумя строками
Dim myWord As Word . Application
Set myWord = New Word . Application

Для раннего связывания переменной с объектом Word.Application необходимо подключить в редакторе VBA Excel ссылку на библиотеку Microsoft Word Object Library, если она не подключена. Подключается ссылка в окне «References VBAproject», перейти в которое можно через главное меню редактора: Tools–>References… Раннее связывание позволяет при написании кода использовать лист подсказок для выбора и вставки свойств и методов привязанных объектов (Auto List Members). Если проект VBA Excel создается на заказ, то, после его завершения, раннее связывание следует заменить на позднее, так как на компьютере пользователя может не оказаться нужной библиотеки, и код работать не будет.
Позднее связывание приложения Word
Dim myWord As Object
Set myWord = CreateObject ( "Word.Application" )
Dim myWord As Object
Set myWord = GetObject ( , "Word.Application" )
Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Чтобы ее избежать, следует предусмотреть создание нового экземпляра Word.Application с помощью функции CreateObject, если открытое приложение не будет найдено (смотрите пример 3). В программы VBA Excel, работающие с Word, следует включать обработчик ошибок.
Закрытие объекта Word.Application
‘отображаем приложение Word
myWord . Visible = True
‘освобождаем переменную от ссылки
Set myWord = Nothing
‘закрываем приложение Word
myWord . Quit
‘освобождаем переменную от ссылки
Set myWord = Nothing
Если переменная не содержит ссылку на приложение (myWord = Nothing), метод Quit возвратит ошибку. Чтобы этого не произошло, перед применением метода Quit необходимо проверить наличие ссылки в переменной myWord (смотрите пример 3).
Примеры открытия и закрытия Word
Sub Primer1 ( )
Dim myWord As New Word . Application
‘блок операторов для создания, открытия
‘и редактирования документов Word
myWord . Visible = True
Set myWord = Nothing
End Sub
Sub Primer2 ( )
Dim myWord As Object
Set myWord = CreateObject ( "Word.Application" )
‘блок операторов для создания, открытия
‘и редактирования документов Word
myWord . Visible = True
MsgBox "Остановка программы"
myWord . Quit
Set myWord = Nothing
End Sub
Sub Primer3 ( )
Dim myWord As Object
On Error Resume Next
Set myWord = GetObject ( , "Word.Application" )
If myWord Is Nothing Then
Set myWord = CreateObject ( "Word.Application" )
End If
On Error GoTo Instruk
‘блок операторов для создания, открытия
‘и редактирования документов Word
myWord . Visible = True
Set myWord = Nothing
Exit Sub
Instruk :
If Err . Description <> "" Then
MsgBox "Произошла ошибка: " Word.Application" )
? При этом, мне нужна проверка: если папка уже открыта, то не открывать её 2-й раз, а перемещать фокус в неё!
Привет, Сергей! Для работы с папками и файлами используется объект FileSystemObject. Как открыть папку для просмотра, смотрите здесь.
Приветствую. Прошу помощи, есть обычная задачка написания макроса для заполнения шаблона в Word. Всё хорошо, сделал, проверил — работает! НО реальный шаблон, оказался вордовским документом с защитой текста. То есть документ можно править ТОЛЬКО в тех полях, которые разрешены для записи.
Мне соответственно эти поля и нужны. Но макрос выдаёт ошибку, как я понял файл по умолчанию открывается только для чтения. Как открыть подобные файлы в режим для записи ? (естественно только для разрешённых полей)
Добрый день, Дмитрий! Я бы, в вашем случае, попробовал создать свой шаблон на основе исходного, скопировав содержимое исходного шаблона и вставив в пустой документ.
Евгений, приветствую. Это простой выход, но он не подойдёт. Поскольку Юристы не примут других шаблонов.
Иллюстрированный самоучитель по Microsoft Access 2002
Обмен данными с Microsoft Word в системе автоматизации
В настоящем разделе будут рассмотрены несколько примеров управления объектами Microsoft Word из процедур VBA: открытие и печать документа, слияние документов для почтовых рассылок и заполнение полей в документе Word данными из БД Microsoft Access.
Иерархия объектов VBA приложения Microsoft Word
Так же как и при использовании объектной модели Microsoft Excel, познакомимся сначала с некоторыми объектами объектной модели Microsoft Word.
- Объект Application – ссылается на активное приложение Microsoft Word. Через этот объект можно получить доступ ко всем остальным объектам модели. Объект Application имеет свойства ActiveDocument и ActiveWindow, которые представляют собой активный документ и активное окно соответственно. Можно указать Word.Application в качестве значения аргумента функций CreateObject() и GetObject() и в операторе Dim As New .
- Объект Document – является глобальным объектом и, так же как и объект Application, может использоваться в коде автоматизации в качестве значения аргумента функций CreateObject() и GetObject() и в операторе Dim As New . Семейство Documents представляет собой набор всех документов, открытых в Word.
- Объект Selection – представляет собой выделенную область в окне документа Word или точку вставки. Каждый документ может иметь только одну область выделения, и только одна область выделения открытых документов может быть активна в некоторый момент времени. Это означает, что всегда существует только один объект Selection. Объект Selection подчинен объекту Application, а создается при применении метода Select к объекту Document.
- Семейство windows объекта Application представляет собой набор всех окон приложения Word.
- Семейство Bookmarks подчинено объекту Document, и каждый объект этого семейства представляет собой закладку в документе.
- Объект Range представляет собой непрерывную область текста в документе Word. Диапазоны, как и закладки, используются для идентификации текста в документе, однако, в отличие от закладок, диапазоны существуют только во время выполнения процедур VBA. Диапазоны не зависят от области выделения в документе. Можно работать с диапазоном, не затрагивая области выделения. Диапазонов в документе может быть несколько.
Открытие документа Word
Для того чтобы открыть документ Word, можно использовать любой из перечисленных ранее способов создания экземпляров класса объекта автоматизации. Ниже приводятся примеры процедур VBA для открытия документа. В первой используется функция CreateObject (), а во второй – GetObject(). Для проверки кода этих процедур вы можете, так же как и при работе с объектами приложения Excel, использовать окно отладки.
Sub OpenDocument()
Dim wda As Word.Application
Set wda = CreateObject( "Word.Application" )
With wda
.Visible = True
End With
‘операции над документом wda.Quit Wda.Nothing
End Sub
Если все изменения делались программно, то лучше сначала закрыть документ, выполнив команду:
wda.ActiveDocuments.Close False
Окно документа будет закрыто, при этом все изменения будут сохранены. Если же нужно, чтобы пользователь мог посмотреть сделанные программой изменения и при необходимости что-то откорректировать, можно не закрывать приложение в программе, а предоставить сделать это пользователю.
В следующей процедуре для открытия документа используется функция Getobject (). То есть сначала делается попытка проверить, не запущен ли уже Word. Если он еще не запущен, будет сгенерирована ошибка (код ошибки: 429). Программа перехватит эту ошибку и использует функцию CreateObject(), чтобы запустить Word. Если Word уже запущен, то новый документ будет открыт в этом же экземпляре приложения.
Затем документ выводится на печать, после чего закрывается либо документ, либо приложение в зависимости от значения флага (modeFlag). Значение флага показывает, запускался ли экземпляр Word, или документ был добавлен к другим открытым документам:




