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

时间:2019-06-21 17:36:28

标签: excel vba crash

快速连续单击VBA宏按钮(而不是AcitveX按钮)时,Excel“有时”崩溃。

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

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

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

我只是希望其他人遇到快速宏执行导致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已停止工作”,而不是VBA运行时错误。可以单击错误对话框中的“重新启动excel”按钮,然后excel重新启动,通常大多数情况下,它不会丢失工作。

由于它是断断续续的,所以我无法发布确切的Excel崩溃对话框文本。

2 个答案:

答案 0 :(得分:0)

  

快速连续单击VBA宏按钮(而不是AcitveX按钮)时,Excel“有时”崩溃。

在黑暗中拍摄。尝试这个。将您的代码代替'~~> 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 :(得分:0)

我能够通过做两件事来解决该问题:

  1. 从“按钮表单控件”切换到“命令按钮ActiveX控件”。我的直觉是,ActiveX控件在处理快速单击方面更强大。原来是真的。
  2. 将DoEvents函数添加到“命令按钮ActiveX控件”事件处理程序的末尾。除非有人只是荒谬地单击按钮,否则这几乎消除了99.9%的问题。这里的预感是,它使Excel有时间处理可能由于快速单击按钮而无法正确处理的所有未完成事件。

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