Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Fehlerbehandlung in VBA / Access
zurück: Reposition - Requery mit Positionierung auf alten Datensatz weiter: Datenexport aus Access in eine Excel-Vorlage Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
faßnacht(IT);
www.Office-Loesung.de Administrator


Verfasst am:
25. Jun 2004, 11:54
Rufname: Peter

Fehlerbehandlung in VBA / Access - Fehlerbehandlung in VBA / Access

Nach oben
       

Hallo Smile
Dies soll eine Sammlung von Möglichkeiten der Fehlerbehandlung werden.
Stellt fragen zu diesem Thema bitte unter Fragen zur Fehlerbehandlung
mit Hinweis auf diesen Beitrag.
Erfahrene Anwender können Ihre Tipps hier direkt geben.

Etwas trage ich gleich mal bei:


Zuletzt bearbeitet von faßnacht(IT); am 16. Dez 2005, 18:34, insgesamt 3-mal bearbeitet
faßnacht(IT);
www.Office-Loesung.de Administrator


Verfasst am:
25. Jun 2004, 11:55
Rufname: Peter


Fehlerbehandlung mit "On Error Goto" - Fehlerbehandlung mit "On Error Goto"

Nach oben
       

Wozu Fehlerbehandlung?
Eine Fehlermeldung sieht nicht besonders schön aus und gibt dem Benutzer meist die Möglichkeit den VBA-Code aufzurufen und dort eine Menge Schaden anzurichten. Ausserdem ist es eleganter mit einer eigenen Meldung eine Nachfrage für eine fehlende Angabe zu geben, statt das Programm "abstürzen" zu lassen. Es ist garnicht so schwierig das zu erreichen:

Aller Anfang ist leicht
In einer Prozedur erfolgen zunächst die Variablendeklarationen. Wenn diese kompiliert werden können, tritt da auch kein weiterer Fehler auf. Darum beginnt die Fehlerbehandlung in der Regel nach der Variablendeklaration mit der Zeile:
Code:
On Error Goto Err_Handler
Die Bedeutung dieser zeile ist ein Sprung zur Marke "Err_Handler:". An dieser Marke folgen die Befehle, die im Fehlerfall ausgeführt werden sollen. Der Name der Marke ist frei wählbar, in etwa nach den Regeln für Variablen-Namen.
Wenn man schonmal damit angefangen hat sollte die Fehlerbehandlung für den gesamten Code der Prozedur gelten. Man kann die Fehlerbehandlung aber wieder beenden, mit:
Code:
    On Error Goto 0


Die Sprungmarken
Wie wir geshen haben brauchen wir eine Sprungmarke, an welcher der Fehler behandelt wird. Damit dieser Code nicht ausgführt wird, falls die Funktion fehlerfrei abläuft, sollte die Prozedur unmittelbar vorher abgebrochen werden, mit einem
Code:
    Exit Sub bzw. Exit Function
Viele Prozeduren räumen unmittelbar vor Ende mit einigen reservierten Objekt-Variablen auf, um den Speicherplatz freizugeben. Das sollte zwar mit dem Ende der Prozedur von alleine laufen, jedoch hat sich herausgestellt, dass man das in Access besser nochmal zu Fuß. Damit dies auch im Fehlerfall ausgeführt wird, setzen wir vor die "Aufräumzeilen" eine weitere Sprungmarke, zB. "End_Handler:". Zu dieser Marke verzweigen wir möglicherweise nach einer Fehlerbehandlung. das sieht dann so aus:
Code:
    '... viele Befehle in der Prozedur
    'Ab hier wird nur noch aufgeräumt:
End_Handler:
    Set rsRecordSet = Nothing
    Set dbDatenbank = Nothing 'usw.
    Exit Sub ' Hier wird die Prozedur verlassen, wenn kein Fehler Auftrat
Err_Handler: ' Hier kommt man raus, wenn ein fehler auftritt
    'nun folgt die Fehlerbehandlung....
Im Bereich zwischen beiden Sprungmarken sollte man sehr sorgfältig arbeiten und nur stabile Befehle verwenden, nicht etwa Dateizugriffe (denn die sind ja sehr fehleranfällig) oder so. Denn dieser bereicch soll ja auch nach einer Fehlerbehandlung ausgeführt werden und darf darum keine Fehler produzieren.

Fallunterscheidung
Die Fehlerbehandlung macht man am besten mit einer Fallunterscheidung
Code:
    Select Case Err.Number
