当运行中的代码长时间没有响应,或者代码陷入死循环时,可以按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