Vba word закрыть все документы

1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

1

Закрыть документ программно

18.11.2016, 09:28. Показов 3184. Ответов 12


Студворк — интернет-сервис помощи студентам

close — закрываем документ, но как бы Ворд висит, как бы закрыть документ по настоящему, как кликнул бы мышью в правый верхний крестик? спасибо



0



1261 / 147 / 32

Регистрация: 11.02.2011

Сообщений: 418

18.11.2016, 09:44

2

Application.Quit



0



1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

18.11.2016, 09:59

 [ТС]

3

в этом случае он закрывает все документы Ворд, а нужно 1 — там где сработал макрос на закрытие



0



1261 / 147 / 32

Регистрация: 11.02.2011

Сообщений: 418

18.11.2016, 11:10

4

Неправильно понял, значит ActiveWindow.Close



0



iam_alex

0 / 0 / 0

Регистрация: 10.06.2016

Сообщений: 15

10.12.2016, 06:10

5

Друзья! Имею макрос:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub FinishJob()
    Dim objDoc As Word.Document: Application.ScreenUpdating = False
    For Each objDoc In Application.Documents
        If objDoc.Windows(1).Visible = True Then
            ' закрываем с сохранением только изменённые файлы
            objDoc.Close (Not objDoc.Saved) ' ранее сохранённые файлы просто закрываются
        End If
    Next objDoc
End Sub

Что нужно добавить, чтобы в итоге еще и Word закрылся? Если Application.Quit вставляю — вылазит ругательное окно VBA. Может неправильно вставляю?))



0



Shersh

Заблокирован

10.12.2016, 06:32

6

Цитата
Сообщение от iam_alex
Посмотреть сообщение

Application.Quit вставляю

КУДА?

Цитата
Сообщение от iam_alex
Посмотреть сообщение

вылазит ругательное окно VBA

КАКОЕ? На какой строке?



0



iam_alex

0 / 0 / 0

Регистрация: 10.06.2016

Сообщений: 15

10.12.2016, 06:43

7

Переформулирую.
Имею макрос:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub FinishJob()
    Dim objDoc As Word.Document: Application.ScreenUpdating = False
    For Each objDoc In Application.Documents
        If objDoc.Windows(1).Visible = True Then
            ' закрываем с сохранением только изменённые файлы
            objDoc.Close (Not objDoc.Saved) ' ранее сохранённые файлы просто закрываются
        End If
    Next objDoc
End Sub

Подскажите, пожалуйста, какую строку и куда необходимо добавить, чтобы в итоге программа Word тоже закрывалась. Спасибо.



0



Shersh

Заблокирован

10.12.2016, 06:49

8

Вспоминайте, исправьте код, следуйте инструкции (3-я строка)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub FinishJob()
 
    STOP 'ДАЛЕЕ ИДЕМ ПО [F8]
 
    Dim objDoc As Word.Document: Application.ScreenUpdating = False
    For Each objDoc In Application.Documents
        If objDoc.Windows(1).Visible = True Then
            ' закрываем с сохранением только изменённые файлы
            objDoc.Close (Not objDoc.Saved) ' ранее сохранённые файлы просто закрываются
        End If
    Next objDoc
 
              Application.Quit
 
End Sub

Добавлено через 4 минуты
iam_alex, Из какого приложения работаете с документом?



0



0 / 0 / 0

Регистрация: 10.06.2016

Сообщений: 15

10.12.2016, 06:50

9

Что такое STOP ‘ДАЛЕЕ ИДЕМ ПО [F8]

Добавлено через 21 секунду

Цитата
Сообщение от Shersh
Посмотреть сообщение

Из какого приложения работаете с документом?

Из Word…..



0



Shersh

Заблокирован

10.12.2016, 06:51

10

Это код, останавливающий макрос для отладки (после апострофа — примечание(инструкция))



0



0 / 0 / 0

Регистрация: 10.06.2016

Сообщений: 15

10.12.2016, 06:56

11

открыл Word, два документа, открыл редактор VB, по F8 прошелся — документы закрылись, Word закрылся. Если вызываю макрос с кнопки — документы закрываются, но Word нет и вылазит окошко VBA с красным крестиком без текста



0



Shersh

Заблокирован

10.12.2016, 07:01

12

Приложите документ с макросом и кнопкой (скрепка справа в верхней строке меню)
Заархивируйте при необходимости.



0



0 / 0 / 0

Регистрация: 10.06.2016

Сообщений: 15

10.12.2016, 07:23

13

После слов «приложите документ» до меня дошло)) Код был прописан в Normal.dot не модулем а прямо в Word Objects — ThisDocument))) Теперь все работает.

Добавлено через 13 минут
Shersh, спасибо за участие!)