Die Eigenschaft Number des Err-Objektes ist normalerweise gleich 0, aber nach dem auftreten eines Fehlers immer ungleich 0.
Nun kann man bestimmte Fehler voraussehen. Zum Beispiel kann bei einem Dateizugriff die Datei fehlen, weil ein Benutzer sie umbenannt hat. Da ist es ja schöner dem Benutzer einen Hinweis zu geben, als das Programm abstürzen zu lassen. Nun provoziert man den Fehler, in unserem Beispiel heisst das:
Wir greifen auf eine Datei zu, die nicht existiert, dadurch tritt ein Fehler ein und wir notieren die Nummer. Für diese Nummer richten wir einen eigenen Case ein, und damit eine eigene Fehlerbehandlung.
So kann man auch für verschiedenen andere Fälle fortfahren. Da wir aber nie an alle möglichen Fehler denken, nutzen wir den Fall "Case Else", um alle anderen fehler zu behandeln. im Code sieht das dann so aus:
Code:
Err_Handler:
    Select Case Err.Number
      Case 78 'dateifehler
        MsgBox "Bitte stellen Sie sicher, dass die Datei existiert !"
        'Der Benutzer kann die Datei umbenennen und dann OK klicken
        Resume 'das wiederholt die Zeile, in der der Fehler auftrat
      Case Else
        MsgBox "Ein unerwarteter Fehler ist aufgetreten, Fehler: " & _
               Err.Number & vbNewLine & Err.Description, _
               vbCritical, "Fehler in Funktion xxx"
        Resume End_Handler 'Fährt beim End_Handler mit der Ausführung fort.
    End Select
Es ist wichtig mit "Resume" zu entscheiden wo, die Ausführung fortfahren soll:
Resume End_Handler - bei der entsprechenden Sprungmarke
Resume - mit der Zeile, die den Fehler auslöste
Resume Next - mit der Zeile, die auf die fehlerhafte Zeile folgt.

Zusammenfassung
Code:
Sub Beispiel()
On Error GoTo Err_Handler
    Dim iTest As Integer
    Dim rsRecordSet As Recordset
   
    '... viele Befehle in der Prozedur
    '...
    '...
   
End_Handler: ' Ab hier wird nur noch aufgeräumt:
    Set rsRecordSet = Nothing 'usw.
    Exit Sub ' Hier wird die Prozedur verlassen, wenn kein Fehler Auftrat
Err_Handler: ' Hier kommt man raus, wenn ein fehler auftritt
    'nun folgt die Fehlerbehandlung...
    Select Case Err.Number
      Case 78 'dateifehler
        MsgBox "Bitte stellen Sie sicher, dass die Datei existiert !"
        'Der Benutzer kann die Datei umbenennen und dann OK klicken
        Resume 'das wiederholt die Zeile, in der der Fehler auftrat
      Case Else
        MsgBox " Ein unerwarteter Fehler ist aufgetreten, Fehler: " & _
               Err.Number & vbNewLine & Err.Description, vbCritical, _
               "Fehler in Funktion xxx"
        Resume End_Handler 'Fährt beim End_Handler mit der Ausführung fort.
    End Select
End Sub


Zuletzt bearbeitet von faßnacht(IT); am 25. Okt 2005, 09:19, insgesamt 3-mal bearbeitet
faßnacht(IT);
www.Office-Loesung.de Administrator


Verfasst am:
25. Jun 2004, 12:02
Rufname: Peter

Fehlerbehandlung in Formularen und Berichten - Fehlerbehandlung in Formularen und Berichten

Nach oben
       

In Formularen kann man das Ereignis "Bei Fehler" zu nutzen. Dazu zeigt man die Eigenschaften des Formulars an, wählt die Karteikarte "Ereignis" und stellt im Ereignis "Bei Fehler" den Wert "[Ereignisprozedur]" ein. Dann klickt man rechts neben dem Eigenschaftenfeld auf die Schaltfläche [...]. So erreicht man den VBA-Editor und die Ereignisprozedur ist bereits angelgt.
Dort gibt es die Parameter
DataErr - enspricht dem Objekt Err.Number und
Response - hier kannst Du einstellen, ob der fehler gemeldet werden soll oder nicht.
Ein Beispiel sieht so aus:
Code:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
    Const cDatenGelöscht = 1234 'Die Fehlernummer
                                '(solltest Du dir beim auftreten merken)
    Dim strMldg As String

    Select Case DataErr
      Case cDatenGelöscht
        Response = acDataErrContinue 'Keine Fehlermeldung geben
        'Irgendwas machen, zB. das Formular Schließen
        DoCmd.Close acForm, Me.Name
        'Oder eine Meldung bringen
        MsgBox "Diesen fehler haben wir selbst aufgefangen, FehlerNr: " & DataErr
      Case Else
        Response = AcDataErrDisplay  'Fehler melden
    End Select
