执行一些长时间运行的VBA代码(运行24小时/天)时偶尔会出现冻结或崩溃的问题,我正在研究以编程方式处理excel重启的方法。任何有关最佳方式的建议都将受到赞赏。
我的一个想法是编写一个可能由Windows日志记录错误事件触发的dotnet应用程序,例如'Event Name:APPCRASH'和'Faulting application EXCEL.EXE',但我不知道是否这是可行/明智的方式。
如果它恰好是一种明智的做法,我会设想该应用可能执行以下任务;
1)自动关闭/取消任何Windows错误弹出框,例如“您是否要发送有关问题的更多信息?”,“Microsoft Excel已停止工作”或“Microsoft Excel正在尝试恢复您的信息”。
2)强制关闭excel如果仍然打开(例如挂起),以及杀死任何excel.exe进程
3)重启excel
是否可以在dotnet中编写这样的应用程序?我应该寻找哪些参考/标签以找到更多信息?
谢谢, YUG
答案 0 :(得分:3)
经过一番挖掘,我拼凑了以下解决方案。下面的vbs代码将强制taskkill任何未完成的excel.exe进程,然后打开指定的excel文件(可以从worksheet_open事件自动重新启动vba代码)。
1)关闭Windows错误报告: 开始,搜索“问题报告和解决方案”,更改设置,高级设置,关闭问题报告
2)禁用excel的自动恢复: 在相关的WB中,点击;文件,选项,保存,仅禁用此WB的文件恢复
3)在Windows事件查看器,应用程序日志下,突出显示错误(错误的excel应用程序),右键单击“创建基本任务”,运行应用程序/脚本,然后在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