wake-up-neo.net

VBA: Wie wird eine Fehlermeldung angezeigt, genau wie die Standardfehlermeldung, die über eine Schaltfläche "Debug" verfügt?

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.

21
Vantomex

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:

alt text

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!

41
Dr. belisarius

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
1
Paul Haines

Этот ответ не касается кнопки "Отладка" (вам нужно создать форму и использовать кнопки для этого, чтобы сделать что-то похожее на метод в вашем следующий вопрос ). 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 .

0
GlennFromIowa

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

' ------------------
0
Hank Freeman