End Sub

_________________
na, hilft das weiter?
ciao Smile
Peter Faßnacht
faßnacht(IT);
www.Office-Loesung.de Administrator


Verfasst am:
09. Dez 2005, 00:56
Rufname: Peter

Errors-Objekt - Behandlung mehrerer Fehler (ADO) - Errors-Objekt - Behandlung mehrerer Fehler (ADO)

Nach oben
       

Hallo Smile

Hier kommt ein wichtiger Hinweis, den ich allerdings noch nicht gründlich ausprobiert habe. darum sind wir wohl alle dankbar für Ergänzungen.

Fehler treten nicht immer einzeln auf. Besonders bei ODBC-Zugriffen ist es möglich, dass mehrere Fehler auftreten. Um alle aufzufangen bracuhen wir das Objekt Errors. das ist eine Auflistung die alle Fehler enthält. Beispiel aus der Access-Hilfe:
Code:
Private Function DeleteCustomer(ByVal CompanyName As String) As Long
On Error GoTo DeleteCustomerError
   
    rst.Find "CompanyName='" & CompanyName & "'"
   
DeleteCustomerError:
    Dim objError As ADODB.Error
    Dim strError As String

    If cnn.Errors.Count > 0 Then
        For Each objError In cnn.Errors
            strError = strError & "Error #" & objError.Number & _
                       " " & objError.Description & vbCrLf & _
                       "NativeError: " & objError.NativeError & vbCrLf & _
                       "SQLState: " & objError.SQLState & vbCrLf & _
                       "Reported by: " & objError.Source & vbCrLf & _
                       "Help file: " & objError.HelpFile & vbCrLf & _
                       "Help Context ID: " & objError.HelpContext
        Next objError
        MsgBox strError
    End If
End Function
faßnacht(IT);
www.Office-Loesung.de Administrator


Verfasst am:
09. Dez 2005, 01:02
Rufname: Peter

Errors-Objekt - Behandlung mehrerer Fehler (DAO) - Errors-Objekt - Behandlung mehrerer Fehler (DAO)

Nach oben
       

Hallo Smile

Hier das Beispiel für die DAO. Was passiert eigentlich, wenn man DAO und ADO verwendet ?
Wahrscheinlich sollte man dann beide Errors-Objekte prüfen.
Code:
Public Sub DAOFehlerÜberprüfen()
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    ' Objektvariable vom Typ Error für Durchlauf der
    ' Errors-Auflistung deklarieren.
    Dim errX As DAO.Error
   
    ' Fehler ignorieren.
    On Error Resume Next
    ' Fehler im Err-Objekt löschen.
    Err.Clear
    ' Errors-Auflistung aktualisieren.
    Errors.Refresh
    ' Bezug auf aktuelle Datenbank zurückgeben.
    Set dbs = CurrentDb
    ' Versuch, Recordset-Objekt einer nicht bestehenden
    ' Tabelle zu öffnen.
    Set rst = dbs.OpenRecordset("tblDieTabelleGibtEsNicht")
    Debug.Print "DAO-Objekt Error:"
    ' Anzahl der Fehler in Errors-Auflistung ausgeben.
    Debug.Print ">>>Anzahl Fehler: "; Errors.Count
    ' Errors-Auflistung und wichtige Eigenschaften
    ' durchlaufen.
    For Each errX In DBEngine.Errors
        Debug.Print "Description: " & errX.Description
        Debug.Print "Source:      " & errX.Source
        Debug.Print "Number:      " & errX.Number
    Next errX
    Debug.Print
    Debug.Print "VBA-Objekt Err:"
    ' Entsprechende Eigenschaften des Err-Objekts
    ' anzeigen.
    Debug.Print "Description: " & Err.Description
    Debug.Print "Source:      " & Err.Source
    Debug.Print "Number:      " & Err.Number
    Set rst = Nothing
    Set dbs = Nothing
End Sub
Willi Wipp
Moderator


Verfasst am:
09. Dez 2005, 11:45
Rufname:
Wohnort: Raum Wiesbaden

