我可以编写什么VBA代码来保证"Microsoft Excel已停止工作"错误消息?

Mat*_*ann 2 excel vba

我确定这看起来像一个奇怪的问题,但是我的一个客户遇到Excel随机崩溃的问题并且在我的C#程序使用Excel时出现错误消息"Microsoft Excel已停止工作"(问题事件名称:APPCRASH)无形的),我正在尝试复制问题所以我可以找到一种方法让我的程序处理Excel崩溃.所以我需要一些VBA代码,这会导致Excel崩溃APPCRASH事件.我尝试了以下,但除非Excel可见,否则不会导致崩溃.有什么建议?

Do
   x = 1
Loop
Run Code Online (Sandbox Code Playgroud)

这是错误消息: 在此输入图像描述

Com*_*ern 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
Run Code Online (Sandbox Code Playgroud)

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

  • 该死的你是邪恶的. (4认同)
  • @MatthewHagemann我不确定你当时的期待是什么.问题"崩溃Excel的方式与它在用户机器上崩溃的方式完全相同,因此我可以弄清楚它崩溃的原因"是一个奇怪的具体问题(并且需要比我们大多数人更多的无所不知). (4认同)
  • FWIW`Application.hWnd`可用于消除`hWnd`局部变量和`FindWindow` API调用. (2认同)
  • @MathieuGuindon True(完全间隔),虽然如果你想从Excel崩溃*Word*Muahahaha! (2认同)
  • @MatthewHagemann您可以编辑您的问题以包括当时正在寻找的WER报告吗? (2认同)

Mat*_*don 6

这很可能是一个XY问题.

解决这个问题的方法不是弄清楚一些随机的VBA代码可以获得类似的APPCRASH事件日志条目 - 没有人会这样做.或者,如果有的话,那么你无论如何都不会学到任何新东西.

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

很可能你得到了一个COMException地方,你的Excel实例突然因此而死,并且在产生EXCEL.EXE进程的托管代码中编写了一个APPCRASH,它是在进程外发生的异常的副作用.

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

xlApp.Worksheets("foo").Range("A1").Value = 42;
Run Code Online (Sandbox Code Playgroud)

以上是泄漏Worksheets集合,Worksheet实例和Range访问的单元格.

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


首先要做的是用附加的调试器重现问题,看看你的C#代码是否抛出异常.试图找到一些会崩溃Excel的VBA代码对任何事情都无济于事.