我可以编写哪些VBA代码来确保出现“ Microsoft Excel已停止工作”错误消息?

时间:2018-12-13 16:50:08

标签: excel vba

我确定这似乎是一个奇怪的问题,但是我的一个客户遇到了Excel随机崩溃的问题,并在我的C#程序处于运行状态时给出错误消息“ Microsoft Excel已停止工作”(问题事件名称:APPCRASH)使用Excel(无形),并且我正在尝试重复该问题,以便为我的程序找出解决Excel崩溃的方法。因此,我需要一些VBA代码,这些代码将导致Excel因APPCRASH事件而崩溃。我尝试了以下操作,但是除非可见Excel,否则它不会导致崩溃。有什么建议吗?

Do
   x = 1
Loop

这是错误消息: enter image description here

2 个答案:

答案 0 :(得分:8)

将手伸进去,扭动它们,抓紧柔软的东西,然后将其撕裂。

这应该可以解决问题:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_WNDPROC As Long = (-4)

'SAVE YOUR WORK!
Private Sub BuhBye()
    Dim hWnd As Long
    hWnd = FindWindow(vbNullString, Application.Caption)
    SetWindowLong hWnd, GWL_WNDPROC, AddressOf OopsIDivedItAgain
End Sub

Public Function OopsIDivedItAgain(ByVal hWnd As Long, ByVal Msg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    OopsIDivedItAgain = 1 / 0
End Function

它基本上是Excel主窗口的子类,并有意从消息泵内部抛出。

答案 1 :(得分:5)

这很可能是X-Y问题。

解决此问题的方法不是找出一些可以使您获得类似APPCRASH事件日志条目的随机VBA代码-不会。或者,如果有的话,那么您无论如何都不会学到任何新知识。

解决问题的方法是将VS调试器附加到EXCEL.EXE进程,重现用户步骤,然后观察VS在C#代码中未处理的异常上中断。

您很有可能在某个地方遇到COMException,因此Excel实例突然死亡,并在托管代码中写入了APPCRASH,该异常是进程外发生的异常的副作用产生了EXCEL.EXE进程。

确保您的C#代码正确释放了它正在访问的所有COM对象(每个WorksheetRange / cell,Worksheets集合,Application实例),并且't链接对象成员调用(导致内存泄漏),例如:

xlApp.Worksheets("foo").Range("A1").Value = 42;

上面泄漏了Worksheets集合,Worksheet实例和访问的单元格的Range

托管线程模型和COM线程模型也不完全兼容,因此,如果您的C#代码正在从多个线程访问COM对象,那么请期待COMException


要做的第一件事是重现附带调试器的问题,并查看您的C#代码是否引发异常。试图找到一些会使Excel崩溃的VBA代码并不能解决任何问题。