Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Fragen zu OnError (Fehler abfangen)

Fragen zu OnError (Fehler abfangen)
SteffenS
Hallo Zusammen,
ich habe mit zum Abfangen der Fehler nun Folgenden Code gebaut der auch funktioniert.
Sub Test()

Sub NW_GW_PH_aus(Datei As String, Tabelle As String)
If ErrorOn_app = True Then On Error GoTo Err_Exit
Code...
Makro_1
'Fehlerbehandlung************************************************************************
Err_Exit:
If ErrorOn_app = True And err.Number Then ErrorHandler_APP err, "partnerhaendler", " _
NW_GW_PH_aus", Erl
End Sub
Folgende Fragenm habe zum Einbau:
- ich habe eine ganze Makros in denen andere Makros aufgerufen werden
Wo muss das Abfangen nun einbauen, damit es einwandfrei funktioniert.
-Benötige ich das Abfangen in jedem Makro oder reicht es wenn ich den Code in dem Makro einbaue welche das andere aufruft?
- Was sind Eure Erfahrungen bei so einem Vorgehen
Danke Euch schonmal
VG
Steffen Schmerler
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 12:42:43
JogyB
Hallo Steffen,
das kann man pauschal nicht beantworten.
Prinzipiell reicht ein ErrorHandler in der allerersten Prozedur, nur landest Du bei einem Fehler dann immer dort und kannst die Fehler nicht individuell abhandeln... wobei man natürlich eine globale Variable verwenden kann, die am Anfang jeder Prozedur gesetzt wird - dadurch weiß man dann wieder, wo der Fehler aufgetreten ist. Dennoch schränkt das die Fehlerbehandlungsmöglichkeiten etwas ein, da ein Resume oder Resume Next sich immer auf die Prozedur bezieht, in der die Fehlerbehandlung steht. Außerdem stehen Dir auch die Variablen aus der Unterprozedur nicht mehr zur Verfügung, wenn Du bspw. eine Arbeitsmappe geöffnet hast, die bei einem Fehler wieder geschlossen werden soll, dann kannst Du das in dem Fall nicht mehr machen, wenn der Dateiname erst im Programmverlauf festgelegt wurde (z.B. über GetOpenFilename).
Ich bevorzuge es daher, die Fehler in der Prozedur abzuhandeln, in der sie auftreten. Statt Subs benutze ich dann auch oftmals Funktionen des Typs Boolean, so dass die aufrufende Prozedur am Rückgabewert erkennen kann, ob alles geklappt hat oder nicht.
Was Du auch unbedingt beachten musst: Wenn Du mit On Errror GoTo zu einer Fehlerbehandlung springst, dann ist diese so lange aktiv, bis ein Exit Sub/Function, End (Sub/Function) oder Resume (Next) kommt. Das bedeutet, dass in dieser Prozedur kein weiterer Fehler behandelt werden kann. Taucht dann also in der Fehlerbehandlung selber noch ein Fehler auf, dann kommt die Fehlermeldung von Excel. Außer es ist in übergeordneten Prozeduren noch eine Fehlerbehandlung eingerichtet, dann springt es zur nächsthöheren.
Gruß, Jogy
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 13:41:57
Nepumuk
Hallo Jogy,
Prinzipiell reicht ein ErrorHandler in der allerersten Prozedur
Das ist nicht korrekt. Die Fehlerbehandlung muss in jeder Prozedur erfolgen. Fehler durchschleifen geht nur so:
Public Sub test1()
    1 Call test2
    2 If Err.Number <> 0 Then GoTo error_handler
    3 Exit Sub
    4 error_handler:
    5 MsgBox "Fehler " & CStr(Err.Number) & " in Zeile " & CStr(Erl) & vbLf & vbLf & _
        Err.Description, vbCritical Or vbMsgBoxHelpButton, _
        "Fehlermeldung", Err.HelpFile, Err.HelpContext
End Sub

Sub test2()
    1 Dim i As Integer
    2 On Error Resume Next
    3 i = "Anweisung, die Fehler produziert"
End Sub

