1 (изменено: alexii, 2011-12-01 19:11:00)

Тема: WSH: Закрыть Excel с сохранением

Как закрыть Excel с сохранением изменений?

Я делаю так:

Dim objXL
On Error Resume Next
Set objXL = GetObject(, "Excel.Application")
If Not TypeName(objXL) = "Empty" Then
objXL.DisplayAlerts = False
objXL.Save
objXL.quit
End If

Всё работает, но такой нюанс: если курсор стоит в ячейке, то он не закрывается. В чём дело?

2

Re: WSH: Закрыть Excel с сохранением

А еще если курсор стоит в ячейке, то и другой эксельный файл кликом на нем в проводнике - не открывается!:)

Видимо, Эксель ожидает завершения редактирования ячейки.

WBR. Roman

3

Re: WSH: Закрыть Excel с сохранением

Господа программисты прошу помочь с закрытием Excel_я.

4

Re: WSH: Закрыть Excel с сохранением

tombender, я лично не нашёл как сие можно определить и «забороть».

5 (изменено: max7, 2011-12-12 21:32:59)

Re: WSH: Закрыть Excel с сохранением

Это режимы "Ввод и Правка" в ячейке, блокирует довольно много команд и функций.
Режимы отображаются в строке состояния http://office.microsoft.com/ru-ru/excel … 22505.aspx
Лечение 1: http://office.microsoft.com/ru-ru/excel … 03588.aspx
Лечение 2: objXL.EditDirectlyInCell = False

+ Полезно почитать про следующие параметры:

HighQualityModeForGraphics
IgnoreRemoteRequests
EnableEvents
Visible
DisplayAlerts
DisplayStatusBar
ScreenUpdating
CutCopyMode
CellDragAndDrop
EditDirectlyInCell
AlertBeforeOverwriting
AskToUpdateLinks
CopyObjectsWithCells
EnableAutoComplete
MapPaperSize

6

Re: WSH: Закрыть Excel с сохранением

max7, это поможет в случае, когда Excel уже в этом режиме? К тому же я не увидел разницы в результатах попытки обращения при различных значениях параметра «EditDirectlyInCell».

7 (изменено: max7, 2011-12-12 21:40:38)

Re: WSH: Закрыть Excel с сохранением

Когда Excel в этом режиме - не поможет ничего. Его можно только отключить до показа пользователю окна.

8

Re: WSH: Закрыть Excel с сохранением

max7 пишет:

Лечение 2: objXL.EditDirectlyInCell = False

Не доберешься до objXL если он уже в этом режиме

9

Re: WSH: Закрыть Excel с сохранением

Здесь ничего средствами Excel'я сделать нельзя. Либо менять постановку задачи, либо обходные пути.

10

Re: WSH: Закрыть Excel с сохранением

dab00 пишет:

Не доберешься до objXL если он уже в этом режиме

max7 пишет:

Когда Excel в этом режиме - не поможет ничего. Его можно только отключить до показа пользователю окна.

У меня значение «.EditDirectlyInCell» не влияет на это вообще, независимо от того, чему оно равно. Если начато редактирование, неважно — в самой ячейке, або в строке формул — доступа нет.

11

Re: WSH: Закрыть Excel с сохранением

«.EditDirectlyInCell» - отключает редактирование непосредственно в ячейке и всё, правильно это называется так: http://mac2.microsoft.com/help/office/1 … dddb1684c4
Если же каким либо образом excel оказался в режиме ввода и правки, через ячейку, или строку формул, или ещё как, блокируется всё: VBA, вычисления, события, "remote requests" - всё; и сделать с этим средствами excel'я ничего нельзя. Ну, можно, например, сторонними средствами сгенерировать нажатие ESCAPE (при активном окне excel'я), тогда он выйдет из этого режима.

12

Re: WSH: Закрыть Excel с сохранением

2max7: ну, да, и я про это. Меня удивило Ваше:

max7 пишет:

Лечение 2: objXL.EditDirectlyInCell = False

13 (изменено: dab00, 2011-12-13 11:21:01)

Re: WSH: Закрыть Excel с сохранением

max7 пишет:

Ну, можно, например, сторонними средствами сгенерировать нажатие ESCAPE (при активном окне excel'я), тогда он выйдет из этого режима.

В таком случае, если знаем имя книги - решение есть:


With CreateObject("WScript.Shell")
	.AppActivate "Книга1"
	.sendkeys "{ESCAPE}"	
End With

Если не знаем - решения нет, т.к. objXL недоступен.
Можно конечно:


For Each objProcess In GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * from Win32_Process Where Name='excel.exe'")
	objProcess.Terminate()
Next

Но тогда о сохранении изменений, разумеется, речи не идет .

14 (изменено: Rom5, 2011-12-13 22:08:18)

Re: WSH: Закрыть Excel с сохранением

Кстати, а почему сторонним средством отправлять именно Esc?
Ведь по идее можно отправить и Enter или Tab, чтобы изменения в редактируемой ячейке оставались. И может это самое сторонее средство сможет и получить список всех окон, чтобы вычислить интересуемое Эксельное.

tombender, а каким образом запускается скрипт выхода-сохранения, что при его работе допутимы незаконченные правки пользователя?

WBR. Roman

15

Re: WSH: Закрыть Excel с сохранением

Rom5 пишет:

Кстати, а почему сторонним средством отправлять именно Esc?
Ведь по идее можно отправить и Enter или Tab, чтобы изменения в редактируемой ячейке оставались.

ОК, тогда так:


With CreateObject("WScript.Shell")
	.AppActivate "Книга1"
	.SendKeys "{Enter}"	
End With
Rom5 пишет:

И может это самое сторонее средство сможет и получить список всех окон, чтобы вычислить интересуемое Эксельное.

Чтобы получить список всех открытых книг экселя нужно отработать с коллекцией workbooks объекта objXL, а он недоступен. А вычислить окошки экселя из скрипта без костылей по-моему не получится.

Rom5 пишет:

tombender, а каким образом запускается скрипт выхода-сохранения, что при его работе допутимы незаконченные правки пользователя?

Выход-сохранение можно реализовать так:


With GetObject(, "Excel.Application")
	.DisplayAlerts = False		
	.Save
	.Quit
End With