假设我的电子表格中嵌入了一个按钮,可以启动一些VBA功能。
Private Sub CommandButton1_Click()
SomeVBASub
End Sub
Private Sub SomeVBASub
DoStuff
DoAnotherStuff
AndFinallyDothis
End Sub
我希望有机会获得某种“取消”按钮,该按钮会在任意时刻停止SomeVBASub
执行,而我不会在此处涉及Ctrl+Break
,因为我想默默地这样做。
我想这应该是非常普遍的问题,任何想法?
感谢。
答案 0 :(得分: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
答案 1 :(得分: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
来自http://msdn.microsoft.com/en-us/library/aa214566(office.11).aspx
的摘录答案 2 :(得分:2)
或者,如果您想避免使用全局变量,您可以使用用户表单中很少使用的.Tag
属性:
Private Sub CommandButton1_Click()
Me.CommandButton1.Enabled = False 'Disabling button so user cannot push it
'multiple times
Me.CommandButton1.caption = "Wait..." 'Jamie's suggestion
Me.Tag = "Cancel"
End Sub
Private Sub SomeVBASub
If LCase(UserForm1.Tag) = "cancel" Then
GoTo StopProcess
Else
'DoStuff
End If
Exit Sub
StopProcess:
'Here you can do some steps to be able to cancel process adequately
'i.e. setting collections to "Nothing" deleting some files...
End Sub
答案 3 :(得分:0)
Private Sub SomeVBASub
Cancel=False
DoStuff
If not Cancel Then DoAnotherStuff
If not Cancel Then AndFinallyDothis
End Sub
答案 4 :(得分:0)
我做了很多。很多。 : - )
我已经习惯了使用" DoEvents"更常见的是,但仍然倾向于设置运行而不会真正重复检查确定的停止方法。
然后,今天,再次完成它,我想,"好吧,等待3小时结束",然后开始在功能区中划桨。早些时候,我注意到了#34; View"丝带部分a"宏"拉下来,以为我看看我是否能看到我无休止的微距跑......
我现在意识到你也可以使用Alt-F8来解决这个问题。
然后我想,如果我"进入"一个不同的宏,会救我吗?它做了 :-) 它也适用于你进入你正在运行的宏(但你仍然失去了你最重要的地方),除非你是一个像我这样非常懒惰的程序员并宣布了很多" Global"变量,在这种情况下保留全局数据: - )
ķ
答案 5 :(得分:0)
〜对于那些使用自定义输入框的人
Private Sub CommandButton1_Click()
DoCmd.Close acForm, Me.Name
End
End Sub
答案 6 :(得分:0)
这是一篇过时的文章,但是鉴于此问题的标题,应更详细地描述 END 选项。这可以用于停止所有过程(不仅仅是子例程正在运行)。也可以在函数中使用它来停止其他子例程(我发现这些子例程对于我使用的某些加载项很有用)。
立即终止执行。本身并不需要,但可以放置在过程中的任何位置,以结束代码执行,关闭使用Open语句打开的文件以及清除变量*。我注意到没有详细介绍END方法。可以用来停止所有过程(不仅是子例程正在运行)。
这是一个说明性示例:
Sub RunSomeMacros()
Call FirstPart
Call SecondPart
'the below code will not be executed if user clicks yes during SecondPart.
Call ThirdPart
MsgBox "All of the macros have been run."
End Sub
Private Sub FirstPart()
MsgBox "This is the first macro"
End Sub
Private Sub SecondPart()
Dim answer As Long
answer = MsgBox("Do you want to stop the macros?", vbYesNo)
If answer = vbYes Then
'Stops All macros!
End
End If
MsgBox "You clicked ""NO"" so the macros are still rolling..."
End Sub
Private Sub ThirdPart()
MsgBox "Final Macro was run."
End Sub