默认情况下,在代码运行期间如果我们按下 Ctrl+Break 组合键或 Esc 键,将显示如下图所示的消息框:
例如,运行以下 InputValue
过程,由于整个过程非常耗时,我们可以按 Esc 或 Ctrl+Break 组合键来中断其运行。在该对话框中单击【继续】按钮将继续执行代码,单击【结束】按钮将结束过程,单击【调试】按钮将打开 VBE 进入中断模式。
Sub InputValue()
Dim i As Long
Cells.ClearContents
For i = 1 To 100000
Cells(i, 1).Value = i
Next i
End Sub
EnableCancelKey 属性
我们可以使用 Application 对象的 EnableCancelKey 属性来控制 Excel 如何处理用户按 Ctrl+Break 组合键或 Esc 键对正在运行的过程的中断。XIEnableCancelKey 常量取值如下表所示:
XlEnableCancelKey 常量 | 值 | 描述 |
---|---|---|
xlDisabled | 0 | 完全禁用“取消”键捕获功能。 |
xlErrorHandler | 2 | 将中断作为错误发送给运行程序,由 On Error GoTo 语句设置的错误处理程序捕获。可捕获的错误代码为 18 。 |
xlInterrupt | 1 | 中断当前运行程序,用户可进行调试或结束程序的运行。 |
如果使用 xlDisabled
,则无法中断失控循环或其他的不能自行结束的代码。同样,如果使用 xlErrorHandler
,但错误处理程序始终使用 Resume
语句返回,那么同样无法阻止失控代码。
只要 Excel 返回空闲状态并且没有程序处于运行状态,EnableCancelKey 属性都会重置为 xlInterrupt
。若要在程序运行中捕获或者禁用取消过程,则每次在程序被调用时必须明确更改 EnableCancelKey 属性。
示例:xlDisabled
以下示例将 EnableCancelKey 属性都设置为 xlDisabled
,完全禁用“取消”键捕获功能。一旦用户选择“是”,就会忽略用户中断操作,代码会运行直至过程结束。
Sub DisbledESC()
Dim i As Long
Dim strTip As String
strTip = "代码运行需要较长时间,是否继续?选择""是""执行,""否""取消。"
Application.EnableCancelKey = xlDisabled
If MsgBox(strTip, vbInformation + vbYesNo) = vbYes Then
Cells.Clear
For i = 1 To 10000
Cells(i, 1).Value = i
Next i
End If
End Sub
示例:xlErrorHandler
以下示例将 EnableCancelKey 属性都设置为 xlErrorHandler
,用户自定义取消中断程序的方法,在代码运行过程中用户可随时取消代码的执行。
Sub ErrorHandleESC()
Dim i As Long
Dim strTip As String
strTip = "代码运行需要较长时间,按 ESC 或 Ctrl+Break 可终止当前代码。"
On Error GoTo HandleCancel
Application.EnableCancelKey = xlErrorHandler
MsgBox strTip, vbExclamation
Cells.Clear
For i = 1 To 10000
Cells(i, 1).Value = i
Next i
Exit Sub
HandleCancel:
If Err.Number = 18 Then
MsgBox "用户终止了代码运行。", vbExclamation
End If
End Sub
第 5 行代码设置了错误捕捉陷阱。
第 6 行代码设置 EnableCancelKey 属性的值为 xIErrorHandler
,将取消键作为错误代码发送给运行程序,在程序运行的过程中捕获到取消键时将产生一个错误代码为 18
的错误。
第 7 行代码显示第 4 行设置消息框,提示用户终止代码需要的按键操作。
如果用户在代码运行的过程中按下了取消键,即捕捉到的错误代码为 18
,那么第 13 到 16行代码则显示“用户终止了代码运行”的对话框。