0



  • Remove From My Forums
  • Question

  • A novice at automating MS Office, I’m programming Word from Visual FoxPro, and have run into the problem that if a user tries to open a document that’s already open, nothing appears to happen since it encounters a «File in use» error, which the
    user can’t see since it opens behind another window. In this particular application it would be satisfactory simply to close any open documents each time an attempt is made from the menu to open another document regardless of whether there’s a conflict. And
    that’s better anyway since otherwise users will be confused.

    Here is my initial test of the method I thought might accomplish that:

    oWord = GETOBJECT(, «Word.Application»)
    ? oWord.Documents.Count
    FOR i=1 TO oWord.Documents.Count
       ? oWord.Documents(i).Name
       oWord.Documents(i).Close()
    ENDFOR

    And that worked, at first, although oWord.Documents.Count was always = 1 since the already opened documents belonged to separate instances of Word, being opened by the code below. But at least I was able to run the above code again and again to close each
    remaining document one at a time, so the method seemed promising.

    NMBRLTRS=ALEN(ARC_LETRS)
    FOR I = 1 TO NMBRLTRS
       oWord = CREATEOBJECT( «Word.Application» )
       oWord.Visible = .T.
       FULLPATH=ACDBF + ‘Correspondence’ + ARC_LETRS(I)
       sDoc = FULLPATH      
       oWord.Documents.Open( sDoc, 0, 0 ) && parm 3 read only = not
       RELEASE oWord
    ENDFOR

    To improve the situation, I re-wrote the code just above to open all the previously opened docs in the same Word instance, but then the little program for closing them stopped working, reporting oWord.Documents.Count as 0 each time I tried it. And that happened
    even when I put back the code just above.

    So now I’m mystified.

    Am I going about this the wrong way anyway?

    Thanks in advance for your help.


    Peyton

    • Edited by

      Thursday, October 31, 2013 9:49 PM

Answers

  • Hi Peyton

    I believe this article explains why this is happening

    http://support.microsoft.com/kb/238975/en-us

    In the .NET world, it’s possible to work with processes, which makes it simpler to get to these things. Not sure if/how you can do that with VFP — it would certainly involve the Windows API…


    Cindy Meister, VSTO/Word MVP,
    my blog

    • Marked as answer by
      Luna Zhang — MSFT
      Monday, November 11, 2013 9:04 AM

You can try WordDoc.Close SaveChanges:=wdDoNotSaveChanges before the Set WordDoc = Nothing

Also, if you want to quit the program entirely you should indeed send the command to quit it before setting the variable to Nothing:

WordApp.Quit SaveChanges:=wdDoNotSaveChanges

Other options for the Quit and Close methods can be found in the documentation: Application.Quit; Document.Close.

Your final code might look like this:

Sub pdf()
    Dim WordApp As Object
    Dim WordDoc As Object
    Set WordApp = CreateObject("Word.Application")

    WordApp.Visible = True

    Set WordDoc = WordApp.Documents.Open("C:testdoc.docx")

    WordDoc.ExportAsFixedFormat OutputFileName:= _
        "C:testdoc.docx.pdf", ExportFormat:= _
        17, OpenAfterExport:=False, OptimizeFor:= _
        0, Range:=0, From:=1, to:=1, _
        Item:=0, IncludeDocProps:=True, KeepIRM:=True, _
        CreateBookmarks:=0, DocStructureTags:=True, _
        BitmapMissingFonts:=True, UseISO19005_1:=False

    'If you want to quit the entire Application:
    WordApp.Quit SaveChanges:=wdDoNotSaveChanges

    'If you want to quit only the Document:
    'WordDoc.Close SaveChanges:=wdDoNotSaveChanges

    Set WordDoc = Nothing
    Set WordApp = Nothing
End Sub

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

Я пытаюсь в начале своего макроса закрыть все Word-приложение, если оно открыто, хотя я не знаю, какие документы открыты, и я не могу установить их как объект. Спасибо.

3 ответа

Лучший ответ

Это закроет все работающие документы Word.

Вам понадобится On Error Resume Next для предотвращения ошибок, если не запущен ни один экземпляр приложения Word.

Option Explicit

Sub CloseWordDocuments()

    Dim objWord As Object

    Do
        On Error Resume Next
        Set objWord = GetObject(, "Word.Application")
        If Not objWord Is Nothing Then
            objWord.Quit
            Set objWord = Nothing
        End If
    Loop Until objWord Is Nothing

End Sub


6

Robin Mackenzie
12 Дек 2016 в 12:22

Попробуйте приведенный ниже код, он закроет приложение Word (без сохранения).

Option Explicit

Sub CloseWordWindows()

Dim objWord As Object

On Error Resume Next
Set objWord = GetObject(, "Word.Application")

' if no active Word is running >> exit Sub
If objWord Is Nothing Then
    Exit Sub
End If

objWord.Quit
Set objWord = Nothing

End Sub


1

Shai Rado
12 Дек 2016 в 12:18

Другой вариант — использовать Shell, чтобы получить доступ к элегантности PowerShell

Sub Comesfast()
X = Shell("powershell.exe kill -processname winword", 1)
End Sub


1

brettdj
28 Мар 2017 в 06:58

Понравилась статья? Поделить с друзьями:
  • Vba word selection find if not found
  • Vba word его объекты
  • Vba word selection find execute
  • Vba word добавить страницу
  • Vba word select words