2010-10-12 62 views
16

和往常一樣,我使用On Error Goto語句創建一個錯誤處理程序,在那裏我放了幾行清理代碼並顯示錯誤消息,但現在我不想失去默認處理程序的舒適性,這也指向我確切發生錯誤的地方。我怎樣才能做到這一點?VBA:如何顯示錯誤消息,就像標準錯誤消息有一個「調試」按鈕?

在此先感謝。

+0

只是爲了保持適當的鏈接...這個問題繼續在這裏:http://stackoverflow.com/questions/3929997/vba-how-to-make-the-current-cursor-in-vbe-jump-to-the-line-where- the-last-error/3930626#3930626 – 2010-10-16 00:27:33

回答

37

首先是好消息。此代碼你想要做什麼(請注意 「行號」)

Sub a() 
10: On Error GoTo ErrorHandler 
20: DivisionByZero = 1/0 
30: Exit Sub 
ErrorHandler: 
41: If Err.Number <> 0 Then 
42: Msg = "Error # " & Str(Err.Number) & " was generated by " _ 
     & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description 
43: MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext 
44: End If 
50: Resume Next 
60: End Sub 

當它運行時,預期的MSGBOX顯示:

alt text

而現在的壞消息:
行號是舊版Basic的殘餘。編程環境通常負責插入和更新它們。在VBA和其他「現代」版本中,此功能會丟失。

然而,Here也有對「自動」添加行號,爲您節省打字輸入的繁瑣的任務數的替代品......但所有這些似乎或多或少累贅......或商業。

HTH!

+0

MZTools可以添加/刪除行號及其免費 – 2010-10-12 14:56:52

+0

@Charles是。這是我引用的頁面中的參考之一。 TNX! – 2010-10-12 14:58:31

+0

@belisarius,非常感謝代碼,寶貴的信息和有用的外部參考。只是好奇,是否有辦法讓讀者關注焦點,甚至突出顯示並進入調試模式?那真的是內部功能嗎? – Vantomex 2010-10-13 02:33:32

1

有一種更簡單的方法,只需在錯誤處理程序中禁用錯誤​​處理程序,如果它與您正在執行和恢復的錯誤類型不匹配。

下面的處理程序會再次檢查每個錯誤類型,如果沒有匹配,它會將錯誤恢復恢復到正常的VBA,即GoTo 0並恢復代碼,然後嘗試重新運行代碼並彈出正常錯誤塊。

On Error GoTo ErrorHandler 

x = 1/0 

ErrorHandler: 
if Err.Number = 13 then ' 13 is Type mismatch (only used as an example) 

'error handling code for this 

end if 

If err.Number = 1004 then ' 1004 is Too Large (only used as an example) 

'error handling code for this 

end if 

On Error GoTo 0 
Resume 
0

這個答案並沒有解決Debug按鈕(你必須設計一個形式和使用上的按鈕來完成類似方法在next question)。但它確實解決了這部分問題:

現在我不想失去默認處理程序的舒適性,這也會指向出現錯誤的確切行。

首先,我會假設你不希望這在生產代碼 - 你希望它無論是對調試或代碼,您親自將使用。我使用編譯器標誌來指示調試;那麼如果我正在對程序進行故障排除,則可以輕鬆找到導致問題的線路。

# Const IsDebug = True 

Sub ProcA() 
On Error Goto ErrorHandler 
' Main code of proc 

ExitHere: 
    On Error Resume Next 
    ' Close objects and stuff here 
    Exit Sub 

ErrorHandler: 
    MsgBox Err.Number & ": " & Err.Description, , ThisWorkbook.Name & ": ProcA" 
    #If IsDebug Then 
     Stop   ' Used for troubleshooting - Then press F8 to step thru code 
     Resume   ' Resume will take you to the line that errored out 
    #Else 
     Resume ExitHere ' Exit procedure during normal running 
    #End If 
End Sub 

注:如果在一個子過程中發生錯誤沒有錯誤處理例程的例外Resume是,那麼Resume將帶你到這個進程內調用該子過程有錯誤的路線。但是,您仍然可以使用F8,直到它再次出錯爲止。如果子程序的時間太長,甚至無法完成,那麼你的子程序可能應該有自己的錯誤處理程序。

有多種方法可以做到這一點。有時,對於較小的項目,我知道我會被通過它反正加緊排除故障時,我只是把這些行MsgBox語句之後:

Resume ExitHere   ' Normally exits during production 
    Resume     ' Never will get here 
Exit Sub 

它永遠不會得到Resume語句,除非你通過拖動下一個語句指針到該行,或者通過按下光標在該行上按下CtrlF9,將它設置爲要執行的下一行。

下面是一篇文章,詳細介紹這些概念:Five tips for handling errors in VBA。最後,如果您使用的是VBA,但尚未發現Chip Pearson的真棒網站,他有一個解釋Error Handling In VBA的頁面。

0

我,我只是想看到的錯誤在我的VBA應用程序,以便在功能我創建了下面的代碼..

功能Database_FileRpt 「-------------- ----------- On Error GoTo CleanFail '------------------------- ' 'Create_DailyReport_Action and code

CleanFail:

「*********

MSGBOX 「********」 _

& vbCrLf & 「Err.Number的:」 &的Err.Number _

& vbCrLf & 「Err.Description:」 & Err.Description _

& vbCrLf & 「Err.Source:」 & Err.Source _

& vbCrLf & 「********」 _

& vbCrLf & 「...退出VBA功能:Database_FileRpt」 _

& vbCrLf &「... Excel VBA程序重置」。 _

,「VBA錯誤異常提出!」


「注意,下一行就會錯誤對象重置爲0,變量 上述用於記的值 」,使得相同的錯誤可以被重新升高

Err.Clear

'*********

恢復CleanExit

CleanExit:

'清理代碼,如果有的話,去這裏。不管錯誤狀態如何運行。

退出功能 'SUB或功能

端功能' Database_FileRpt

結束

'------------------