Создание нового документа Word или открытие существующего из кода VBA Excel. Методы Documents.Add и Documents.Open. Сохранение и закрытие документа.
Работа с Word из кода VBA Excel
Часть 2. Создание и открытие документов Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Новый документ Word создается из кода VBA Excel с помощью метода Documents.Add:
Sub Test1() Dim myWord As New Word.Application Dim myDocument As Word.Document Set myDocument = myWord.Documents.Add myWord.Visible = True End Sub |
Переменную myDocument можно объявить с типом Object, но тогда не будет ранней привязки к типу Word.Document и подсказок при написании кода (Auto List Members).
Открытие существующего документа
Существующий документ Word открывается из кода VBA Excel с помощью метода Documents.Open:
Sub Test2() Dim myWord As New Word.Application Dim myDocument As Word.Document Set myDocument = _ myWord.Documents.Open(«C:Документ1.docx») myWord.Visible = True End Sub |
Замените в этой процедуре строку «C:Документ1.docx» на адрес своего файла.
Подключение к открытому документу
Присвоение переменной ссылки на существующий экземпляр Word.Application осуществляется в VBA Excel с помощью функции GetObject:
Sub Test3() Dim myWord As Object, myDoc As Word.Document On Error GoTo Instr Set myWord = GetObject(, «Word.Application») Set myDoc = myWord.Documents(«Документ1.docx») myDoc.Range.InsertAfter «Добавляем новый текст, подтверждающий подключение к открытому документу.» Exit Sub Instr: MsgBox «Произошла ошибка: « & Err.Description End Sub |
Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Также произойдет ошибка, если не будет найден указанный документ (в примере — «Документ1.docx»).
Сохранение и закрытие документа
Сохранение нового документа
Чтобы сохранить из кода VBA Excel новый документ Word, используйте метод SaveAs2 объекта Document:
myDocument.SaveAs2 («C:Документ2.docx») |
Замените «C:Документ2.docx» на путь к нужному каталогу с именем файла, под которым вы хотите сохранить новый документ.
Сохранение изменений в открытом документа
Сохраняйте изменения в существующем документе с помощью метода Document.Save или параметра SaveChanges метода Document.Close:
‘Сохранение изменений документа myDocument.Save ‘Сохранение изменений документа ‘при закрытии myDocument.Close ‘по умолчанию True myDocument.Close True myDocument.Close wdSaveChanges ‘Закрытие документа без ‘сохранения изменений myDocument.Close False myDocument.Close wdDoNotSaveChanges |
Закрытие любого сохраненного документа
Метод Document.Close закрывает документ, но не приложение. Если работа с приложением закончена, оно закрывается с помощью метода Application.Quit.
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Documents.Add method (Word) |
vbawd10.chm158072846 |
vbawd10.chm158072846 |
word |
Word.Documents.Add |
04b81417-cde9-4657-7737-90d266d05487 |
06/08/2017 |
medium |
Documents.Add method (Word)
Returns a Document object that represents a new, empty document added to the collection of open documents.
Syntax
expression.Add (Template, NewTemplate, DocumentType, Visible)
expression Required. A variable that represents a Documents object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
Template | Optional | Variant | The name of the template to be used for the new document. If this argument is omitted, the Normal template is used. |
NewTemplate | Optional | Variant | True to open the document as a template. The default value is False. |
DocumentType | Optional | Variant | Can be one of the following WdNewDocumentType constants: wdNewBlankDocument, wdNewEmailMessage, wdNewFrameset, or wdNewWebPage. The default constant is wdNewBlankDocument. |
Visible | Optional | Variant | True to open the document in a visible window. If this value is False, Microsoft Word opens the document but sets the Visible property of the document window to False. The default value is True. |
Return value
Document
Example
This example creates a new document based on the Normal template.
This example creates a new document based on the Professional Memo template.
Documents.Add Template:="C:Program FilesMicrosoft Office" _ & "TemplatesMemosProfessional Memo.dot"
This example creates and opens a new template, using the template attached to the active document as a model.
tmpName = ActiveDocument.AttachedTemplate.FullName Documents.Add Template:=tmpName, NewTemplate:=True
[!includeSupport and feedback]
Аннотация: Лекция посвящена описанию коллекции Documents и объекта Document приложения Microsoft Word.
10.1. Коллекция Documents — открытые документы
Коллекция Documents включает в себя открытые документы с их полезными методами и свойствами. Наряду с объектами Document, которые входят в коллекцию, здесь мы подробнее рассмотрим уже известный вам объект ActiveDocument,
ActiveDocument имеет те же свойства и методы, что и любой Document — объект, однако, часто объектом ActiveDocument удобнее пользоваться.
Так же обратите внимание на объект ThisDocument. Он представляет собой тот документ, из которого запущен макрос.
Для начала давайте рассмотрим свойства и методы коллекции, а потом займемся объектом Document.
10.2. Методы коллекции Documents
10.2.1. Add — создаем новый документ
Этот метод добавляет новый объект Document в коллекцию Documents — то есть создает новый документ. Его можно использовать так (листинг 10.1.):
Documents.Add
Листинг
10.1.
Создаем новый документ
При выполнении такого кода будет создан новый пустой документ на основе шаблона Normal. Чтобы ссылка на созданный документ была присвоена переменной, можете воспользоваться такой конструкцией (листинг 10.2.):
Dim obj_NewDoc As Word.Document Set obj_NewDoc = Application.Documents.Add
Листинг
10.2.
Создаем новый документ и присваиваем ссылку на него объектной переменной
Здесь мы сначала объявили переменную соответствующего типа, а потом присвоили ей ссылку на новый документ.
Метод Add может принимать несколько необязательных параметров. Полный вызов метода выглядит так:
Documents.Add (Template, NewTemplate, DocumentType, Visible)
Template (Шаблон) — отвечает за шаблон, который будет использован при создании файла. По умолчанию это Normal.dotm.
NewTemplate (Новый шаблон) — если этот параметр установлен в True — файл будет обрабатываться как шаблон. По умолчанию установлен в False.
DocumentType (Тип документа) — очень полезный параметр, который позволяет создавать документы различных типов. На тип документа указывает одна из констант, в частности, по умолчанию это wdNewBlankDocument — то есть пустой документ. Так же этот параметр может принимать значения wdNewEmailMessage (Почтовое сообщение), wdNewFrameset (Документ с рамками — такие используются при создании WEB-страниц), wdNewWebPage (WEB-страница).
Visible (Видимость) — по умолчанию установлен в True — то есть создаваемый документ видим для пользователя. Если вы хотите, сначала сформировать новый документ, а уже потом показать его пользователю — установите это свойство в False, а после окончания формирования документа — воспользуйтесь свойством Visible созданного документа, чтобы отобразить его.
10.2.2. Open — открываем документы
Метод Open используется для открытия существующих файлов, возвращая объект типа Document. Файл, имя которого задано при вызове метода, открывается и добавляется в коллекцию Documents. Метод может принимать множество параметров, однако основной — это FileName, который и задает имя открываемого файла.
Например, для открытия файла 1.docm, расположенного в корневом каталоги диска С, можно воспользоваться кодом из листинга 10.3.
Documents.Open FileName:="C:1.docm"
Листинг
10.3.
Открываем существующий документ
10.2.3. Close — закрываем все документы
Метод Close используется для закрытия всех открытых документов. Применяют его достаточно редко — удобнее закрывать каждый конкретный документ по отдельности. При вызове метода без параметров система задаст вопрос о сохранении документов, которые были изменены (листинг 10.4.).
Documents.Close
Листинг
10.4.
Закрываем все документы
Полный вызов метода выглядит так:
Documents.Close(SaveChanges, OriginalFormat, RouteDocument)
Среди параметров для нас наибольший интерес представляют первых два.
SaveChanges (Сохранить изменения) отвечает за сохранение изменений. По умолчанию он установлен в wdPromptToSaveChanges (Вывести запрос о сохранении), так же он может быть установлен в wdDoNotSaveChanges (Не сохранять изменения) и wdSaveChanges (Сохранить изменения). Как видите, с помощью параметра wdSaveChanges можно организовать удобное и быстрое закрытие множества документов с сохранением изменений
OriginalFormat (Формат) — отвечает за формат сохраняемого документа. Может принимать различные значения: wdOriginalDocumentFormat (Оригинальный формат документа), wdPromptUser (Запросить формат у пользователя), wdWordDocument (Документ Word).
Вот как выглядит вызов метода Close, который сохраняет все открытые документы и закрывает их (листинг 10.5.)
Documents.Close (wdSaveChanges)
Листинг
10.5.
Закрываем все документы, предварительно сохранив
Учтите — если какие-то из документов сохраняются в первый раз — вы получите запрос об имени документа.
10.2.4. Item — обращаемся к отдельным документам
10-01-Item.docm — пример к п. 10.2.4.
Метод Item позволяет обращаться к открытым документам (то есть — к объектам Document ), используя их индексы или имена. Нумерация документов начинается с единицы. Чтобы узнать общее количество открытых документов, можно воспользоваться свойством Documents.Count.
Например, с помощью нижеприведенного кода из листинга 10.6 мы поочередно выводим имена открытых документов с указанием номера документа в коллекции:
For i = 1 To Documents.Count MsgBox (Documents.Item(i).Name & _ " - документ номер " & i) Next i
Листинг
10.6.
Выводим имена и номера документов
Очевидно, что свойство Count коллекции Documents позволяет узнать количество открытых документов, а свойство Name объекта Item(i) содержит имя документа с индексом i.
На рис. 10.1 вы можете видеть одно из окон с сообщением об имени и номере документа.
Рис.
10.1.
Окно сообщения об имени и номере документа
К документам в коллекции Documents можно обращаться и по именам. Также, при обращении к документу необязательно напрямую указывать метод Item — в листинге 10.7 вы можете видеть различные варианты обращения к документу.
MsgBox Documents("Мой документ.docx").Name MsgBox Documents.Item("Мой документ.docx").Name MsgBox Documents(1).Name
Листинг
10.7.
Выводим имена и номера документов
10.2.5. Save — сохранение всех документов
Метод Save сохраняет все документы коллекции. Если документ сохраняется впервые — будет выведено окно с запросом имени файла. В листинге 10.8 приведен пример вызова метода.
Documents.Save
Листинг
10.8.
Сохраним все документы в коллекции
10.3. Свойства коллекции Documents
Среди свойств коллекции Documents нас будет интересовать лишь одно — Count. Это свойство позволяет узнать количество элементов в коллекции Documents, то есть — количество открытых документов. В листинге 10.9 мы выводим в окне сообщения количество открытых документов
MsgBox ("Количество открытых документов: " & _ Documents.Count)
Листинг
10.9.
Сохраним все открытые документы
10.4. Объект Document
Объект Document — это открытый документ. У него есть множество свойств и методов, которые активно используются при программной работе с документами. Здесь мы рассмотрим важнейшие из них.
Наконец то я смогу написать статью с примерами. Дело в том, что ключевым компонентом объектной модели 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() – сохранение и закрытие (соответственно) всех документов в заданной коллекции.
Содержание
- 1 Add a word document
- 2 Close a document
- 3 Generating Word ata from an Excel VBA program
- 4 Load contact table from Access and create letter in Word
- 5 Open an Existing Document
- 6 Save a document
- 7 Save Changes to a Document
- 8 To close a specific document, you can close the active document or you can specify a document name:
- 9 To create a new document that uses a specific template, use this:
- 10 To save a document with a new name, use the SaveAs method
Add a word document
<source lang="vb">
Sub wordDoc()
Dim WordApp As Object Set WordApp = CreateObject("Word.Application") With WordApp .Documents.Add End With
End Sub
</source>
Close a document
<source lang="vb">
Sub exitFor()
Dim Doc As Document For Each Doc In Documents If Doc.Name = "Document1" Then Exit For Doc.Close Next Doc
End Sub
</source>
Generating Word ata from an Excel VBA program
<source lang="vb">
Sub MakeMemos()
Dim WordApp As Object Set WordApp = CreateObject("Word.Application") For i = 1 To 3 Application.StatusBar = "Processing Record " & i SaveAsName = ThisWorkbook.Path & "test.doc" With WordApp .Documents.Add With .Selection .Font.Size = 14 .Font.Bold = True .ParagraphFormat.Alignment = 1 .TypeText Text:="M E M O R A N D U M" .TypeParagraph .TypeParagraph .Font.Size = 12 .ParagraphFormat.Alignment = 0 .Font.Bold = False .TypeText Text:="Date:" & vbTab & Format(Date, "mmmm d, yyyy") .TypeParagraph .TypeText Text:="To:" & vbTab & " Manager" .TypeParagraph .TypeText Text:="From:" & vbTab & _ Application.userName .TypeParagraph .TypeParagraph .TypeText "text" .TypeParagraph .TypeParagraph .TypeText Text:="Units Sold:" & vbTab & "asdf" .TypeParagraph .TypeText Text:="Amount:" & vbTab & Format(1000, "$#,##0") End With .ActiveDocument.SaveAs FileName:=SaveAsName .ActiveWindow.Close End With Next i WordApp.Quit Set WordApp = Nothing Application.StatusBar = "" MsgBox " memos were created and saved in " & ThisWorkbook.Path
End Sub
</source>
Load contact table from Access and create letter in Word
<source lang="vb">
Sub ControlWord()
Dim objWord As New Word.Application Dim rsContacts As New ADODB.Recordset Dim strLtrContent As String rsContacts.ActiveConnection = CurrentProject.Connection rsContacts.Open "tblContacts" objWord.Documents.Add Do While Not rsContacts.EOF strLtrContent = rsContacts("FirstName") & " " & rsContacts("LastName") strLtrContent = strLtrContent & rsContacts("Address") & vbCrLf strLtrContent = strLtrContent & rsContacts("City") & ", " & rsContacts("Region") strLtrContent = strLtrContent & " " & rsContacts("PostalCode") strLtrContent = strLtrContent & "Dear " & rsContacts("FirstName") & " " strLtrContent = strLtrContent & rsContacts("LastName") & ":" objWord.Selection.EndOf objWord.Selection.Text = strLtrContent objWord.Selection.EndOf objWord.Selection.InsertBreak rsContacts.MoveNext Loop objWord.Visible = True objWord.PrintPreview = True
End Sub
</source>
Open an Existing Document
<source lang="vb">
Sub Main()
Dim wdApp As Word.Application Set wdApp = GetObject(, "Word.Application") wdApp.Documents.Open Filename:="C:Arrays.docx", ReadOnly:=True, AddtoRecentFiles:=False
End Sub
</source>
Save a document
<source lang="vb">
Sub WordLateBound()
Dim objWord As Object Dim objDoc As Object Set objWord = CreateObject("Word.Application") Set objDoc = objWord.Documents.Add objDoc.SaveAs "C:testdoc2.doc" objDoc.Close Set objDoc = Nothing Set objWord = Nothing
End Sub
</source>
Save Changes to a Document
<source lang="vb">
Sub main()
Dim wdApp As Word.Application Set wdApp = GetObject(, "Word.Application") wdApp.Documents.Save
End Sub
</source>
To close a specific document, you can close the active document or you can specify a document name:
<source lang="vb">
Sub main()
Dim wdApp As Word.Application Set wdApp = GetObject(, "Word.Application") wdApp.ActiveDocument.Close "or wdApp.Documents("Arrays.docx").Close
End Sub
</source>
To create a new document that uses a specific template, use this:
<source lang="vb">
Sub add()
Dim wdApp As Word.Application Set wdApp = GetObject(, "Word.Application") wdApp.Documents.Add Template:="Contemporary Memo.dot"
End Sub
</source>
To save a document with a new name, use the SaveAs method
<source lang="vb">
Sub Main()
Dim wdApp As Word.Application Set wdApp = GetObject(, "Word.Application") wdApp.ActiveDocument.SaveAs "C:MemoTest.docx"
End Sub
</source>