和往常一樣,我使用On Error Goto
語句創建一個錯誤處理程序,在那裏我放了幾行清理代碼並顯示錯誤消息,但現在我不想失去默認處理程序的舒適性,這也指向我確切發生錯誤的地方。我怎樣才能做到這一點?VBA:如何顯示錯誤消息,就像標準錯誤消息有一個「調試」按鈕?
在此先感謝。
和往常一樣,我使用On Error Goto
語句創建一個錯誤處理程序,在那裏我放了幾行清理代碼並顯示錯誤消息,但現在我不想失去默認處理程序的舒適性,這也指向我確切發生錯誤的地方。我怎樣才能做到這一點?VBA:如何顯示錯誤消息,就像標準錯誤消息有一個「調試」按鈕?
在此先感謝。
首先是好消息。此代碼你想要做什麼(請注意 「行號」)
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顯示:
而現在的壞消息:
行號是舊版Basic的殘餘。編程環境通常負責插入和更新它們。在VBA和其他「現代」版本中,此功能會丟失。
然而,Here也有對「自動」添加行號,爲您節省打字輸入的繁瑣的任務數的替代品......但所有這些似乎或多或少累贅......或商業。
HTH!
MZTools可以添加/刪除行號及其免費 – 2010-10-12 14:56:52
@Charles是。這是我引用的頁面中的參考之一。 TNX! – 2010-10-12 14:58:31
@belisarius,非常感謝代碼,寶貴的信息和有用的外部參考。只是好奇,是否有辦法讓讀者關注焦點,甚至突出顯示並進入調試模式?那真的是內部功能嗎? – Vantomex 2010-10-13 02:33:32
有一種更簡單的方法,只需在錯誤處理程序中禁用錯誤處理程序,如果它與您正在執行和恢復的錯誤類型不匹配。
下面的處理程序會再次檢查每個錯誤類型,如果沒有匹配,它會將錯誤恢復恢復到正常的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
這個答案並沒有解決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的頁面。
我,我只是想看到的錯誤在我的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
結束'------------------
只是爲了保持適當的鏈接...這個問題繼續在這裏: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