2013-08-29 8 views
2

Иногда excel зависает или падает при выполнении долгого кода VBA (работает 24 часа в сутки), и я изучаю способы обращения с программным обеспечением перезапуска excel. Любые советы по наилучшему способу решения этой проблемы будут оценены по достоинству.Как автоматизировать принудительное закрытие excel, за которым следует перезапуск?

Одна из моих идей - написать dotnet-приложение, которое может быть вызвано, скажем, событием ошибки регистрации Windows, таким как «Имя события: APPCRASH» и «Ошибка приложения EXCEL.EXE», но я понятия не имею если это осуществимый/разумный способ сделать это.

Если это разумный подход, я бы предусмотрел приложение, потенциально выполняющее следующие задачи;

1) Автоматически закрыть или отменить всплывающие окна с ошибками Windows, такие как «Вы хотите отправить дополнительную информацию о проблеме?», «Microsoft Excel перестала работать» или «Microsoft Excel пытается восстановить вашу информацию. "

2) Force близко отличиться, если все еще открыт (например, если висит), а также убийства любого Excel.exe процессов

3) Restart первенствует

ли можно написать такое приложение в DotNet? Какие ссылки/теги я должен искать, чтобы найти дополнительную информацию?

Спасибо, Yug

ответ

3

После некоторого копания, я кусочки следующего решения. Ниже приведен код vbs заставит taskkill выполнить любые выдающиеся процессы excel.exe, а затем откроет указанный файл excel (из которого код vba можно перезапустить автоматически из события workheet_open).

1) Выключите отчеты об ошибках Windows: Start, поиск «Отчеты о проблемах и решения», изменить настройки, расширенные настройки, выключите проблема отчетности

2) Отключить восстановление авто для Excel: В ВБ в вопрос, нажмите; файл, параметры, сохранить, отключить восстановление файлов только для этого только WB

3) В окне просмотра событий Windows, журналах приложений выделите ошибку (приложение для устранения неполадок), щелкните правой кнопкой мыши «создать базовую задачу», запустите приложение/и введите выбранное имя файла в 4).

4) Вставьте следующий код в текстовый файл и сохранить в виде файла VBScript (.vbs)

Option Explicit 

KillProcesses 
ExcelRestart 

Sub ExcelRestart()  
    Dim xlApp 
    Dim xlBook 
    Set xlApp = CreateObject("Excel.Application") 
    xlApp.DisplayAlerts = False 
    Set xlBook = xlApp.Workbooks.Open("C:\...\test.xlsx") 
    xlApp.visible = True 
    xlBook.activate 
    Set xlBook = Nothing 
    Set xlApp = Nothing 
End sub 

Sub KillProcesses 
    On error resume next 
    Dim objWMIService, WshShell 
    Dim proc, procList 
    Dim strComputer, strCommand 
    strCommand = "taskkill /F /IM excel.exe" 
    strComputer = "." 
    Set WshShell = WScript.CreateObject("WScript.Shell") 
    Set objWMIService = GetObject("winmgmts:"& "{impersonationLevel=impersonate}!\\"& strComputer & "\root\cimv2") 
    Set procList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'excel.exe'") 
    For Each proc In procList 
     WshShell.run strCommand, 0, TRUE 
    Next 

End sub 
+0

спасибо за упоминание 'Workbook.EnableAutoRecover = ложь;' –

+0

Это хороший удар на проблему. Однако этот метод теряет любые пользовательские дополнения, которые обычно могут быть загружены при запуске Excel. – Robino