Наконец то я смогу написать статью с примерами. Дело в том, что ключевым компонентом объектной модели Word является не сам объект Word.Application, а коллекция Documents, так как именно она предоставляет два ключевых метода – для создания и открытия документа Word. Конечно, у коллекции Word Documents есть и другие методы и свойства, но они не столь важны. И поэтому, мы рассмотрим только самые основные.
Сама по себе коллекция Documents хранит в себе набор всех объектов Document, которые в свою очередь позволяют работать с каждым экземпляром документа в отдельности. Я буду приводить примеры как в самом редакторе VBA, как и с помощью сценариев Windows Scrip Host.
Единственно свойство, которое позволяет узнать общее количество элементов коллекции является Count:
Count – содержит количество открытых в данный момент документов.
Для примера, откройте несколько word документов и в редакторе VBA пропишите следующий код (просто создайте новый модуль):
For Each objDoc In Documents DocName = DocName & objDoc.Name & vbCrLf Next MsgBox DocName DocName = "" For j = 1 To Documents.Count DocName = DocName & Documents.Item(j).Name & vbCrLf Next MsgBox DocName |
В данном случае мы использовали два способа бля работы с коллекцией:
- Использовали цикл for each для обработки коллекции
- Использовали свойство count для определения количества элементов в коллекции Documents.
Оба способа позволяют получить имена всех документов открытых в данный момент.
Однако, если мы попробуем проделать аналогичный фокус в сценарии Windows script Host, то никакого результата не получим:
' ----------------------------------------------------- ' Получение имени открытых документов ' documents-count.vbs ' ----------------------------------------------------- Option Explicit dim objWord, objDoc, oDoc, DocName Set objWord = CreateObject("Word.Application") Set objDoc = objWord.Documents For Each oDoc In objDoc DocName = DocName & oDoc.Name & vbCrLf Next MsgBox DocName objWord.Quit |
// ------------------------------------------------ // Получение имени открытых документов // documents-count.js // ------------------------------------------------ var objWord, objDoc, oDoc, DocName; objWord = WScript.CreateObject("Word.Application"); objDoc = new Enumerator(objWord.Documents); for (; !objDoc.atEnd(); objDoc.moveNext()){ DocName += objDoc.item().Name+ "\n"; } WScript.Echo(DocName); objWord.Quit(); |
Видимо из внешнего сценария мы можем обработать только ту коллекцию, которую создали тут же.
Методы коллекции Word Documents
Хорошо, теперь давайте рассмотрим некоторые методы коллекции Word Documents, один из методов мы уже использовали выше (Item).
Add(Template, NewTemplate, DocumentType, Visible) – отвечает за создание нового документа, который сразу же открывается, можно выполнить метод без параметров. Параметры:
- Template – задает шаблон для нового документа
- NewTemplate – определяет, сделать ли новый документ шаблоном (TRUE) или нет (FALSE)
- DocumentType – позволяет задать тип создаваемого документа, возможные значения: wdNewBlankDocument, wdNewEmailMessage, wdNewFrameset или wdNewWebPage (новый чистый документ, значение по умолчанию).
- Visible – видимость нового документа (TRUE или FALSE).
При отсутствии параметров, будет создан чистый документ на основе шаблона Normal.dot.
Обратите внимание, что свойство Visible есть и у объекта Word Application, там оно позволяет показать или скрыть все экземпляры объекта Application.
Ниже привожу пример, сценария, в котором создается пять документов, выводится их количество и далее они закрываются:
' -------------------------------------------- ' Создание документов word ' Application Documents Word ' documents-add-word. ' -------------------------------------------- Option Explicit dim objWord, objDoc, i ' Создаем ссылку на объект Word.Application Set objWord = CreateObject("Word.Application") ' Создаем ссылку на объект Documents Set objDoc = objWord.Documents ' Делаем видимым приложение Word objWord.Visible = True ' Создаем пять документов for i=1 to 5 objDoc.Add Next ' Выводим количество созданных документов MsgBox "Количество документов " & objDoc.Count 'Закрываем все документы Word objWord.Quit |
// -------------------------------------------- // Создание документов word // Application Documents Word // documents-add-word.js // -------------------------------------------- var objWord, objDoc, i; // Создаем ссылку на объект Word.Application objWord = WScript.CreateObject("Word.Application"); // Создаем ссылку на объект Documents objDoc = objWord.Documents; // Делаем видимым приложение Word objWord.Visible = true; // Создаем пять документов for (i=1; i<=5; i++){ objDoc.Add(); } // Выводим количество созданных документов WScript.Echo ("Количество документов " + objDoc.Count); //Закрываем все документы Word objWord.Quit() |
Item(index) переход к заданному элементу коллекции по его индексу. Значение индекса можно задавать как через метод, так и через коллекцию, так как метод Item используется по умолчанию. Следующие две строки кода являются эквивалентными:
Application.Documents(3) Application.Documents.Item(3) |
' ------------------------------------------- ' Обработка коллекции документов ' Application Documents Word ' documents-count-word.vbs ' ------------------------------------------- Option Explicit dim objWord, objDoc, i, j, objInfo ' вызываем процедуру CreateDoc Call CreateDoc objInfo = "Имя:" & vbCrLf ' Начинаем перебор коллекции Documents for j=1 to objDoc.Count objInfo = objInfo & objDoc.Item(j).Name & vbCrLf Next ' Выводим имена созданных документов MsgBox objInfo 'Закрываем все документы Word objWord.Quit Sub CreateDoc Set objWord = CreateObject("Word.Application") Set objDoc = objWord.Documents objWord.Visible = True for i=1 to 5 objDoc.Add Next End Sub |
// ----------------------------------------- // Обработка коллекции документов // Application Documents Word // documents-count-word.js // ----------------------------------------- var objWord, objDoc, i, j, objInfo CreateDoc() objInfo = "Имя:\n"; // Начинаем перебор коллекции Documents for (j=1; j<=objDoc.Count; j++){ objInfo += objDoc.Item(j).Name + "\n"; } // Выводим имена созданных документов WScript.Echo(objInfo); //Закрываем все документы Word objWord.Quit() function CreateDoc(){ objWord = WScript.CreateObject("Word.Application"); objDoc = objWord.Documents; objWord.Visible = true; for (i=1; i<=5; i++){ objDoc.Add(); } } |
Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format) – открыть заданный документ
- FileName – только этот параметр является обязательным, содержит путь к файлу, если надо открыть несколько документов, то имена разделяются пробелами.
- ConfirmConversions – содержит логическое значение, определяющее, надо ли отображать (TRUE) или нет (FALSE) отображать диалоговое окно Convert File, если документ записан не в формате Word.
- ReadOnly – определяет, открывать ли документ только для чтения (значение TRUE).
- AddToRecentFiles – если значение TRUE, то документ добавляется к списку файлов внизу меню Файл.
- PasswordDocument, PasswordTemplate – пароль к документу или пароль к шаблону, соответственно. Application Documents Word.
- Revert – если данный параметр содержит значение TRUE, то при попытке открыть уже открытый документ, сделанные в нем изменения не будут сохраняться. Если значение FALSE – произойдет простая активизация документа.
- WritePasswordDocument – пароль, который запрашивается при сохранении документа.
- WritePasswordTemplate — пароль, который запрашивается при сохранении шаблона.
- Format – параметр содержит параметр для преобразования файла. Значения: wdOpenFormatAuto (по умолчанию), wdOpenFormatDocument, wdOpenFormatRTF, wdOpenFormatTemplate, wdOpenFormatText, wdOpenFormatUnicodeText.
Save() и Close() – сохранение и закрытие (соответственно) всех документов в заданной коллекции.