2016-07-28 42 views
1

差不多的問題如下 - 爲什麼在即時窗口,我得到這個:VBA - Application.EnableCancelKey是作用在某種程度上奇怪

Application.EnableCancelKey = 2 
?Application.EnableCancelKey 
1 

最後一行應該是2還是我失去了一些東西? 謝謝!

+0

我不是100%肯定這一點,但我認爲這只是表明你的現行程序被中斷。 –

+0

當我在第一行將其設置在2 - (xlErrorHandler)的立即窗口中時,爲什麼在第二行檢查時返回1 - (xlInterrupt)。 – Vityata

+1

也許我不清楚:我認爲(但不確定)它是否返回'1',因爲實際程序現在被中斷。它不會寫入您設置的值,而是寫入當前狀態的值。 「_ xlInterrupt 1: 當前程序中斷,用戶可以調試或結束程序。」 –

回答

1

編輯:

的基礎是枚舉xlErrorHandler指出,「中斷由設置與使用On Error GoTo語句錯誤處理程序發送到正在運行的過程作爲一個錯誤,可捕獲」您需要一個錯誤處理程序才能使用該枚舉(xlErrorHandler2)。

Since some statements are not possible within the immediate window,並On 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。

由於enum xlErrorHandler的說明指出「中斷作爲錯誤發送到正在運行的過程,可通過使用On Error GoTo語句設置的錯誤處理程序進行捕獲」,您需要一個錯誤處理程序來使用該錯誤處理程序枚舉。

有了這個它應該工作:

Sub test2() 

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

theEnd: 
End Sub 
+0

呃,究竟結果如何? 2和1? –

+0

是的,很酷,但爲什麼它沒有在眼前的窗口中改變? – Vityata

+0

當我輸入'xlDisabled'時,結果爲'0',並且我無法停止宏運行,當提供'xlInterrupt'時,我得到'1',宏停在確切的位置,我停下來,當'xlErrorHandler'爲提供了我得到'2'和消息「你取消了」。順便提一下,所有這些結果都在「立即」窗口中。 –

相關問題