2016-04-23 93 views
1

我導致相信vba IDE不允許正確地打破錯誤。我問如何辨別這裏運行時錯誤問題:如何使用On Error GoTo?

How do I break on errors?

的解決方案/解決方法似乎是使用On Error GoTo ErrorHandler或相似。我正在努力完成這項工作,但沒有取得太大的成功。

根據微軟On Error GoTo將發送運行時錯誤時發送給區域的指定代碼(https://msdn.microsoft.com/en-us/library/5hsw66as.aspx)。根據我的經驗,這不是完整的故事。這個問題是關於如何實際解決這個問題。

所以我有以下功能:

Function generateTimeseries() As Variant 

On Error GoTo ErrorHandler 

Dim currentArray As Range 

currentArray = Selection.Range ' this doesn't work - I don't care why 

generateTimeseries = currentArray.Rows 

Return 

ErrorHandler: 
    Debug.Assert False 
    Resume ' break here if you want to catch errors 

End Function 

此功能將不會進入ErrorHandler代碼。相反,它落在Selection.Range上,功能只是返回#VALUE。我實際上並不關心爲什麼會出現這種情況,我只想知道如何讓IDE告訴我它實際上已經在該行上崩潰了,而沒有我手動跳過代碼。

+0

我的錯誤「此功能將不會進入的ErrorHandler代碼」:無法重現此。對我來說,它會輸入ErrorHandler代碼。兩個錯誤:1.由於'currentArray'是一個對象,它必須通過'Set'設置:'Set currentArray = Selection'。 2.「選擇」可能是一個「範圍」,但如果是這樣,其「範圍」方法需要參數。在這種情況下,「迴歸」會做什麼? –

+0

@AxelRichter我發現了這個問題。看到我發佈的答案。 – arman

回答

1

我只是測試和錯誤處理程序的工作原理,它正確地打破上

Debug.Assert False 

- >檢查調試器選項。

但是,這不是一種正確的方法來處理vBA中的錯誤,因爲如果您編譯您的應用程序並忘記調整此類錯誤處理程序,那麼當用戶在過程中遇到錯誤時,應用程序將陷入無限循環。

在大多數情況下,您必須拋出一個msgbox讓用戶知道發生了錯誤,並終止當前過程。唯一不適用的情況是當你做了一些可能觸發錯誤的事情,但你知道它並故意避開錯誤。這是一種罕見的情況。

我從來沒有使用Assert方法,這是我如何處理每道工序

Function generateTimeseries() As Variant 

    On Error GoTo ErrorHandler 

    Dim currentArray As Range 

    currentArray = Selection.Range ' this doesn't work - I don't care why 

    generateTimeseries = currentArray.Rows 

Exit_Function: 
     Exit Function 

ErrorHandler: 
     MsgBox Err.Description, vbCritical, "Error " & Err.Number 
     Resume Exit_Function ' breakpoint here if you want examine the code after error, otherwhise it terminates the function 
     Resume ' Once the code breaks on the above line, move to this instruction and F8 to return to the statement in error 

End Function 
+0

謝謝。這比我的要好得多。至於它沒有違反錯誤的原因。看到我的答案。我會將其標記爲答案。 – arman

0

我已經啓用了此功能以在先前的嘗試中打破所有錯誤「中斷所有錯誤」。

我通過去Tools->Options->General並用Break on Unhandled Errors代替Break on All Errors來解決這個問題。

事實證明,Break on All Errors是Windows的「中斷一些錯誤,但只是返回垃圾,如果它是一個UDF錯誤」。

+0

不,它意味着中斷所有錯誤,但從單元調用的UDF **中未處理的錯誤只會導致#VALUE錯誤,而不會將用戶引入VBE。 – Rory

+0

@羅瑞謝謝,我沒有意識到這一點。 – arman