In der Hauptprozedur muss also nicht unbedingt ein Errorhandler aktiv sein. Nur muss nach dem Aufruf der Unterroutine abgefragt werden ob diese einen Fehler zurück gibt.
@Steffen,
mach es gleich vernünftig und baue in jeder Routine mit Außnahme von Worksheet-Functions und Property-Prozeduren einen eigenständigen Errorhandler ein.
In Worksheetfunctions ist er unnötig, da der Fehler direkt als Fehlerwert in der Tabelle ausgegeben wird.
In Property-Prozeduren ist er unnötig, da hier der Fehler in der schreibenden / lesenden Zeile der Prozedur auftritt. Wenn du z.B. einer Eigenschaft die einen numerischen Wert erwartet einen String übergibst, dann tritt der Fehler in der Zuweisung und nicht in der Let-Prozedur auf.
Gruß
Nepumuk
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 18:29:03
JogyB
Hallo Nepumuk,
natürlich geht das, sogar über mehrere Aufrufe hinweg:
Sub start()
On Error GoTo errorhandler
Call test1
Exit Sub
errorhandler:
MsgBox ("Fehler")
Resume Next
End Sub
Private Sub test1()
Call test2
End Sub
Private Sub test2()
Debug.Print 1 / 0
MsgBox ("OK")
End Sub

