VBA实战技巧07: 阻止用户按Ctrl+Break键中断代码运行

2020-05-04 21:18:25 浏览数 (1)

当运行中的代码长时间没有响应,或者代码陷入死循环时,可以按Ctrl Break键中断代码的执行(注:有些笔记本电脑的键盘上没有Break键,可以按Esc键)。此时,VBA会弹出如下图1所示的消息。

图1

然而,有时候我们不希望用户按Ctrl Break键中断正在运行中的代码,因为此时程序可能正在创建一些需要占用电脑资源才能生成的“东西”,所以才会看起来没有响应。如果我们中断代码的执行,那么可能已经生成的很多中间工作表、行和列仍然存在,并没有像程序预先设计的那样在退出前将其删除,这样会留下一个与我们之前完全不同的工作表,会让用户感到莫名其妙。

要阻止按Ctrl Break键中断代码的执行,可以在程序中添加下面的语句:

代码语言:javascript复制
Application.EnableCancelKey= xlErrorHandler

这个语句指示VBA不要显示“代码执行被中断”消息。实际上,这也为我们提供了一种利用用户按Ctrl Break键操作的方法。

可以为Application.EnableCancelKey属性设置3个值:xlDisabled、xlErrorHandler和xlInterrupt。如果将其设置为xlDisabled,则告诉VBA停止响应用户按下Ctrl Break键的操作。如果将其设置为xlInterrupt,则正常响应用户按下Ctrl Break键的操作。而xlErrorHandler则指示程序生成代码为18的错误,这样就可以使用错误处理来利用该错误。

下面是一个代码示例。循环执行5秒钟,如果在循环执行过程中,用户尝试中断代码,则会引发错误,从而执行错误处理语句。

代码语言:javascript复制
Sub code_test()    Dim t    On Error GoTo MyErrorHandler    t = Timer    Application.EnableCancelKey =xlErrorHandler       Do While Timer - t < 5    Loop   MyErrorHandler:    If Err.Number = 18 Then        MsgBox "按Ctrl Break键中止!!!"        Resume    Else        '其他代码    End IfEnd Sub

其实,在程序中可以有多个Application.EnableCancelKey语句。对于需要控制的部分,可以将其设置为xlErrorHandler,而对于其他部分,可以将其设置为xlInterrupt,来正常响应用户的操作。

代码语言:javascript复制
Sub code_test()    Dim t    On Error GoTo MyErrorHandler    t = Timer    Application.EnableCancelKey =xlErrorHandler       Do While Timer - t < 5    Loop       Application.EnableCancelKey = xlInterrupt       Do While Timer - t < 8    Loop   MyErrorHandler:    If Err.Number = 18 Then        MsgBox "按Ctrl Break键中止!!!"        Resume    Else        '其他代码    End IfEnd Sub

0 人点赞