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
注意:如果您的代码中有单独的错误处理程序,请相应地调整上面的代码。
我通过做两件事解决了这个问题:
- 从 "Button Form Control" 切换到 "Command Button ActiveX Control." 我的预感是 ActiveX 控件在处理快速点击方面更强大。原来是真的。
- 在命令按钮 ActiveX 控件事件处理程序的末尾添加了 DoEvents 函数。这几乎消除了 99.9% 的问题,除非有人只是在荒谬地点击按钮。这里的预感是,它给了 Excel 时间来处理任何由于快速单击按钮而可能未正确处理的未决事件。
感谢所有给予积极评价和建议的人。
当快速连续单击 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
注意:如果您的代码中有单独的错误处理程序,请相应地调整上面的代码。
我通过做两件事解决了这个问题:
- 从 "Button Form Control" 切换到 "Command Button ActiveX Control." 我的预感是 ActiveX 控件在处理快速点击方面更强大。原来是真的。
- 在命令按钮 ActiveX 控件事件处理程序的末尾添加了 DoEvents 函数。这几乎消除了 99.9% 的问题,除非有人只是在荒谬地点击按钮。这里的预感是,它给了 Excel 时间来处理任何由于快速单击按钮而可能未正确处理的未决事件。
感谢所有给予积极评价和建议的人。