Vba excel закрыть файл word

Создание нового экземпляра приложения 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.

Blank Word window left after macro

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub CloseAll() 
     'Close all open files and shutdown Word
     
    With Application 
        .ScreenUpdating = False 
         
         'Loop Through open documents
        Do Until .Documents.Count = 0 
             'Close no save
            .Documents(1).Close SaveChanges:=wdDoNotSaveChanges 
        Loop 
         
         'Quit Word no save
        .Quit SaveChanges:=wdDoNotSaveChanges 
    End With 
End Sub

Но столкнулся с проблемой, что макрос отрабатывает до вывода документа на экран и закрывается только документ.

Как я себе представляю два решения:
1. Средствами VBA можно определить, когда документ не только открыт, но и отображен на экране.
2. Встроить в документ, скажем, красный квадрат. Средствами VBSVBA отлавливать изменения цвета пикселя в центре экрана, если ловится красный цвет — закрывать Word.

Заранее благодарю за помощь!

Буду вдвойне признателен, если сможете предоставить готовый код уже для вставки в документ.

P.S.
Задача бредовая, но…

 

Сергей Байтеряков

Пользователь

Сообщений: 11
Регистрация: 04.12.2013

#1

21.03.2017 16:05:27

Как открывать макросом файлы разных типов я разобрался, а вот как после работы с ними их закрывать? Из Эксель, потому что там собирается информация об каждом файле. Типы файлов: Word, PowerPoint, PDF, Visio и разные форматы рисунков (оно открывается средством просмотра Windows).

Код
Пробовал:
Dim objWork As Object  
 On Error Resume Next
     Set objWork = GetObject(, "PowerPoint.Application")
    objWork .Quit

С Word прокатывает, а на PowerPoint уже не работает, как и на остальных типах, и по имени файла, как написано в описании — не работает тоже.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

А про какие файлы вообще речь? Вы же получаете ссылку на все приложение PowerPoint, притом исключительно в случае, если он открыт…

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Я же перечислил типы файлов.
Программа работает так: открывается файл (разных типов), оператор смотрит, вносит данные в форму — > в базу, файл

закрывается

. Непонятно как его закрыть.
Так как это сделать?  

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

#4

21.03.2017 18:21:26

Цитата
Сергей Байтеряков написал: objWork .Quit
С Word прокатывает, а на PowerPoint уже не работает

Работает и с PowerPoint, только пробел перед .Quit нужно убрать.
Можно и без переменных: GetObject(, «PowerPoint.Application»).Quit

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

С Visio должно быть аналогично GetObject(, «Visio.Application»).Quit
По поводу PDF — напишите сначала, каким кодом открываете PDF-документ.

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

Процесс можно завершить и с помощью Shell и

Taskkill

 

Сергей Байтеряков

Пользователь

Сообщений: 11
Регистрация: 04.12.2013

#7

22.03.2017 09:42:05

Цитата
ZVI написал:
По поводу PDF — напишите сначала, каким кодом открываете PDF-документ.

Программа: Adobe Acrobat Rider DC
Код для открытия:

Код
Function fOpenFile(sFPath As String) As Boolean
    On Error Resume Next
    fOpenFile = ShellExecute(0&, "Open", sFPath, _
                        vbNullString, vbNullString, 1&) > 32
End Function
 

Сергей Байтеряков

Пользователь

Сообщений: 11
Регистрация: 04.12.2013

#8

22.03.2017 09:55:09

Цитата
ZVI написал:
Работает и с PowerPoint, только пробел перед .Quit нужно убрать.
Можно и без переменных: GetObject(, «PowerPoint.Application»).Quit

Загадка, открыто три файла: Word, Visio,PowerPoint. Ниженаписаный код закрывает только два из трех — PowerPoint остается открытым.

Код
Sub fClouse()
    On Error Resume Next
    GetObject(, "PowerPoint.Application").Quit
    GetObject(, "Word.Application").Quit
    GetObject(, "Visio.Application").Quit
End Sub
 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

а объект то получаете посмотрите что вернет
Set objPPA = GetObject(, «PowerPoint.Application»)

По вопросам из тем форума, личку не читаю.

 

Не получаю. Для ворда и визио — норм.
Пишет:
Run-time error ‘429’
ActiveX cjmponent can’t create object

Изменено: Сергей Байтеряков23.03.2017 08:56:05

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

Значит приложение не зарегистрировано корректно
посмотрите что в самом PP выдаст по application
и попробуйте создать объект
objPPA = CREATEOBJECT(«PowerPoint.Application»)

По вопросам из тем форума, личку не читаю.

 

Сергей Байтеряков

Пользователь

Сообщений: 11
Регистрация: 04.12.2013

#12

22.03.2017 10:49:22

Цитата
БМВ написал:
посмотрите что в самом PP выдаст по application

Попробовал вот так (из самого ПП). Выдает: Microsoft PowerPoint., однако при попытке закрыть с использованием этого наименования все та же ошибка.

Код
Sub fProba()
' On Error Resume Next

objPPA = Application