Probier es einfach mal aus.
Gruß, Jogy
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 19:01:56
Nepumuk
Hallo Jogy,
schon, aber als Fehlerzeile wird die Zeile des Aufrufes zurückgegeben und das hilft mir nichts. Ich will ja wissen in welcher Zeile der Fehler tatsächlich statt fand.
Gruß
Nepumuk
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 20:01:51
JogyB
Hallo Nepumuk,
dass das nicht unbedingt die ideale Lösung ist, hatte ich ja auch schon geschrieben.
Aber durch Deinen Einwand habe ich jetzt zumindest die Funktion Erl kennengelernt, die kannte ich vorher auch noch nicht. Gibt es eigentlich irgendwo eine Zusammenstellung solcher undokumentierten Features?
Gruß, Jogy
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 20:20:21
Nepumuk
Hallo Jogy,
Rechtsklick in den Objektkatalog - verborgene Elemente anzeigen. Alles "undokumentierte" ist in grauer Schriftfarbe dargestellt. Erl findest du unter VBA.Information. Viel Spass beim durchblättern.
Zum Nummerieren der Zeilen kannst du hier ein Addin von mir runterladen: http://www.office-loesung.de/ftopic139970_0_0_asc.php
Sind aber zwei Fehler drin.
1. Ein Zeilenumbruch in der Select - Anweisung (Select - Case) führt zu einem Fehler in der 1. Case Anweisung, da diese keine Zeilennummer haben darf.
2. Bedingte Formatierung (#If / #Else / #End If) wird nicht beachtet. Auch in diesen Zeilen darf keine Zeilennummer stehen.
Den zweiten Fehler habe ich in meinem privaten Addin behoben. Für den ersten hatte ich noch keinen Bedarf.
Gruß
Nepumuk
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 21:20:14
Daniel
Das geht am einfachsten, wenn man komplett OHNE Fehlerbehandlung arbeitet.
dann stoppt VBA genau an der Stelle wo der Fehler auftritt, markiert die Zeile mit einem gelben Pfeil und man kann die entsprechenden Variablen, Zellinhalte abfragen, oder sogar den Makrocode direkt ändern, um dann das Makro korrigiert weiter laufen zu lassen.
Gruß, Daniel
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 21:43:00
Nepumuk
Hallo Daniel,
unsere Kunden haben aber keine Ahnung von VBA. Können als weder mit den Programmbefehlen noch mit den Variableninhalten etwas anfangen. Sao Paulo, Sydney oder Montreal sind nicht einfach eine Tür nebenan. Auch telefonische Hilfe ist aufgrund der anfallenden Kosten, der Zeitunterschiede und meiner mangelhaften spanisch, portugiesisch, russisch ...... Kenntnissen nicht möglich. Ich benötige also ein Error-Log welches mir automatisch zugesandt wird.
Gruß
Nepumuk
Anzeige
AW: Fragen zu OnError (Fehler abfangen)
04.09.2010 22:54:44
Daniel
Hi
ob in diesem Fall Excel die richtige Entwicklungplattform ist, wage ich mal zu bezweifeln.
Programmierung mit Excel-VBA ist doch eher ne "Hausfrauenlösung", aber keine professionelles Vorgehen.
Gruß, Daniel
AW: Fragen zu OnError (Fehler abfangen)
05.09.2010 00:01:40
JogyB
Hallo Daniel,
es ist natürlich absolut unprofessionell, den Funktionsumfang und die Möglichkeiten von Excel durch VBA zu erweitern...
Und dass Du von einer Hausfrauenlösung sprichst, zeigt nur wie wenig Ahnung Du von VBA hast. Wobei das eigentlich schon nach Deinen Aussagen zur Fehlerbehandlung klar war.
Gruß, Jogy
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Fehler abfangen in Excel VBA: So gelingt es dir


Schritt-für-Schritt-Anleitung

Um Fehler in Excel VBA effektiv abzufangen, kannst du die folgende Schritt-für-Schritt-Anleitung nutzen:

  1. ErrorHandler einrichten: Beginne in deiner Subroutine mit On Error GoTo Error_Handler, um einen Fehlerhandler zu definieren.

    Sub Beispiel()
       On Error GoTo Error_Handler
       ' Dein Code hier
       Exit Sub
    
    Error_Handler:
       MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
       Resume Next
    End Sub
  2. Fehlerbehandlung implementieren: In der Fehlerbehandlungsroutine kannst du spezifische Aktionen definieren, wie z.B. das Protokollieren von Fehlern oder das Anzeigen von Fehlermeldungen.

  3. Fehlernummer abfragen: Verwende If Err.Number <> 0 um zu überprüfen, ob ein Fehler aufgetreten ist und handle entsprechend.

  4. Variablen zurücksetzen: Achte darauf, dass Variablen, die in der Fehlerbehandlung genutzt werden, korrekt verwaltet werden, um unerwartete Ergebnisse zu vermeiden.


Häufige Fehler und Lösungen

  • Fehler wird nicht abgefangen: Stelle sicher, dass On Error GoTo korrekt platziert ist und dass du den Fehlerhandler am Ende deiner Prozedur aufrufst.

  • Unklare Fehlermeldungen: Nutze MsgBox Err.Description um detaillierte Informationen über den Fehler anzuzeigen.

  • Fehler durch fehlende Variablen: Achte darauf, dass alle verwendeten Variablen deklariert und initialisiert sind, um Laufzeitfehler zu vermeiden.


Alternative Methoden

Eine weitere Methode zur Fehlerbehandlung ist die Verwendung von On Error Resume Next. Dies ignoriert Fehler und lässt das Programm weiterlaufen. Beachte jedoch, dass dies auch zu unvorhersehbaren Ergebnissen führen kann, da du möglicherweise nicht erkennst, dass ein Fehler aufgetreten ist.

Sub BeispielMitResumeNext()
    On Error Resume Next
    ' Ein fehlerhafter Code
    Dim x As Integer
    x = 1 / 0 ' Dies führt zu einem Fehler, wird aber ignoriert.
    On Error GoTo 0 ' Fehlerbehandlung deaktivieren
End Sub

Praktische Beispiele

Hier sind einige praktische Beispiele, die dir helfen, die Fehlerbehandlung in Excel VBA besser zu verstehen:

  • Einfache Fehlermeldung:
Sub DivideNumbers()
    On Error GoTo Error_Handler
    Dim result As Double
    result = 10 / 0 ' Dies führt zu einem Fehler
    Exit Sub

Error_Handler:
    MsgBox "Fehler: Division durch Null"
End Sub
  • Fehlernummer und Erl:
Sub FehlerMitErl()
    On Error GoTo Error_Handler
    Dim a As Integer
    a = 1 / 0 ' Fehler
    Exit Sub

Error_Handler:
    MsgBox "Fehler " & Err.Number & " in Zeile " & Erl
End Sub

Tipps für Profis

  • Verwende Erl: Nutze die Erl-Funktion, um die Zeilennummer des Fehlers zu ermitteln. Dies hilft bei der Fehlersuche.

  • Globale Fehlerbehandlung: Überlege, ob du eine globale Fehlerbehandlung für komplexe Projekte einrichten möchtest, um das Debugging zu vereinfachen.

  • Dokumentiere deine Fehlerbehandlungen: Halte fest, wo und warum Fehler auftreten, um die Wartung und zukünftige Fehlerbehebungen zu erleichtern.


FAQ: Häufige Fragen

1. Muss ich in jedem Sub ein ErrorHandler haben?
Ja, es ist empfohlen, in jeder Subroutine einen eigenen Fehlerhandler zu implementieren, um spezifische Fehler besser abzufangen und zu behandeln.

2. Was ist der Unterschied zwischen On Error GoTo und On Error Resume Next?
On Error GoTo leitet den Code zu einem definierten Fehlerhandler weiter, während On Error Resume Next den Fehler ignoriert und das Programm fortsetzt.

3. Wie kann ich die genaue Fehlerzeile ermitteln?
Verwende die Erl-Funktion in Kombination mit deinem Fehlerhandler, um die genaue Zeilennummer des Fehlers anzuzeigen.

4. Wie funktioniert die Err.Number-Funktion?
Err.Number gibt die Fehlernummer zurück, die aufgetreten ist. Du kannst diese nutzen, um spezifische Fehlerbehandlungen durchzuführen, z.B. mit If Err.Number = 0 Then.

5. Was ist vba fehlerbehandlung?
vba fehlerbehandlung ist ein Konzept zur Behandlung von Laufzeitfehlern in VBA, damit dein Programm robust und benutzerfreundlich bleibt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige