Vbs закрыть процесс excel без сохранения
Если все работает - отлично. Но когда скрипт падает до того, как он может закрыть Excel, процесс продолжает оставаться и блокировать файл, пока я не убью его вручную.
Как я могу убедиться, что выполняю какие-либо процедуры очистки, даже если сценарий не работает?
2 ответа
Добавьте "On Error Goto ErrorHandler" вверху вашего скрипта, а внизу добавьте " ErrorHandler: ". Под ярлыком ErrorHandler добавьте код для управления ситуацией в зависимости от Err.Number
См. Объект Err в MSDN.
Вы также можете использовать «Возобновить после ошибки». Вот пример.
РЕДАКТИРОВАТЬ: Моя проблема. "Goto" не существует в VBS. Ответ ниже, вероятно, является более аккуратным подходом.
Как вопрос / был? о надежном закрытии Excel, когда VBScript, используемый для его автоматизации, дает сбой:
Если вы напишете
Вы создаете «простую» переменную. VBScript может уменьшить счетчик ссылок, когда переменная выходит за пределы области видимости, но этого точно не произойдет. Закройте Excel за вас.
Если вам нужна такая функция, как вызовы atexit или обработка исключений в VBScript, вам придется написать класс, который «делает то, что я имею в виду» в своем Class_Terminate Sub. Простой пример:
(предназначен для запуска с "cscript 20381749.vbs")
Если вы запустите этот сценарий с открытым диспетчером задач, вы увидите всплывающее окно Excel в списке процессов (и на экране из-за .Visible). Если затем нажать Enter, сценарий прервется с ошибкой «Деление на ноль» и процесс Excel исчезнет из списка процессов.
Если вы удалите параметр .DisplayAlerts, Excel спросит вас, сохранять ли вашу работу или нет, тем самым доказывая, что .Quit из подпрограммы Class_Terminate () действительно переводит Excel в режим прощания.
Класс нуждается в доработке (базовые настройки, общие действия (сохранение?) До .Quit, возможно, защита от неправильного использования (Set oExcel = Nothing или другая чушь культа груза), то добавление .Obj нехорошо, и оно не будет поможет вам, если вы убьете свой .vbs в отладчике, но для стандартных сценариев вы больше не увидите зомби Excel.
добрый день, скажите как закрыть ексель (полностью выйти) с сохранением под таким же названием и без предупреждения
скажите что в этом коде не так((((
Sub вава()
Range("A1") = 1
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
Workbooks.Close
End Sub
добрый день, скажите как закрыть ексель (полностью выйти) с сохранением под таким же названием и без предупреждения
скажите что в этом коде не так((((
Sub вава()
Range("A1") = 1
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
Workbooks.Close
End Sub
Sub вава()
Range("A1") = 1
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
Workbooks.Close
End Sub
' подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False
' сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
' сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save
' закрывает книгу
Workbooks.Close
' закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True
' закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False
' закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
' иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit
' подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False
' сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
' сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save
' закрывает книгу
Workbooks.Close
' закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True
' закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False
' закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
' иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit
' подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False
' сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs ("rl.xlsm")
' сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save
' закрывает книгу
Workbooks.Close
' закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True
' закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False
' закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
' иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit
все отлично)) спасибки. вот чего я хотел)
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quit
все отлично)) спасибки. вот чего я хотел)
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quit 85Muslim85
Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quit Автор - 85Muslim85
Дата добавления - 21.03.2015 в 14:35
С уважением, Павел
Доброе время суток
Если предположить, что других процессов Excel, кроме созданных профильной программой, не запущено, то можно будет воспользоваться таким vbs скриптом
[vba]
Option Explicit
Dim xlApp, pBook
Set xlApp = GetExcel()
Do Until xlApp Is Nothing
For Each pBook In xlApp.Workbooks
'код для печати
'==============
pBook.Close False
Next
xlApp.Quit
Set xlApp = Nothing
WScript.Sleep 2000
Set xlApp = GetExcel()
Loop
Private Function GetExcel()
On Error Resume Next
Dim xls
Err.Clear
Set xls = GetObject(,"Excel.Application")
If Err.Number = 0 Then
Set GetExcel = xls
Else
Set GetExcel = Nothing
End If
End Function
Доброе время суток
Если предположить, что других процессов Excel, кроме созданных профильной программой, не запущено, то можно будет воспользоваться таким vbs скриптом
[vba]
Option Explicit
Dim xlApp, pBook
Set xlApp = GetExcel()
Do Until xlApp Is Nothing
For Each pBook In xlApp.Workbooks
'код для печати
'==============
pBook.Close False
Next
xlApp.Quit
Set xlApp = Nothing
WScript.Sleep 2000
Set xlApp = GetExcel()
Loop
Private Function GetExcel()
On Error Resume Next
Dim xls
Err.Clear
Set xls = GetObject(,"Excel.Application")
If Err.Number = 0 Then
Set GetExcel = xls
Else
Set GetExcel = Nothing
End If
End Function
Option Explicit
Dim xlApp, pBook
Set xlApp = GetExcel()
Do Until xlApp Is Nothing
For Each pBook In xlApp.Workbooks
'код для печати
'==============
pBook.Close False
Next
xlApp.Quit
Set xlApp = Nothing
WScript.Sleep 2000
Set xlApp = GetExcel()
Loop
Private Function GetExcel()
On Error Resume Next
Dim xls
Err.Clear
Set xls = GetObject(,"Excel.Application")
If Err.Number = 0 Then
Set GetExcel = xls
Else
Set GetExcel = Nothing
End If
End Function
anvg, я дико извиняюсь. Спасибо огромное за ответ. Вы не могли бы чуть поподробнее. Я в языке vba не разбираюсь, знаю только как записать макрос с помощью функции записи и потом знаю где его отредактировать , но я так понял, что это код не полный? Что я должен с ним сделать?
anvg, я дико извиняюсь. Спасибо огромное за ответ. Вы не могли бы чуть поподробнее. Я в языке vba не разбираюсь, знаю только как записать макрос с помощью функции записи и потом знаю где его отредактировать , но я так понял, что это код не полный? Что я должен с ним сделать? pahunchil
Добрый день!
Друзья, проблема такая. Есть файл который в общем доступе. Есть куча менеджеров с короткой памятью, которые открывают файл и сидят в нем и ничего не делают. Есть ли возможность с помощью макроса ограничить времени посиделок в файле до 10 минут. По истечению данного времени, файл сохраняется и закрывается?
Добрый день!
Друзья, проблема такая. Есть файл который в общем доступе. Есть куча менеджеров с короткой памятью, которые открывают файл и сидят в нем и ничего не делают. Есть ли возможность с помощью макроса ограничить времени посиделок в файле до 10 минут. По истечению данного времени, файл сохраняется и закрывается? VIDEO56
в стандартном модуле:
[vba]
Sub SetTask()
Application.OnTime Now + TimeSerial(0, 10, 0), "WbClose"
End Sub
Sub WbClose()
ThisWorkbook.Save
ThisWorkbook.Close
End Sub
в стандартном модуле:
[vba]
Sub SetTask()
Application.OnTime Now + TimeSerial(0, 10, 0), "WbClose"
End Sub
Sub WbClose()
ThisWorkbook.Save
ThisWorkbook.Close
End Sub
в стандартном модуле:
[vba]
Sub SetTask()
Application.OnTime Now + TimeSerial(0, 10, 0), "WbClose"
End Sub
Sub WbClose()
ThisWorkbook.Save
ThisWorkbook.Close
End Sub
В стандартный модуль: [vba]
В стандартный модуль: [vba]
В стандартный модуль: [vba]
Друзья, я бы посоветовал вам не исключать возможности того, что некоторые менеджеры всё же работают, и даже через 10 минут. И за внезапное закрытие файла при внесении данных - докладная будет на ТС, с лишением премий и бонусов, как минимум.
Друзья, я бы посоветовал вам не исключать возможности того, что некоторые менеджеры всё же работают, и даже через 10 минут. И за внезапное закрытие файла при внесении данных - докладная будет на ТС, с лишением премий и бонусов, как минимум. AndreTM
думал об этом, но не стал усложнять себе задачу, раз ТС об этом не написал
на самом деле, до идеала далеко.
Первое, что подумалось – это отсутствие удаления таймера. Т.е., если добросовестный менеджер закроет файл сам, то по истечении 10 минут файл снова откроется, для выполнения процедуры, указанной в таймере, и сразу же закроется. Чтобы этого избежать в модуль книги поместите: [vba]
Dim DateTime As Date
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime DateTime, "TimeOut", , False
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Workbook_BeforeClose False
Workbook_Open
End Sub
[/vba] Тогда при каждом изменении в файле, старый таймер будет сбрасываться, а новый устанавливаться, и файл не закроется пока в нем работают (что-то меняют). А как только перестанут менять, так через 2 минуты он сам закроется.
думал об этом, но не стал усложнять себе задачу, раз ТС об этом не написал
на самом деле, до идеала далеко.
Первое, что подумалось – это отсутствие удаления таймера. Т.е., если добросовестный менеджер закроет файл сам, то по истечении 10 минут файл снова откроется, для выполнения процедуры, указанной в таймере, и сразу же закроется. Чтобы этого избежать в модуль книги поместите: [vba]
Dim DateTime As Date
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime DateTime, "TimeOut", , False
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Workbook_BeforeClose False
Workbook_Open
End Sub
[/vba] Тогда при каждом изменении в файле, старый таймер будет сбрасываться, а новый устанавливаться, и файл не закроется пока в нем работают (что-то меняют). А как только перестанут менять, так через 2 минуты он сам закроется. KSV
думал об этом, но не стал усложнять себе задачу, раз ТС об этом не написал
на самом деле, до идеала далеко.
Первое, что подумалось – это отсутствие удаления таймера. Т.е., если добросовестный менеджер закроет файл сам, то по истечении 10 минут файл снова откроется, для выполнения процедуры, указанной в таймере, и сразу же закроется. Чтобы этого избежать в модуль книги поместите: [vba]
Dim DateTime As Date
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime DateTime, "TimeOut", , False
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Workbook_BeforeClose False
Workbook_Open
End Sub
[/vba] Тогда при каждом изменении в файле, старый таймер будет сбрасываться, а новый устанавливаться, и файл не закроется пока в нем работают (что-то меняют). А как только перестанут менять, так через 2 минуты он сам закроется. Автор - KSV
Дата добавления - 19.08.2015 в 18:07
VIDEO56, перерыл все форумы, но в итоге пришлось сделать самому, понадобилось по работе.
Настраиваем автоматическое закрытие Excel файла при отсутствии активности пользователя в течение определенного времени.
Очень часто в повседневной деятельности нам приходится командой работать с Excel файлом, который находится в общем доступе на сетевом диске. В случае, если файл содержит умные таблицы, то предоставление общего доступа через Review->Share Workbook не представляется возможным из-за ограничений самого Excel. Это порождает проблему блокирования рабочего файла, если один забывчивый сотрудник оставил файл открытым после небольших коррекций и ушёл, например, обедать, а второму сотруднику срочно нужно внести в файл новую информацию. Примеров Вы сами можете вспомнить огромное количество.
Ну что же, приступим!
Задача: Необходимо обеспечить автоматическое сохранение и закрытие файла после бездействия пользователя. При этом пользователь может вносить коррекции в файл, а потом бездействовать, либо просто открыть файл и ничего не делать. Под действием мы понимаем изменение любого диапазона ячеек (удаление значений, ввод новых данных и т.д.) на конкретном листе книги.
Решение:
В целом, чтобы выполнить все условия задачи необходимо будет использовать метод .OnTime. Он запускает таймер на выполнение процедуры закрытия файла. При этом нужно будет прерывать действие запущенного таймера при внесении новых изменений, и запускать его заново.
Теперь конкретно. Для начала приведу код, а потом всё объясню.
Приложенный Excel - макра, Word - описание.
VIDEO56, перерыл все форумы, но в итоге пришлось сделать самому, понадобилось по работе.
Настраиваем автоматическое закрытие Excel файла при отсутствии активности пользователя в течение определенного времени.
Очень часто в повседневной деятельности нам приходится командой работать с Excel файлом, который находится в общем доступе на сетевом диске. В случае, если файл содержит умные таблицы, то предоставление общего доступа через Review->Share Workbook не представляется возможным из-за ограничений самого Excel. Это порождает проблему блокирования рабочего файла, если один забывчивый сотрудник оставил файл открытым после небольших коррекций и ушёл, например, обедать, а второму сотруднику срочно нужно внести в файл новую информацию. Примеров Вы сами можете вспомнить огромное количество.
Ну что же, приступим!
Задача: Необходимо обеспечить автоматическое сохранение и закрытие файла после бездействия пользователя. При этом пользователь может вносить коррекции в файл, а потом бездействовать, либо просто открыть файл и ничего не делать. Под действием мы понимаем изменение любого диапазона ячеек (удаление значений, ввод новых данных и т.д.) на конкретном листе книги.
Решение:
В целом, чтобы выполнить все условия задачи необходимо будет использовать метод .OnTime. Он запускает таймер на выполнение процедуры закрытия файла. При этом нужно будет прерывать действие запущенного таймера при внесении новых изменений, и запускать его заново.
Теперь конкретно. Для начала приведу код, а потом всё объясню.
Приложенный Excel - макра, Word - описание. nilidan
Настраиваем автоматическое закрытие Excel файла при отсутствии активности пользователя в течение определенного времени.
Очень часто в повседневной деятельности нам приходится командой работать с Excel файлом, который находится в общем доступе на сетевом диске. В случае, если файл содержит умные таблицы, то предоставление общего доступа через Review->Share Workbook не представляется возможным из-за ограничений самого Excel. Это порождает проблему блокирования рабочего файла, если один забывчивый сотрудник оставил файл открытым после небольших коррекций и ушёл, например, обедать, а второму сотруднику срочно нужно внести в файл новую информацию. Примеров Вы сами можете вспомнить огромное количество.
Ну что же, приступим!
Задача: Необходимо обеспечить автоматическое сохранение и закрытие файла после бездействия пользователя. При этом пользователь может вносить коррекции в файл, а потом бездействовать, либо просто открыть файл и ничего не делать. Под действием мы понимаем изменение любого диапазона ячеек (удаление значений, ввод новых данных и т.д.) на конкретном листе книги.
Решение:
В целом, чтобы выполнить все условия задачи необходимо будет использовать метод .OnTime. Он запускает таймер на выполнение процедуры закрытия файла. При этом нужно будет прерывать действие запущенного таймера при внесении новых изменений, и запускать его заново.
Теперь конкретно. Для начала приведу код, а потом всё объясню.
Приложенный Excel - макра, Word - описание. Автор - nilidan
Дата добавления - 28.04.2019 в 21:54
nilidan, забыл сделать блокировку сохранения и закрытия для случая, если файл открыт в режиме read only, оно там не нужно совсем. Обновленные файлики прикрепляю. В принципе можно сделать закрытие, но без сохранения, иначе excel Будет предлагать сохранить файл с новым именем, что нам не надо. Для этого нужно поместить условия с ThisWorkbook.ReadOnly в процедуры Wbclose.
nilidan, забыл сделать блокировку сохранения и закрытия для случая, если файл открыт в режиме read only, оно там не нужно совсем. Обновленные файлики прикрепляю. В принципе можно сделать закрытие, но без сохранения, иначе excel Будет предлагать сохранить файл с новым именем, что нам не надо. Для этого нужно поместить условия с ThisWorkbook.ReadOnly в процедуры Wbclose. nilidan
ребята вы мне просто богом посланы, СПАСИБО!
p.s. вроде сразу работало, а теперь эррорит, причем не только этот документ а все документы на ПК. Пойду офис переставлю
ребята вы мне просто богом посланы, СПАСИБО!
p.s. вроде сразу работало, а теперь эррорит, причем не только этот документ а все документы на ПК. Пойду офис переставлю shevazp
p.s. вроде сразу работало, а теперь эррорит, причем не только этот документ а все документы на ПК. Пойду офис переставлю Автор - shevazp
Дата добавления - 05.06.2019 в 08:26
С вашего позволения хотел бы поднять тему.
А как в этом же коде включить принуждение использования макросов. До того активная книга должна быть скрыта.
Я так понимаю, если юзер не включит этого, то и код не сработает.
С вашего позволения хотел бы поднять тему.
А как в этом же коде включить принуждение использования макросов. До того активная книга должна быть скрыта.
Я так понимаю, если юзер не включит этого, то и код не сработает. draginoid
Suppose I am running an .vbs script to work with Excel sheet,now if somehow due to any reason any error occurs,I want to quit that .vbs script to run and besides to kill the process EXCEL.EXE from that .vbs file immedaitely.
After killing that process EXCEL.EXE, i want all the data change has been made by the script on the excel sheet should need to be ROLLBACK
UPDATE:
I have a code with me, but how should I embed it with my script,I couldn't understand:
SCRIPT
TerminateCode
As long as you haven't saved any of the changes you might have made to any files, this should be no problem. So, what have you tried, and what problems did you run into?
Sometimes Scripts failed due to bad data,date formatting issues etc,and then scripts got failed with an pop up.But when I opened the Task Manager,seen that EXCEL.EXE process running.And everytime i need to go and kill that process manually.Thus I want it to be done from the script itself,whenever any error occurs. And also it would create a text file at run time,where the error detailed description should be written.The .text file should be in the Same folder where the Excel sheet will be placed.
I just killed notepad from the script based on your first script above . For each Process in objService.Instanceof("win32_process") If process.name = "notepad.exe" Then process.terminate() . To put this into an Error statement, see vbscript error handling
2 Answers 2
The comments show that it's a bad idea to use WMI to kill the zombie Excel.exe left over from a aborted script. The correct way is to tame VBScript's horrible error handling by putting a OERN..OEG0 around a function that contains your former top-level code:
output of three runs:
If you open the task manager and check the sheet from time to time with Excel, you'll see that
- there won't be Excel.exe zombies (execpt if you use a debugger)
- the .xls won't be changed in case of errors
See here for a little bit of background wrt the code structure/layout/Main() function.
UPDATE - to explain my down vote of @oracle's answer:
Update II:
I revoked the down vote on @oracle's answer, because the WScript.Quit in the error handling If block will stop the script in case of this error. But consider: All other unchecked errors will stay hidden and won't abort the program, and each check will cost you about 5 lines of boilerplate code.
Читайте также: