我写了一个耗时的宏(它可以工作几个小时);这就是为什么我要向我的UserForm
添加两个内容,以手动停止宏。
第一个按钮启动宏。让我们假设这个宏的代码如下:
For i = 1 to 10000
DoEvents
If isCancelled Then Exit Sub
Next i
我正考虑添加额外的"停止"按钮,将isCancelled
从False
更改为True
,但按钮已锁定,无法在宏执行期间单击。有没有办法启用此按钮?或者可能有更好的方法来手动停止宏?
答案 0 :(得分:2)
从概念上讲,这是可能的,可以通过一个简单的例子来说明。这基本上是您提到的代码类型。
假设您的UserForm有两个按钮,分别启动(或恢复)并停止该过程。
Option Explicit
Public isCancelled As Boolean
Public iVal As Long
Private Sub CommandButton1_Click()
Dim i As Long
If iVal = 0 Then iVal = 1 'Allows the user to resume if it's been "stopped"
isCancelled = False
For i = iVal To 100000
iVal = i
If i Mod 1000 = 1 Then
Debug.Print i
End If
If isCancelled Then
GoTo EarlyExit
Else
DoEvents
End If
Next
EarlyExit:
End Sub
Private Sub CommandButton2_Click()
isCancelled = True
End Sub
当然,实施"继续"我在这里做的选项是一个简洁的小技巧,但它可能会变得越来越复杂,具体取决于程序的复杂性,它的依赖性等等。如果您的表单显示vbModeless
,您可以需要确保用户不会以引入运行时错误等方式改变环境。
如果运行时间为小时,您也可以优化您的程序。
答案 1 :(得分:0)
你需要在循环中使用DoEvents
来捕获用户的响应。
请参阅此answer,这对您也有帮助。