Re: Errors-Objekt - Behandlung mehrerer Fehler (ADO) - Re: Errors-Objekt - Behandlung mehrerer Fehler (ADO)

Nach oben
       

Hi faßnacht(IT);,

habe mir erlaubt die ADO-Prozedur der DAO-Prozedur anzugleichen.
Code:
Public Sub ADOFehlerÜberprüfen()
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    ' Objektvariable vom Typ Error für Durchlauf der
    ' Errors-Auflistung deklarieren.
    Dim errX As ADODB.Error
   
    ' Fehler ignorieren.
    On Error Resume Next
    ' Fehler im Err-Objekt löschen.
    Err.Clear
    ' Errors-Auflistung aktualisieren.
    Errors.Refresh
    ' Bezug auf aktuelle Datenbank (Verbindung) zurückgeben.
    Set cnn = CurrentProject.Connection
    ' Versuch, Recordset-Objekt einer nicht bestehenden
    ' Tabelle zu öffnen.
    Set rst = New ADODB.Recordset
    rst.Open "SELECT * FROM tblDieTabelleGibtEsNicht", cnn
    Debug.Print "ADO-Objekt Error:"
    ' Anzahl der Fehler in Errors-Auflistung ausgeben.
    Debug.Print ">>>Anzahl Fehler: "; Errors.Count
    ' Errors-Auflistung und wichtige Eigenschaften
    ' durchlaufen.
    For Each errX In cnn.Errors
        Debug.Print "Description: " & errX.Description
        Debug.Print "Source:      " & errX.Source
        Debug.Print "Number:      " & errX.Number
        Debug.Print "NativeError: " & errX.NativeError
        Debug.Print "SQLState:    " & errX.SQLState
        Debug.Print "HelpFile:    " & errX.HelpFile
        Debug.Print "HelpContext: " & errX.HelpContext
    Next errX
    Debug.Print
    Debug.Print "VBA-Objekt Err:"
    ' Entsprechende Eigenschaften des Err-Objekts
    ' anzeigen.
    Debug.Print "Description: " & Err.Description
    Debug.Print "Source:      " & Err.Source
    Debug.Print "Number:      " & Err.Number
    Set rst = Nothing
    Set cnn = Nothing
End Sub

Und hier noch ein schoener Link von MiLie: Laufzeitfehler in MS Access und Ihre Bedeutung

_________________
Eine kurze Rueckmeldung waere nett
SL Willi Wipp

(Anleitung fuer das Anhaengen von Dateien: Klicke links auf [www], Gaeste muessen sich dafuer anmelden)
tho7
Access Programmierer (Einsteiger)


Verfasst am:
31. Jul 2012, 01:19
Rufname: Thorsten

AW: Fehlerbehandlung in VBA / Access - AW: Fehlerbehandlung in VBA / Access

Nach oben
       

Ich habe einen sehr pragmatischen Ansatz der Fehlerbehandlung (der stammt von Andreas Stern, dessen Buch mir ein sehr guter Einstieg in Access war).

Da das Abfangen von Fehlern für die Entwicklung nicht gewünscht ist (debuggen), kann die Fehlerbehandlung in einem Modul ein- und ausgeschaltet werden.
Code:
Private Sub Beispiel()
If DatenbankFertig Then On Error GoTo Fehlerbehandlung

    '...code...
    Exit Sub
Fehlerbehandlung:
    Fehlerbeschreibung
End Sub
Manchmal ist es jedoch notwendig, bestimmte Fehler explizit abzufangen, mit einer Mitteilung an AnwenderInnen, warum der Fehler aufgetreten ist oder schlicht, um den Fehler zu übergehen. Dann modifiziere ich die Fehlerbehandlung:
Code:
Fehlerbehandlung:
    Select Case Err.Number
      Case 2501 ' Senden der E-Mail wurde abgebrochen
        Resume Next 'fortfahren mit nächster Zeile
      Case 3022 ' Schlüsselverletzung
        Me.Undo ' Eingaben zurücksetzen
        MsgBox "Dieses Personal ist schon vorhanden."
      Case Else
        Fehlerbeschreibung
    End Select
Die Fehlerbehandlung/beschreibung steht in einem Modul:
Code:
Option Compare Database
Option Explicit

Public Function DatenbankFertig() As Boolean
    DatenbankFertig = True ' False
End Function

Public Sub Fehlerbeschreibung()
    MsgBox Err.Description
