Hallo, Georg!
Ich möchte eine Abfrage nach Excel exportieren mittels
DoCmd.OutputTo acQuery,… usw.
Bricht man das Speichern ab, kommt eine Fehlermeldung.
Die wollte ich mittels On Error GoTo err abfangen. Und err:
msgbox „Aktion wurde abgebrochen“, abfangen.
nun erscheint diese Meldung auch wenn die Abfrage korrekt
gespeichert wird.
Ich bin immer noch auf der komischen Meinung, dass JEDE noch so billige Prozedur und Funktion eine Fehlerbehandlung aufweisen sollte, selbst wenn sie semantisch keinen Fehler produzieren kann. Irgendwas kann immer passieren, und wenn es komische Einflüsse von außerhalb sind. (Außer, man weiß genau, was man tut, und man fängt den Fehler irgendwo anders, meist bei der aufrufenden Prozedur ab. Aber hast Du eine Ahnung, wie schön es ist, den Fehler zu suchen, wenn ungefähr hundert Prozeduren ohne Fehlerbehandlung sequentiell sich selbst aufrufen, in der untersten ein Fehler auftritt und in der obersten erst der Fehler abgefangen wird?).
Außerdem habe ich seinerzeit von meinem Pauker eingetrichtert bekommen, dass GOTO (außer bei On Error Goto…) und EXITs schlechter Programmierstil und Zeichen mangelnder Gedanken über das gewünschte Verhalten sind. Jedes Exit und Goto lässt sich mit einer einfachen If-Anweisung genau so abbilden.
Genug der theoretischen Ergüsse: Hier ein Sniplet, welches Du einfach in jede Prozedur einfügen kannst, bevor es losgeht mit dem Programmieren:
'===============================================================================
' Beschreibung: (der Prozedur)
' Angelegt: 17.09.2004 / (Angelegt durch)
' Änderung: 17.09.2004 / (Geändert durch, Änderungshistorie)
'===============================================================================
On Error Goto Err\_test
Err\_test:
select case err
case 0
case else
msgbox "Fehlercode:"&chr$(9)&err &chr$(13) \_
&"Fehler:"&chr$(9)&chr$(9)&error$ &chr$(13) \_
&"Modul:"&chr$(9)&chr$(9)&me.name &chr$(13) \_
&"Funktion:"&chr$(9)&chr$(9)&"test", \_
vbinformation,
resume Err\_test
end select
Wie schon vorher richtig beschrieben, läuft in Deinem Code der Err-Part auch noch durch. Das umgehst Du entweder mit dem Igitt-Exit oder über obiges Konstrukt.
Die Case-Anweisung ist übrigens dazu gedacht, bestimmte vorhersehbare Fehler aufzufangen und zu behandeln. Der Case-Else-Teil stellt die Notlösung dar, welches das Programm ab Absturz hindert, aber den Entwickler Rückschlüsse auf den Fehlerort gibt, den es zu beheben gilt.
Willst Du beispielsweise aus einer Excel-Zelle den Text einer String-Variablen zuweisen, dort steht aber eine Formel mit Fehler (z. B. #DIV0!) drin, was für Dein Programm aber nichts anderes heißt wie „Nimm einen leeren Text an“, dann baust Du in die Case-Anweisung ein zusätzliches
case
strText = "" ' Default-Wert übernehmen
Resume Next ' und weiter, als wär nichts gewesen
case ...
ein.
Gruß, Manfred