跳到主要内容

捕获用户中断

默认情况下,在代码运行期间如果我们按下 Ctrl+Break 组合键或 Esc 键,将显示如下图所示的消息框:

代码执行被中断
代码执行被中断

例如,运行以下 InputValue 过程,由于整个过程非常耗时,我们可以按 EscCtrl+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 常量取值如下表所示:

XIEnableCancelKey 常量
XlEnableCancelKey 常量 描述
xlDisabled 0 完全禁用“取消”键捕获功能。
xlErrorHandler 2 将中断作为错误发送给运行程序,由 On Error GoTo 语句设置的错误处理程序捕获。可捕获的错误代码为 18
xlInterrupt 1 中断当前运行程序,用户可进行调试或结束程序的运行。

只要 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行代码则显示“用户终止了代码运行”的对话框。

评论

您的电子邮件地址不会显示出来。*号为必填项。