Excel 快速连续单击宏按钮时间歇性崩溃

Excel Crashes Intermittently When Clicking Macro Button in Rapid Succession

当快速连续单击 VBA 宏按钮(不是 AcitveX 按钮)时 Excel "sometimes" 崩溃。

VBA 代码大量使用了对象模块,所以我认为这是一个垃圾收集问题。在退出按钮单击宏之前,我明确地将顶级对象设置为空,认为它会强制进行垃圾回收。那没有用。

这非常令人沮丧,因为它是断断续续的。也许 10 到 20 次中有 1 次。

显示的代码只是按钮单击处理程序。这个处理程序调用了大约 10,000 行代码,我没有展示。 VBA 代码从 sheet 读取信息,进行一些计算,更新 sheet 上的 excel 图表,并将一些数据写回工作 sheet .我通常会关闭事件和屏幕更新。

我只是希望有人遇到过导致 excel 崩溃的快速宏执行。同样,VBA 代码运行良好,它似乎是更高级别的 excel 问题?

Public Sub Clicked_UpdateWall_C()
    Dim Wall As New CWall_C
    Dim ExecutionSuccess As Boolean
    Dim errstr As String

    ExecutionSuccess = CheckUnits(ActiveSheet.Name, errstr)

    If ExecutionSuccess Then ExecutionSuccess = Wall.UpdateWall(ActiveSheet.Name, errstr)

    Call CheckError(ExecutionSuccess, errstr)

    ' This is an attempt to force excel to do garbage collection
    Set Wall = Nothing
End Sub

错误消息是 "Excel has stopped working" 而不是 VBA 运行时错误。可以单击错误对话框中的 "restart excel" 按钮,然后 excel 重新启动并且通常大多数时候不会丢失工作。

由于它是间歇性的,我无法 post 确切的 excel 崩溃对话框文本。

When a VBA macro button (not AcitveX button) is clicked in rapid succession Excel "sometimes" crashes.

黑暗中的一枪。试试这个。用你的代码代替 '~~> Rest of your code。现在无论你连续点击多少次,都不会发生任何事情。

Option Explicit

Dim DoNotRunProc As Boolean

Public Sub Clicked_UpdateWall_C()
    If DoNotRunProc = True Then Exit Sub

    DoNotRunProc = True

    On Error GoTo Whoa

    '
    '~~> Rest of your code
    '

Whoa:
    DoNotRunProc = False
End Sub

注意:如果您的代码中有单独的错误处理程序,请相应地调整上面的代码。

我通过做两件事解决了这个问题:

  1. 从 "Button Form Control" 切换到 "Command Button ActiveX Control." 我的预感是 ActiveX 控件在处理快速点击方面更强大。原来是真的。
  2. 在命令按钮 ActiveX 控件事件处理程序的末尾添加了 DoEvents 函数。这几乎消除了 99.9% 的问题,除非有人只是在荒谬地点击按钮。这里的预感是,它给了 Excel 时间来处理任何由于快速单击按钮而可能未正确处理的未决事件。

感谢所有给予积极评价和建议的人。