Anzeige
Archiv - Navigation
1172to1176
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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
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
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
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige