AW: VBA erkennt errors.count nicht
04.08.2008 17:23:34
Meier
Hier noch, aus der Dokumentation der Access-Anwendung einige Zeilen, vielleicht helfen sie ja:
"Um die Fehlerinformation nicht zu verlieren, muss der ErrorHandler() eine spezielle Fehlerbehandlung aufweisen. Bevor die eigentliche Fehlerbehandlung aktiviert wird, müssen die Fehlerinformationen gesichert werden. Die Prozedur darf also auf keinen Fall mit einem On Error
Statement beginnen, da dieses Statement die Fehlerinformation vernichten und den Fehler zurücksetzen würde, womit eine Protokollierung der aufgetretenen Fehler nicht mehr möglich ist.
Die Fehlerinformation ist in verschiedenen Eigenschaften des Err-Objektes abgelegt. Um diese zwischenzuspeichern kann eine Typen-Deklaration verwendet werden. Die Error-Objekte der Errors-Collection weisen eine ähnliche Struktur auf. Zusätzlich verfügt es über die Properties HelpContext und HelpFile, kennt aber das LastDLLError-Property nicht.
Vielfach ist es ausreichend, eine reduzierte Version eines Datentypen für die Sicherung der Fehlerinformation zu definieren, welche die gemeinsamen Felder beinhaltet, da die weggelassenen Felder selten zur Fehlerbehebung beitragen.
Type ErrInfo
Nbr As Long 'Err.Number
Dsc As String 'Err.Description
Src As String 'Err.Source
End Type
Mit dieser Typendeklaration kann nun zu Beginn der Funktion die noch aktuelle Fehlerinformation gesichert werden. Dabei kann der Typ verwendet werden, um einen Array zu deklarieren, der dann anhand der Anzahl der Fehler in der Errors-Collection redimensioniert werden kann. So haben wir die Möglichkeit, das Err-Objekt in das 0-te Array Element und die Error Objekte in die folgenden Array-Variablen abzufüllen.
Public Function ErrorHandler()
Dim errSave() As ErrInfo
Dim I As Long
ReDim errSave(0)
With errSave(0)
.Nbr = Err.Number
.Dsc = Err.Description
.Src = Err.Source
End With
If Errors(Errors.Count - 1).Number = Err.Number Then
ReDim Preserve errSave(0 To Errors.Count - 1)
For I = Errors.Count - 1 To 0 Step -1
With errSave(I)
.Nbr = Errors(I).Number
.Dsc = Errors(I).Description
.Src = Errors(I).Source
End With
Next I
End If
End Function
Bei der Sicherung der Informationen sind einige Tücken zu umschiffen. Die Errors Collection wird nicht zurückgesetzt, wenn ein neuer Fehler auftritt, der diese nicht benutzt. Der letzte in der Errors Collection enthaltene Fehler (Errors.Count - 1) ist der zurückgemeldete Fehler, der im Err-Objekt enthalten ist. Falls die Err.Number nicht mit der Nummer des letzten Fehlers in der Errors-Collection identisch ist, muss davon ausgegangen werden, dass diese nicht benutzt wurde. Sie enthält daher noch alte Error-Objekte eines früheren Fehlers, die nicht gelöscht wurden. Sie darf in diesem Fall nicht ausgewertet werden. Falls die Fehlernummer identisch ist, enthält dagegen die Err.Description oftmals keinen aussagekräftigen Text, sondern irgendetwas wie "ODBC Aufruf fehlgeschlagen". Der aussagekräftigere Text für diese Fehlernummer befindet sich in diesem Fall im letzten Objekt der Errors-Collection. Daher führt nachfolgender Ansatz zu vernünftigen Fehlerinformationen:
Zuerst wird das Err-Objekt gesichert. Anschliessend wird kontrolliert, ob das letzte Error-Objekt der Errors-Collection mit dem Err-Objekt identisch ist (Vergleich über .Number). Falls das der Fall ist, wird die Information des Err-Objekts mit der Information der letzten Error-Objektes überschrieben. Alle weiteren, in der Errors-Collection enthaltenen Fehler-Objekte werden ebenfalls gesichert, da diese unter Umständen nützliche weitere Informationen zum Fehler enthalten."
Quelle: Dokumentation ErrorHandler von Henry Habermacher