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 |
|||
Друзья! Имею макрос:
Что нужно добавить, чтобы в итоге еще и Word закрылся? Если Application.Quit вставляю — вылазит ругательное окно VBA. Может неправильно вставляю?))
0 |
Заблокирован |
|
10.12.2016, 06:32 |
6 |
Application.Quit вставляю КУДА?
вылазит ругательное окно VBA КАКОЕ? На какой строке?
0 |
iam_alex 0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 15 |
||||
10.12.2016, 06:43 |
7 |
|||
Переформулирую.
Подскажите, пожалуйста, какую строку и куда необходимо добавить, чтобы в итоге программа Word тоже закрывалась. Спасибо.
0 |
Заблокирован |
||||
10.12.2016, 06:49 |
8 |
|||
Вспоминайте, исправьте код, следуйте инструкции (3-я строка)
Добавлено через 4 минуты
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 15 |
|
10.12.2016, 06:50 |
9 |
Что такое STOP ‘ДАЛЕЕ ИДЕМ ПО [F8] Добавлено через 21 секунду
Из какого приложения работаете с документом? Из Word…..
0 |
Заблокирован |
|
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 |
Заблокирован |
|
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 минут
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()
ENDFORAnd 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
ENDFORTo 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
-
Edited by
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
-
Marked as answer by
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