VBA в Word Коллекция Documents и объекты Document

          Назад



11.4.1 Как работать с коллекцией Documents


Коллекция Documents, объект Word.Document, создание документов средства VBA из шаблонов, преобразование типов документов

На одну ступень ниже объекта Application в объектной модели Word (и по логике использования в приложениях) находятся коллекция Documents и объекты Document, из которых она состоит. При программировании в Word без коллекции Documents и объекта Document обычно не обойтись.

Чаще всего в программах нам нужно:

  • Запустить Word;
  • Создать или открыть документ;
  • Что-то с этим документом сделать (например, впечатать в нужные места этого документа значения, полученные из базы данных или от пользователя).

Запуск Word производится при помощи объекта Application, с которым мы уже знакомы. Для выполнения различных действий с документом используются объекты Selection, Range и Bookmark, которые будут рассмотрены ниже. А вот второй пункт — создание документа, открытие документа, проверка, открыт уже документ или нет, сохранение документа и т.п. реализуется при помощи коллекции Documents и объекта Document.

Самый простой вариант создания документа выглядит так:

Dim oDoc As Word.Document

Set oDoc = Application.Documents.Add()

При этом мы создали обычный пустой документ (на основе шаблона normal.dot) и получили на него ссылку в объектную переменную oDoc. Далее в документ можно программно вводить нужную нам информацию.

Однако создавать пустой документ и программно формировать все его содержимое удобно только тогда, когда документ очень простой. Попробуйте программно создать какой-нибудь документ посложнее, например, объявление на взнос наличными или большой договор. Возможно, у вас это получится, но работы потребуется очень много. Намного проще набрать и оформить сложные документы обычным способом — как простой документ Word и оставить в нем пустые места для заполнения из программы. Проще всего сделать это при помощи шаблона Word.

Например, в нашей ситуации нам вначале нужно набрать текст договора, оставив пустые места для изменяемых данных) и сохранить его с расширением .dot (предположим, что он сохранен на диске C:\ с именем dog_blank.dot). Тогда создать документ на основе этого шаблона можно так:

Dim oDoc As Word.Document

Set oDoc = Application.Documents.Add("C:\dog_blank.dot")

А далее при помощи объектов Bookmark и Range (о них — в следующих разделах) вводим текст в оставленные пустые места.

Немного про то, где можно хранить шаблоны документов:

  • первый вариант — просто в файле на диске локального компьютера пользователя. Это — самый простой вариант, но у него есть недостатки: во-первых, пользователь может случайно его изменить, а во-вторых, удобнее использовать общий централизованный набор шаблонов для всех пользователей на предприятии, не копируя эти шаблоны на компьютеры каждого пользователя;
  • второй вариант — хранить шаблоны в скрытом сетевом каталоге на файл-сервере, доступном только на чтение. При этом нам не придется заботиться о наличие необходимого шаблона на компьютере пользователя. Однако и есть здесь проблемы: программа получается неавтономной, зависящей от внешних файлов на файл-сервере. Перенос ее, например, в филиалы будет сопряжен со сложностями;
  • третий вариант — поместить шаблон в базу данных. Удобнее всего поместить шаблон в виде объекта OLE в базу данных Access. В этой же базе данных Access удобно размещать код приложения, графические формы для пользователя и т.п. Запуск Word при этом будет производиться программно из Access. Конечно, такая программа сможет обращаться не только к данным в базе данных Access. но и к данным во внешних источниках — на SQL Server, Oracle и т.п.

Третий вариант наиболее удобен, поскольку ваше приложение со всеми шаблонами, программным кодом и т.п. будет состоять из единственного файла MDB (а документы будут создаваться как обычные файлы Word). Кроме того, Access сам по себе — очень мощное приложение, в нем есть множество удобных возможностей. Единственная проблема в этом случае — то, что метод Documents.Add() согласен принимать шаблон только в виде файла на диске, а про базы данных он ничего не знает. Можно предварительно извлекать шаблон документа из базы данных и сохранять его в файле во временном каталоге, но лучше идти другим путем и активизировать объект шаблона в базе данных методом OLEActivate(). При этом у нас автоматически будет запущен Word и в нем будет создан новый документ на основе шаблона из базы данных.

Часто возникает потребность программным способом не создавать новый документ, а открыть уже имеющийся и с ним что-то сделать. Открыть документ проще всего при помощи метода Open() коллекции Documents. Самый простой вариант применения этого метода выглядит так:

Dim oDoc 1 As Document

Set oDoc1 = Documents.Open("c:\doc1.doc")

Если этот документ уже открыт, то умолчанию просто создается ссылка на уже открытый документ, вместо открытия документа заново.

Важная (и неочевидная) особенность метода Open() заключается в том, что при его использовании во время открытия файла не открывается диалоговое окно "Предупреждение системы безопасности", в котором пользователь может отключить макросы. За счет этого разработчик может гарантировать работоспособность своего приложения или реализовать систему защиты — от печати, доступа к разным функциям и т.п.

Сохранять документы лучше при помощи методов Save() и SaveAs() объекта Document. В коллекции Documents есть также свой метод Save(), который позволяет сохранять все открытые документы Word сразу, но обычно это менее удобно.

Заметим, что в Word можно открывать не только документы Word разных версий, но и документы десятков других различных форматов, про которые знает Word — TXT, HTML, XML и т.п. Сохранять также можно в одном из десятков встроенных форматов или использовать свой собственный пользовательский формат (при помощи объекта FileConvertor). За счет этого программным образом можно очень удобно преобразовывать при помощи макросов большое количество документов, которые могут находиться в разных каталогах на файловых серверах, или, к примеру, в общих папках Exchange Server или в базе данных SharePoint Portal Server. Для прохода по дереву каталогов удобнее всего использовать объект FileSystemObject из библиотеки Scripting.Runtime, которая есть на любом компьютере Windows (см. раздел 4).




Далее