Создание нового экземпляра приложения Word из кода VBA Excel или подключение к открытому для работы с документами. Функции CreateObject и GetObject.
Работа с Word из кода VBA Excel
Часть 1. Управление приложением Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Создание объекта Word.Application
Экземпляр приложения 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
Создание нового экземпляра Word.Application с помощью функции CreateObject и присвоение ссылки на него переменной myWord:
Dim myWord As Object Set myWord = CreateObject(«Word.Application») |
Присвоение переменной myWord ссылки на открытый экземпляр приложения Word с помощью функции GetObject:
Dim myWord As Object Set myWord = GetObject(, «Word.Application») |
Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Чтобы ее избежать, следует предусмотреть создание нового экземпляра Word.Application с помощью функции CreateObject, если открытое приложение не будет найдено (смотрите пример 3).
В программы VBA Excel, работающие с Word, следует включать обработчик ошибок.
Закрытие объекта Word.Application
Новый экземпляр приложения Word открывается в фоновом режиме. Если необходимо его отобразить на экране перед завершением программы, используйте следующий код:
‘отображаем приложение Word myWord.Visible = True ‘освобождаем переменную от ссылки Set myWord = Nothing |
Если перед завершением процедуры VBA Excel необходимо приложение Word закрыть, используйте метод Quit:
‘закрываем приложение Word myWord.Quit ‘освобождаем переменную от ссылки Set myWord = Nothing |
Если переменная не содержит ссылку на приложение (myWord = Nothing), метод Quit возвратит ошибку. Чтобы этого не произошло, перед применением метода Quit необходимо проверить наличие ссылки в переменной myWord (смотрите пример 3).
Пример 1
Создаем новый экземпляр объекта Word.Application с ранним связыванием и отображаем его на экране:
Sub Primer1() Dim myWord As New Word.Application ‘———- ‘блок операторов для создания, открытия ‘и редактирования документов Word ‘———- myWord.Visible = True Set myWord = Nothing End Sub |
Запустите код примера 1 на выполнение. Вы увидите появившийся на панели задач ярлык приложения Word. Перейдите на него и закройте приложение вручную.
Пример 2
Создаем новый экземпляр объекта Word.Application с поздним связыванием, отображаем его на экране, останавливаем программу и наблюдаем закрытие приложения методом Quit:
Sub Primer2() Dim myWord As Object Set myWord = CreateObject(«Word.Application») ‘———- ‘блок операторов для создания, открытия ‘и редактирования документов Word ‘———- myWord.Visible = True MsgBox «Остановка программы» myWord.Quit Set myWord = Nothing End Sub |
Запустите код примера 2 на выполнение. Закройте информационное окно MsgBox и смотрите, как исчезнет с панели задач ярлык приложения Word, созданного перед остановкой кода.
Пример 3
Пытаемся создать ссылку на открытый экземпляр приложения Word с помощью функции GetObject, а если открытого экземпляра нет, создаем новый с помощью функции CreateObject:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 Instr ‘———- ‘блок операторов для создания, открытия ‘и редактирования документов Word ‘———- myWord.Visible = True Set myWord = Nothing Exit Sub Instr: If Err.Description <> «» Then MsgBox «Произошла ошибка: « & Err.Description End If If Not myWord Is Nothing Then myWord.Quit Set myWord = Nothing End If End Sub |
Строка On Error Resume Next
передаст управление следующему оператору, если открытого экземпляра программы Word не существует, и выполнение функции GetObject приведет к ошибке. В этом случае будет создан новый экземпляр Word.Application с помощью функции CreateObject.
В код добавлен обработчик ошибок On Error GoTo Instr
, который поможет корректно завершить программу при возникновении ошибки. А также он позволит во время тестирования не наплодить большое количество ненужных экземпляров приложения Word. Проверяйте их наличие по Диспетчеру задач (Ctrl+Shift+Esc) и удаляйте лишние.
Строка Exit Sub
завершит процедуру, если она прошла без ошибок. В случае возникновения ошибки, будет выполнен код после метки Instr:
.
I have a macro that inserts select cells of an Excel document into a Word template, copies the entire Word document then closes the document without saving, to preserve certain keywords.
However when it closes the Word document it leaves a blank Word window open, with no active document, and each time the macro runs it leaves a new blank window.
Dim appWd As Word.Application
Dim wdFind As Object
Dim ClipEmpty As New MSForms.DataObject
Dim ClipT As String
Sub CopyDatatoWord()
Dim docWD As Word.Document
Dim sheet1 As Object
Dim sheet2 As Object
Dim saveCell1 As String
Dim saveCell2 As String
Dim saveCell3 As String
Dim dir1 As String
Dim dir2 As String
date_example = Cells(Application.ActiveCell.Row, 3)
Set appWd = CreateObject("Word.Application")
appWd.Visible = True
Set docWD = appWd.Documents.Open(ThisWorkbook.Path & "template.docx")
'Select Sheet where copying from in excel
Set sheet1 = Sheets("Scheduling tracker")
Set wdFind = appWd.Selection.Find
Cells(Application.ActiveCell.Row, 15).Select
Selection.Copy
wdFind.Text = "QREQQ"
Call NoFormatPaste
Cells(Application.ActiveCell.Row, 14).Select
Selection.Copy
wdFind.Text = "QREQNOQ"
Call NoFormatPaste
Cells(Application.ActiveCell.Row, 6).Select
Selection.Copy
wdFind.Text = "QNAMEQ"
Call NoFormatPaste
Cells(Application.ActiveCell.Row, 15).Select
Selection.Copy
wdFind.Text = "QREQQ"
Call NoFormatPaste
Cells(Application.ActiveCell.Row, 14).Select
Selection.Copy
wdFind.Text = "QREQNOQ"
Call NoFormatPaste
Dim dateValue As String
dateValue = Cells(Application.ActiveCell.Row, 3).Value
wdFind.Text = "QDATEQ"
Call NoFormatDatePaste(dateValue)
Dim timeValue As String
timeValue = Cells(Application.ActiveCell.Row, 4).Value
wdFind.Text = "QTIMEQ"
Call NoFormatTimePaste(timeValue)
appWd.Selection.WholeStory
appWd.Selection.Copy
appWd.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
Set appWd = Nothing
Set docWD = Nothing
Set appXL = Nothing
Set wbXL = Nothing
End Sub
This is the window I am left with, and a new one is created each time the macro is run.
I have tried using
appWd.Application.Quit SaveChanges:=wdDoNotSaveChanges
But this will force any other open documents to quit as well. Does anyone know how I can close the document without leaving this blank application window?
Коллеги, добрый день.
К сожалению, не знаю VBA, потому с простой задачей вынужден обратиться к Вам.
Есть статичный документ.
Требуется макрос, закрывающий Word (целиком, а не только документ), после его визуального отображения на экране.
Соответственно макрос должен работать, как я понимаю, на уровне документа (ThisDocument).
Сценарий работы в моем видении:
1. Открытие Word-документа.
2. Когда документ отображается на экране (доступен для чтения), отрабатывает макрос на закрытие этого файла.
3. Закрывается документ.
4. Закрывается Word.
Я использовал данный код на уровне документа:
Visual Basic | ||
|
Но столкнулся с проблемой, что макрос отрабатывает до вывода документа на экран и закрывается только документ.
Как я себе представляю два решения:
1. Средствами VBA можно определить, когда документ не только открыт, но и отображен на экране.
2. Встроить в документ, скажем, красный квадрат. Средствами VBSVBA отлавливать изменения цвета пикселя в центре экрана, если ловится красный цвет — закрывать Word.
Заранее благодарю за помощь!
Буду вдвойне признателен, если сможете предоставить готовый код уже для вставки в документ.
P.S.
Задача бредовая, но…
Сергей Байтеряков Пользователь Сообщений: 11 |
#1 21.03.2017 16:05:27 Как открывать макросом файлы разных типов я разобрался, а вот как после работы с ними их закрывать? Из Эксель, потому что там собирается информация об каждом файле. Типы файлов: Word, PowerPoint, PDF, Visio и разные форматы рисунков (оно открывается средством просмотра Windows).
С Word прокатывает, а на PowerPoint уже не работает, как и на остальных типах, и по имени файла, как написано в описании — не работает тоже. |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
А про какие файлы вообще речь? Вы же получаете ссылку на все приложение PowerPoint, притом исключительно в случае, если он открыт… Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Я же перечислил типы файлов.
. Непонятно как его закрыть. |
|
ZVI Пользователь Сообщений: 4328 |
#4 21.03.2017 18:21:26
Работает и с PowerPoint, только пробел перед .Quit нужно убрать. |
||
ZVI Пользователь Сообщений: 4328 |
С Visio должно быть аналогично GetObject(, «Visio.Application»).Quit |
ZVI Пользователь Сообщений: 4328 |
Процесс можно завершить и с помощью Shell и Taskkill |
Сергей Байтеряков Пользователь Сообщений: 11 |
#7 22.03.2017 09:42:05
Программа: Adobe Acrobat Rider DC
|
||||
Сергей Байтеряков Пользователь Сообщений: 11 |
#8 22.03.2017 09:55:09
Загадка, открыто три файла: Word, Visio,PowerPoint. Ниженаписаный код закрывает только два из трех — PowerPoint остается открытым.
|
||||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
а объект то получаете посмотрите что вернет По вопросам из тем форума, личку не читаю. |
Не получаю. Для ворда и визио — норм. Изменено: Сергей Байтеряков — 23.03.2017 08:56:05 |
|
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
Значит приложение не зарегистрировано корректно По вопросам из тем форума, личку не читаю. |
Сергей Байтеряков Пользователь Сообщений: 11 |
#12 22.03.2017 10:49:22
Попробовал вот так (из самого ПП). Выдает: Microsoft PowerPoint., однако при попытке закрыть с использованием этого наименования все та же ошибка.
|
||||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
ну так совсем не правильно По вопросам из тем форума, личку не читаю. |
ZVI Пользователь Сообщений: 4328 |
#14 23.03.2017 01:30:03
Попробуйте так закрыть все открытые документы PDF:
|
||||
ZVI Пользователь Сообщений: 4328 |
По поводу PowerPoint, возможные причины: Изменено: ZVI — 23.03.2017 02:24:31 |
Сергей Байтеряков Пользователь Сообщений: 11 |
#16 24.03.2017 10:01:27 Всем спасибо за советы.
|
||
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Document.Close method (Word) |
vbawd10.chm158008401 |
vbawd10.chm158008401 |
word |
Word.Document.Close |
59603a58-17ee-bc65-597b-6200e8be9fbc |
06/08/2017 |
medium |
Document.Close method (Word)
Closes the specified document.
Syntax
expression.Close (SaveChanges, OriginalFormat, RouteDocument)
expression Required. A variable that represents a Document object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
SaveChanges | Optional | Variant | Specifies the save action for the document. Can be one of the following WdSaveOptions constants: wdDoNotSaveChanges, wdPromptToSaveChanges, or wdSaveChanges. |
OriginalFormat | Optional | Variant | Specifies the save format for the document. Can be one of the following WdOriginalFormat constants: wdOriginalDocumentFormat, wdPromptUser, or wdWordDocument. |
RouteDocument | Optional | Variant | True to route the document to the next recipient. If the document does not have a routing slip attached, this argument is ignored. |
Example
This example prompts the user to save the active document before closing it. If the user clicks Cancel, error 4198 (command failed) is trapped and a message is displayed.
On Error GoTo errorHandler ActiveDocument.Close _ SaveChanges:=wdPromptToSaveChanges, _ OriginalFormat:=wdPromptUser errorHandler: If Err = 4198 Then MsgBox "Document was not closed"
See also
Document Object
[!includeSupport and feedback]