Wie üblich erstelle ich einen Error-Handler mit der On Error Goto
-Anweisung. Dort füge ich ein paar Zeilen mit Reinigungscodes ein und zeige die Fehlermeldung an. Jetzt möchte ich jedoch nicht die Bequemlichkeit des Standard-Handlers verlieren, was mich auch auf die genaue Situation verweist Zeile, in der der Fehler aufgetreten ist. Wie kann ich das machen?
Danke im Voraus.
Zuerst die guten Nachrichten. Dieser Code macht was Sie wollen (bitte beachten Sie die "Zeilennummern")
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
Wenn es ausgeführt wird, wird die erwartete MsgBox angezeigt:
Und jetzt die schlechte Nachricht:
Zeilennummern sind ein Überbleibsel alter Versionen von Basic. Die Programmierumgebung übernahm normalerweise das Einfügen und Aktualisieren. In VBA und anderen "modernen" Versionen geht diese Funktionalität verloren.
Here Es gibt jedoch mehrere Alternativen für das "automatische" Hinzufügen von Zeilennummern, wodurch Sie sich die mühsame Eingabe des Schreibens ersparen ... aber alle scheinen mehr oder weniger umständlich ... oder kommerziell.
HTH!
Es gibt einen einfacheren Weg, einfach den Fehlerbehandler in Ihrem Fehlerbehandler zu deaktivieren, wenn er nicht den Fehlertypen entspricht, die Sie gerade ausführen und fortsetzen.
Der folgende Handler prüft jeden Fehlertyp erneut. Wenn keiner übereinstimmt, gibt er die Fehlerwiederherstellung an den normalen VBA zurück, dh GoTo 0 und setzt den Code fort, der dann versucht, den Code erneut auszuführen, und der normale Fehlerblock erscheint.
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
Этот ответ не касается кнопки "Отладка" (вам нужно создать форму и использовать кнопки для этого, чтобы сделать что-то похожее на метод в вашем следующий вопрос ). Zum Seitenanfang Zum Seitenanfang
теперь я не хочу терять удобство обработчика по умолчанию который также указывает на точную стгоет.
Во-первых, я предполагаю, что вы не хотите этого в производственном коде - вы хотите это либо для отладки, либо для кода, который вы лично будете использовать. Я использую флаг компилятора, чтобы указать отладку; Es wurde noch kein Kommentar zu diesem Artikel abgegeben.
# 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
перенесет вас в строку этого процесса, которая вызвала подпроцедуру с ошибкой. Im Moment ist der Artikel noch nicht veröffentlichtF8пока он снова не выдаст ошибку. Если подпроцедура слишком длинная, чтобы сделать ее даже такой утомительной, то ваша подпроцедура, вероятно, должна иметь свою собственную процедуру обработки ошибок.
Есть несколько способов сделать это. Иногда для небольших программ, где я знаю, что я все равно буду проходить через них при поиске и устранении неисправностей, я просто помещаю эти строки сразу после оператора MsgBox:
Resume ExitHere ' Normally exits during production
Resume ' Never will get here
Exit Sub
Он никогда не попадет в оператор Fortsetzen если вы не пройдете и не установите его в качестве следующей строки для выполнения, либо перетаскивая указатель следующего оператора на эту строку, либо нажавCtrlF9с курсором на этой строке.
Zum Anfang Ihr Feedback an uns Weitere Informationen: Zum Anfang Ihres Feedbacks an VBA . Наконец, если вы используете VBA и еще не обнаружили удивительный сайт Чипа Пирсона, у него есть страница, объясняющая Обработка ошибок в VBA .
Für mich wollte ich nur den Fehler in meiner VBA-Anwendung sehen, also habe ich in der Funktion den folgenden Code erstellt.
Function 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 & "...Exiting VBA Function: Database_FileRpt" _
& vbCrLf & "...Excel VBA Program Reset." _
, , "VBA Error Exception Raised!"
*************************************
' Note that the next line will reset the error object to 0, the variables
above are used to remember the values
' so that the same error can be re-raised
Err.Clear
' *************************************
Resume CleanExit
CleanExit:
'cleanup code , if any, goes here. runs regardless of error state.
Exit Function ' SUB or Function
End Function ' end of Database_FileRpt
' ------------------