End Sub
Optional:
Bei auftretendem Fehler kann ggf. auch eine E-Mail abgesetzt werden (Outlook vorrausgesetzt).
Code:
    DoCmd.SendObject , , , strTo, , , strBetreff, strMessage, True
Munich85
Im Profil kannst Du frei den Rang ändern


Verfasst am:
14. Mai 2013, 13:02
Rufname:


AW: Fehlerbehandlung in VBA / Access - AW: Fehlerbehandlung in VBA / Access

Nach oben
       

Hallo VBA-Gemeinde,

Ich weiß, dieses Thema ist nicht das neuste aber dennoch möchte ich euch mit meiner Lösung beglücken. Ich habe ein Tool geschrieben, das besonders für große bereits bestehende Projekte geeignet ist, die über eine schlechte Fehlerbehandlung verfügen.

Das Tool vba-solution Fehlerbehandlung integriert automatisch einen Fehlerbehandler in ein bereits bestehendes Projekt und setzt den alten gegeben falls außer Kraft. Nur „on error resume Next“ Anweisungen sind davon ausgenommen, da sie normalerweise sinnvoll gesetzt werden.

Die zip-Datei beinhaltet eine detaillierte Anleitung.

Downloads vba-solution Fehlerbehandlung.zip

Für Fragen oder Anregungen gerne Email an mich

Grüße aus München

Matthias



vba_solution_Fehlerbehandlung.zip
 Beschreibung:
Fehlerbehandlung 1.01 zur Sicherheit auch angehaengt
Aktuelle Versionen siehe Links

Download
 Dateiname:  vba_solution_Fehlerbehandlung.zip
 Dateigröße:  331.91 KB
 Heruntergeladen:  151 mal

Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Programmierung / VBA: Debugger trotz vorhandener Fehlerbehandlung 2 yoseki 84 24. Feb 2014, 17:59
yoseki Debugger trotz vorhandener Fehlerbehandlung
Keine neuen Beiträge Access Programmierung / VBA: Fehlerbehandlung in VBA 8 Blockbuster 149 20. Feb 2014, 10:57
Blockbuster Fehlerbehandlung in VBA
Keine neuen Beiträge Access Programmierung / VBA: Fehlerbehandlung Recordset Laufzeitfehler 91 6 Zauberbaecker 494 04. Jun 2012, 19:05
MissPh! Fehlerbehandlung Recordset Laufzeitfehler 91
Keine neuen Beiträge Access Programmierung / VBA: Fehlerbehandlung in Formulare 8 Herbert40 494 22. Feb 2012, 15:51
Gast Fehlerbehandlung in Formulare
Keine neuen Beiträge Access Formulare: Me.textfeld.Undo funktioniert bei Fehlerbehandlung nicht 6 derbesteschmitt 583 08. Jun 2011, 10:28
derbesteschmitt Me.textfeld.Undo funktioniert bei Fehlerbehandlung nicht
Keine neuen Beiträge Access Tabellen & Abfragen: Fehlerbehandlung im SQL Statement 14 WasErlaubeSTRUUNZ 755 29. Jul 2010, 14:29
AS55 Fehlerbehandlung im SQL Statement
Keine neuen Beiträge Access Programmierung / VBA: Fehlerbehandlung wenn Formular nicht offen 5 Mirko K 354 12. Jun 2010, 17:46
derArb Fehlerbehandlung wenn Formular nicht offen
Keine neuen Beiträge Access Programmierung / VBA: Access steigt in der Fehlerbehandlung aus... 10 Wolfgang 1958 471 13. Dez 2008, 20:21
Wolfgang 1958 Access steigt in der Fehlerbehandlung aus...
Keine neuen Beiträge Access Programmierung / VBA: Fehlerbehandlung Datum 4 Mittelfarwick 658 02. Aug 2008, 14:36
Mittelfarwick Fehlerbehandlung Datum
Keine neuen Beiträge Access Hilfe: Fehlerbehandlung in VBA / Access 1 Gast 973 25. März 2008, 19:06
rita2008 Fehlerbehandlung in VBA / Access
Keine neuen Beiträge Access Formulare: fehlerbehandlung 3 Tom07 482 22. Nov 2007, 23:24
Nouba fehlerbehandlung
Keine neuen Beiträge Access Programmierung / VBA: TransferSpreadsheet - Fehlerbehandlung 4 byteline 1095 20. Sep 2007, 10:08
byteline TransferSpreadsheet - Fehlerbehandlung
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Expression Web