VBA - Application.EnableCancelKey表现得有些奇怪

时间:2016-07-28 11:38:17

标签: vba excel-vba excel

相当多的问题是以下 - 为什么在即时窗口中我得到了这个:

Application.EnableCancelKey = 2
?Application.EnableCancelKey
1

最后一行应该是2还是我错过了什么? 谢谢!

1 个答案:

答案 0 :(得分:1)

修改

基础是枚举xlErrorHandler声明“中断作为错误被发送到正在运行的过程,可以通过使用On Error GoTo语句设置的错误处理程序来捕获。”,您需要一个错误处理程序使用该枚举(xlErrorHandler2)。

Since some statements are not possible within the immediate windowOn Error GoTo是这些语句之一,您不能在即时窗口中拥有错误处理程序,从而将EnableCancelKey的值更改为2。因此Excel会自动将其切换为1,当您要求它显示值时,会为您提供值1

唯一的解决方案是使用子。

原始回复:

好的,我使用了documentation provided on the MSDN中的代码并编辑了一些内容,使用以下代码对其进行测试。

为了解释一下,我只需按一次“ESC”按钮就停止执行,从而阻止文本框退出。您可以在立即窗口中观看最后一个EnableCancelKey的值正常变化。

Sub Test1()

Debug.Print " Before execution result : " & Application.EnableCancelKey

On Error GoTo handleCancel
Application.EnableCancelKey = 2 'xlErrorHandler
Debug.Print " Regular execution result : " & Application.EnableCancelKey

For x = 1 To 10000  ' Do something 1,000,000 times (long!)
    Debug.Print "Test"
Next x

handleCancel:
If Err = 18 Then
    Debug.Print "Aborted macro result : " & Application.EnableCancelKey
    MsgBox "You cancelled"
End If

End Sub

希望这会有所帮助,我得到了预期的结果。

你必须写一个Error Handler来获得2值,否则代码无法捕获错误,这就是你每次执行宏时得到1的原因。

由于枚举xlErrorHandler的描述声明“中断作为错误发送到正在运行的过程,可以通过使用On Error GoTo语句设置的错误处理程序来捕获。”,您需要一个错误处理程序使用那个枚举。

有了它,它应该有效:

Sub test2()

On Error GoTo theEnd
Application.EnableCancelKey = 2
Debug.Print Application.EnableCancelKey

theEnd:
End Sub