GetObject(, objPPA).Quit
GetObject(, "Microsoft PowerPoint.Application").Quit
End Sub
 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

ну так совсем не правильно
попробуйте создать objPPA = CREATEOBJECT(«PowerPoint.Application») мне кажется у вас проблемас регистрацие приложеия и незнаю, как решить кроме как переустановка/восстановление  попробовать.

По вопросам из тем форума, личку не читаю.

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

#14

23.03.2017 01:30:03

Цитата
Сергей Байтеряков написал: Программа: Adobe Acrobat Reader DC

Попробуйте так закрыть все открытые документы PDF:

Код
Sub ClosePDFs()
  CreateObject("AcroExch.App").CloseAllDocs
End Sub
 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

По поводу PowerPoint, возможные причины:
1. Проблемы с регистрацией DLL в реестре. Это Михаил уже отметил.
Например, когда-то было установлено несколько версий PowerPoint.
Лучше всего переустановить приложение PowerPoint.
2. Если объект таки создается, то закрытию могут мешать надстройки приложения, особенно COM-надстройки.
Нужно временно отключить все надстройки (Файл-Параметры-Надстройки), чтобы убедиться в этом ли причина.

Изменено: ZVI23.03.2017 02:24:31

 

Сергей Байтеряков

Пользователь

Сообщений: 11
Регистрация: 04.12.2013

#16

24.03.2017 10:01:27

Всем спасибо за советы.
В итоге коллега помог решить через закрытие окон с программами (сама функция подпрограмма в конце).

Код
 Option Explicit
   Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
     (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
   Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
     (ByVal hwnd As Long, ByVal lpString As String, _
     ByVal aint As Long) As Long
   Declare Function GetWindow Lib "user32" _
     (ByVal hwnd As Long, ByVal wCmd As Long) As Long
   Declare Function EnumWindows Lib "user32" _
     (ByVal wndenmprc As Long, ByVal lParam As Long) As Long
   Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
     (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
     lParam As Any) As Long

   Private Const WM_CLOSE = &H10
   Private Const GW_HWNDFIRST = 0
   Private Const GW_HWNDLAST = 1
   Private Const GW_HWNDNEXT = 2
   Private Const GW_HWNDPREV = 3
   Private Const GW_OWNER = 4
   Private Const GW_CHILD = 5
   Private Const GW_MAX = 5

   Private mstrTarget As String
   Private mblnSuccess As Boolean


Public Function blnFindWindow(strApplicationTitle As String) As Boolean

   Dim hWndTmp As Long
   Dim nRet As Integer
   Dim TitleTmp As String
   Dim TitlePart As String
   Dim MyWholeTitle As String
   Dim mCounter As Long
   Dim hWndOver As Integer
   Dim sClassName As String * 100

   blnFindWindow = False

   TitlePart = UCase$(strApplicationTitle)

   'loop through all the open windows
   hWndTmp = FindWindow(0&, 0&)

   Do Until hWndTmp = 0

      TitleTmp = Space$(256)
      nRet = GetWindowText(hWndTmp, TitleTmp, Len(TitleTmp))

      If nRet Then
         'retrieve window title
         TitleTmp = UCase$(VBA.Left$(TitleTmp, nRet))
         'compare window title & strApplicationTitle
         If InStr(TitleTmp, TitlePart) Then
            blnFindWindow = True
            Exit Do
         End If
      End If

      hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)
      mCounter = mCounter + 1

   Loop

   End Function


Public Function blnCloseWindow(strApplicationTitle As String) As Boolean

   ' retrieve Windows list of tasks.
   mblnSuccess = False
   mstrTarget = strApplicationTitle
   EnumWindows AddressOf EnumCallback, 0
   blnCloseWindow = mblnSuccess

End Function


Public Function EnumCallback(ByVal app_hWnd As Long, _
  ByVal param As Long) As Long

   Dim buf As String * 256
   Dim title As String
   Dim length As Long

   ' Checks a returned task to determine if App should be closed

   ' get window's title.
   length = GetWindowText(app_hWnd, buf, Len(buf))
   title = Left$(buf, length)

   ' determine if target window.
   If InStr(UCase(title), UCase(mstrTarget)) <> 0 Then
      ' Kill window.
      SendMessage app_hWnd, WM_CLOSE, 0, 0
      mblnSuccess = True
   End If

   ' continue searching.
   EnumCallback = 1

End Function
'------------------------ Сама подпрограмма для закрытия -------------------
Sub main()
'Это функция для закрытия окна с фалом
  If blnFindWindow("название файла без разширения") Then
       If Not blnCloseWindow("название файла без разширения") Then
           MsgBox "Problems encountered closing Window", _
             vbInformation, "API Call"
           Exit Sub
       End If
   End If

End Sub


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]

Понравилась статья? Поделить с друзьями:
  • Vba excel закрыть файл excel без сохранения
  • Vba excel закрыть текущую книгу
  • Vba excel закрыть сам excel
  • Vba excel закрыть окно excel
  • Vba excel закрыть книгу с сохранением без подтверждения