如何阻止VBA代码运行?

Kir*_*tev 14 excel vba excel-vba

假设我的电子表格中嵌入了一个按钮,可以启动一些VBA功能.

Private Sub CommandButton1_Click()
    SomeVBASub
End Sub

Private Sub SomeVBASub
    DoStuff
    DoAnotherStuff
    AndFinallyDothis
End Sub
Run Code Online (Sandbox Code Playgroud)

我想有机会有一个"取消"按钮,可以SomeVBASub在任意时刻停止执行,我不会涉及到Ctrl+Break这里,因为我想默默地这样做.

我想这应该是相当普遍的问题,任何想法?

谢谢.

Jam*_*rgy 20

添加另一个名为"CancelButton"的按钮,用于设置标志,然后检查该标志.

如果你在"东西"中有长循环,那么也检查它,如果已经设置则退出.在长循环中使用DoEvents以确保UI工作.

Bool Cancel
Private Sub CancelButton_OnClick()
    Cancel=True
End Sub
...
Private Sub SomeVBASub
    Cancel=False
    DoStuff
    If Cancel Then Exit Sub
    DoAnotherStuff
    If Cancel Then Exit Sub
    AndFinallyDothis
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 我有一个想法来实现这种逻辑,但我很尴尬的是在每个可能的过程的出口点(字面意思是几乎每个字符串之后)放入`DoEvents-Check flag`链. (2认同)
  • @Faheemitian描述的方法可以避免这种情况,但它与Ctrl + Break几乎相同.这取决于您希望通过用户界面控制多少(例如按钮)以及允许代码退出的位置.如果UI不重要且代码退出可以是任意的(例如,没有依赖关系,回滚等问题)那么这将是最简单的.通常为取消标志添加陷阱不会太繁琐,因为大多数执行时间都会花在循环中,但在您的情况下可能并非如此. (2认同)
  • 我还要补充一点,如果你担心程序在点击"取消"时没有立即停止(因此你需要添加这么多支票),我通常会做的是禁用"取消"按钮并将文本更改为"等等......或点击过程中的某些内容,以便用户知道应用程序正在考虑他们的请求. (2认同)

Fah*_*eem 9

Application.EnableCancelKey怎么样 - 使用Esc按钮

On Error GoTo handleCancel
Application.EnableCancelKey = xlErrorHandler
MsgBox "This may take a long time: press ESC to cancel"
For x = 1 To 1000000    ' Do something 1,000,000 times (long!)
    ' do something here
Next x

handleCancel:
If Err = 18 Then
    MsgBox "You cancelled"
End If
Run Code Online (Sandbox Code Playgroud)

来自http://msdn.microsoft.com/en-us/library/aa214566(office.11​​).aspx的片段