Allgemeines über VBA-Laufzeitfehler
Übersicht über die VBA-Laufzeitfehler
Präzedenz der Dateizugriff-Laufzeitfehler
Laufzeitfehler bei Datei-Operationen
Mögliche Laufzeitfehler beim Kopieren einer Datei
Mögliche Laufzeitfehler beim Löschen einer Datei
Fehlerbehandlungsroutinen für Dateizugriffe
Diese Seite ist teilweise in Bearbeitung! |
Allgemeines über VBA-Laufzeitfehler
Beim Zugriff auf Dateien, Verzeichnisse oder Laufwerke kommt es nicht selten zu Situationen, in denen ein Laufzeitfehler auftritt. Mit "Zugriff" meine ich sämtliche Operationen wie Erstellen, Lesen, Schreiben, Ändern, Kopieren, Umbenennen, Verschieben und Löschen von Dateien, Ordnern und Laufwerken sowie Ausführen von Dateien.
Bereits einfachste VBA-Anweisungen, wie beispielsweise der FileCopy-Befehl,
können eine Fehlermeldung zur Folge haben, weil eine Vielzahl verschiedener Faktoren das
erfolgreiche Kopieren einer Datei verhindern können:
- Der Pfadname der Quelldatei könnte fehlerhaft sein
- Der Pfadname der Zieldatei könnte fehlerhaft sein
- Der Dateiname der Quelldatei könnte fehlerhaft sein
- Der Dateiname der Zieldatei könnte fehlerhaft sein
- Die Quelldatei könnte nicht existieren
- Die Quelldatei könnte gesperrt sein
- Die Zieldatei könnte bereits existieren und gesperrt sein
- Der Pfad- und Dateiname der Quelldatei könnte mit dem Pfad- und Dateinamen der
Zieldatei identisch sein
- Die Benutzerrechte zum Schreiben in das Zielverzeichnis könnten ungenügend sein
- Das Zielverzeichnis könnte auf einer Diskette sein und es ist keine Diskette
eingelegt
- Das Zielverzeichnis könnte auf einer CD-ROM sein
- Das Zielverzeichnis könnte schreibgeschützt sein
- Weitere Gründe...
Weitere Informationen |
|
Übersicht über die VBA-Laufzeitfehler
Hier eine Übersicht der auffangbaren Laufzeitfehler, die in VBA-Programmen in Bezug auf Dateizugriffe auftreten können.
| Code | Fehlerbeschreibung | Bemerkung |
| 52 | Dateiname oder -nummer falsch | - |
| 53 | Datei nicht gefunden | - |
| 54 | Falscher Dateimodus | - |
| 55 | Datei bereits geöffnet | - |
| 57 | Fehler beim Lesen von/Schreiben auf Gerät | - |
| 58 | Datei existiert bereits | - |
| 59 | Falsche Datensatzlänge | - |
| 61 | Datenträger voll | - |
| 62 | Einlesen hinter Dateiende | - |
| 63 | Falsche Datensatznummer | - |
| 67 | Zu viele Dateien | - |
| 68 | Gerät nicht verfügbar | Laufwerk existiert nicht |
| 70 | Zugriff verweigert | Siehe Anmerkung [1] |
| 71 | Datenträger nicht bereit | z.B. Datenträger nicht eingelegt |
| 74 | Umbenennen bei Angabe unterschiedlicher Laufwerke nicht möglich | - |
| 75 | Fehler beim Zugriff auf Pfad/Datei | - |
| 76 | Pfad nicht gefunden | - |
Anmerkungen
[1] Laufzeitfehler 70: Zugriff verweigert
Den Laufzeitfehler 70 kennt man praktisch nur von Dateizugriffen.

Es existieren jedoch auch andere Situationen, in denen dieser Laufzeitfehler auftreten kann; beispielsweise bei der Verwendung einer ComboBox auf einer UserForm:
'VBA-Code im
UserForm_Initialize-Ereignis
ComboBox1.RowSource = "E2:E11"
ComboBox1.AddItem "<Neuer Datensatz>"
Die zweite Codezeile führt zum Laufzeitfehler 70 "Zugriff verweigert". Durch Setzen der RowSource wird das Steuerelement an eine Datenquelle gebunden (sog. Bound Control) und ist ab diesem Zeitpunkt nicht mehr für den manuellen Zugriff verfügbar.
Das Umkehren der beiden Anweisungen führt zwar nicht mehr zu obigem Fehler.
'VBA-Code im
UserForm_Initialize-Ereignis
ComboBox1.AddItem "<Neuer Datensatz>"
ComboBox1.RowSource = "E2:E11"
Da aber die RowSource erst nach der AddItem-Methode definiert wird, wird das ursprünglich hinzugefügte Element "<Neuer Datensatz>" entfernt.
Präzedenz der Dateizugriff-Laufzeitfehler
Am einfachsten lässt sich die Präzedenz (Rangfolge, Vorrang) von Laufzeitfehlern anhand eines kleinen praktischen Beispiels erläutern. Nehmen wir also einmal an, die Datei "MeineMappe.xls" soll in ein anderes Verzeichnis kopiert werden und dabei einen neuen Namen erhalten. Die dazu benötigte VBA-Anweisung ist FileCopy, und die Codezeile sieht so aus:
FileCopy "D:\Daten\MeineMappe.xls", "D:\AlteDaten\UnsereMappe.xls"
Annahmen und mögliche Probleme
- Angenommen die Zieldatei "UnsereMappe.xls" existiert bereits, dann wird
bei Ausführen der FileCopy-Anweisung kein Laufzeitfehler auftreten.
- Angenommen die Zieldatei "UnsereMappe.xls" existiert bereits und ist
Read-Only (Datei-Attribut "Schreibgeschützt" ist gesetzt), dann wird bei
Ausführen der FileCopy-Anweisung der Laufzeitfehler 75 "Fehler beim Zugriff
auf Pfad/Datei" auftreten.
- Angenommen die Zieldatei "UnsereMappe.xls" existiert bereits und ist
gesperrt, da sie gerade geöffnet ist, dann wird bei Ausführen der FileCopy-Anweisung
der Laufzeitfehler 70 "Zugriff verweigert" auftreten.
Frage
Angenommen die Zieldatei "UnsereMappe.xls" existiert bereits, ist
Read-Only und gesperrt, welcher Laufzeitfehler wird bei Ausführen der FileCopy-Anweisung
auftreten? Was meinen Sie: Laufzeitfehler 75 "Fehler beim Zugriff auf
Pfad/Datei" oder Laufzeitfehler 70 "Zugriff verweigert"?
Antwort
Die korrekte Antwort ist: Laufzeitfehler 70 "Zugriff verweigert".
Fazit
Wenn also eine Situation existiert, die sowohl zum Fehler 75 als auch zum Fehler 70
führt, so wird nur der Fehler 70 ausgelöst. Der Laufzeitfehler 70 hat somit Vorrang in
Bezug auf den Fehler 75.
Laufzeitfehler bei Datei-Operationen
Mögliche Laufzeitfehler beim Kopieren einer Datei
Hier möchte ich kurz aufzeigen, wie wichtig es ist, dass man bei einer Dateioperation sämtliche potenziellen Laufzeitfehler abfängt. In den folgenden Beispielen wird anhand der VBA-Anweisung FileCopy eine Datei kopiert.
53: Datei nicht gefunden
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.xxx", "D:\NeueDaten\Dokumente\Save\Clipbord.sav"
71: Datenträger nicht bereit
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "A:\Clipbord.sav" (A ist ein Disketten-Laufwerk)
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "E:\Clipbord.sav" (E ist ein CD-ROM-Laufwerk und es ist keine CD eingelegt)
76: Pfad nicht gefunden
FileCopy "D:\NeueDaten\Dokumente\Sav\Clipbord.txt", "D:\NeueDaten\Dokumente\Save\Clipbord.sav"
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Sav\Clipbord.sav"
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "E:\Daten\Clipbord.sav" (E ist ein CD-ROM-Laufwerk und das Verzeichnis "Daten" existiert nicht)
75: Fehler beim Zugriff auf Pfad/Datei
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Save"
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Save\Clipbord.sav" (Clipbord.sav existiert und ist Read-Only)
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Save\Clipbord.txt" (Clipbord.txt ist gesperrt und ist Read-Only)
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "E:\Clipbord.sav" (E ist ein CD-ROM-Laufwerk und es ist eine CD eingelegt)
70: Zugriff verweigert
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Save\Clipbord.txt"
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Save\Clipbord.sav" (Clipbord.txt ist gesperrt)
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Save\Clipbord.sav" (Clipbord.sav existiert und ist gesperrt)
FileCopy "D:\NeueDaten\Dokumente\Save\Clipbord.txt", "D:\NeueDaten\Dokumente\Save\Clipbord.sav" (Clipbord.txt ist gesperrt; Clipbord.sav existiert und ist Read-Only)
Mögliche Laufzeitfehler beim Löschen einer Datei
...
53: Datei nicht gefunden
Kill "D:\NeueDaten\Dokumente\Save\Clipbord.txt"
Fehlerbehandlungsroutinen für Dateizugriffe
Wie bereits mehrfach erwähnt, ist es insbesondere bei der Durchführung von Dateizugriffen wichtig, dass sämtliche potentiellen Fehler abgefangen, ausgewertet und behoben werden.
VBA-Programmcode einer Fehlerbehandlungsroutine
Hier eine kleine VBA-Prozedur mit einer Muster-Fehlerbehandlungsroutine:
Sub FileErrorHandler()
Dim strFileName As String
strFileName = "C:\Daten\MeineMappe.xls"
On Error GoTo ErrorHandler
'Programmcode für Datei-Operation...
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 52
'''Dateiname oder -nummer falsch
MsgBox "Der Dateiname " & strFileName &
" oder die verwendete Dateinummer ist ungültig!", vbExclamation
Case 53
'''Datei nicht gefunden
MsgBox "Die Datei " & strFileName &
" konnte nicht gefunden werden!", vbExclamation
Case 54
'''Falscher Dateimodus
MsgBox "Der zum Lesen/Schreiben der Datei " &
strFileName & " verwendete Dateizugriffsmodus ist ungültig!", vbExclamation
Case 55
'''Datei bereits geöffnet
MsgBox "Die Datei " & strFileName &
" ist bereits geöffnet!", vbExclamation
Case 57
'''Fehler beim Lesen von/Schreiben
auf Gerät
MsgBox "Das Gerät der Datei " & strFileName
& " kann nicht angesprochen werden!", vbExclamation
Case 58
'''Datei existiert bereits
MsgBox "Die Datei " & strFileName &
" existiert bereits!", vbExclamation
Case 59
'''Falsche Datensatzlänge
MsgBox "Die zum Lesen/Schreiben der Datei " &
strFileName & " verwendete Datensatzlänge ist falsch!", vbExclamation
Case 61
'''Datenträger voll
MsgBox "Die Datei " & strFileName &
" kann nicht gespeichert werden, weil der Datenträger voll ist!", vbExclamation
Case 62
'''Einlesen hinter Dateiende
MsgBox "Es wurde versucht, hinter dem Dateiende der
Datei " & strFileName & " einzulesen!", vbExclamation
Case 63
'''Falsche Datensatznummer
MsgBox "Die beim Zugriff auf die Datei " &
strFileName & " verwendete Datensatznummer ist falsch!", vbExclamation
Case 67
'''Zu viele Dateien offen
MsgBox "Auf die Datei " & strFileName &
" kann nicht zugegriffen werden, weil zu viele Dateien geöffnet sind!",
vbExclamation
Case 68
'''Gerät nicht verfügbar
MsgBox "Das Gerät der Datei " & strFileName
& " ist nicht verfügbar!", vbExclamation
Case 70
'''Zugriff verweigert
MsgBox "Der Zugriff auf die Datei " &
strFileName & " wurde verweigert!", vbExclamation
Case 71
'''Datenträger nicht bereit
MsgBox "Der Datenträger für die Datei " &
strFileName & " ist nicht bereit (Diskette, CD ROM, Wechselplatte o.ä.)!",
vbExclamation
Case 74
'''Umbenennen bei Angabe
unterschiedlicher Laufwerke nicht möglich
MsgBox "Die Datei " & strFileName &
" kann nicht umbenannt werden, weil zwei verschiedene Laufwerke angegeben
wurden!", vbExclamation
Case 75
'''Fehler beim Zugriff auf Pfad/Datei
MsgBox "Die Datei " & strFileName &
" ist bereits geöffnet!", vbExclamation
Case 76
'''Pfad nicht gefunden
MsgBox "Der Pfad der Datei " & strFileName
& " konnte nicht gefunden werden!", vbExclamation
Case Else
'''Andere Laufzeitfehler
MsgBox "Beim Zugriff auf die Datei " &
strFileName & " ist ein Fehler aufgetreten!" & vbCrLf & vbCrLf &
_
"Laufzeitfehler "
& Err.Number & vbCrLf & Err.Description, vbExclamation
End Select
End Sub
'****************************************************************************************
'Individueller Meldungstext zu einem Dateizugriffsfehler zurückgeben
'****************************************************************************************
Public Function GetFileErrorMessage(ByVal intError As Integer, ByVal strError As String,
ByVal strFile As String) As String
If intError = 52 Then
'Bad file name or number
GetFileErrorMessage = "Der angegebene Pfad-/Dateiname '"
& strFile & "' ist ungültig!"
ElseIf intError = 53 Then
'File not found
GetFileErrorMessage = "Die angegebene Datei '" & strFile
& "' konnte nicht gefunden werden!"
ElseIf intError = 55 Then
'File already open
GetFileErrorMessage = "Die angegebene Datei '" & strFile
& "' ist bereits geöffnet!"
ElseIf intError = 57 Then
'Device I/O error
GetFileErrorMessage = "Auf das Gerät mit der angegebenen Datei
'" & strFile & "' kann nicht zugegriffen werden!"
ElseIf intError = 68 Then
'Device unavailable
GetFileErrorMessage = "Das Gerät mit der angegebenen Datei
'" & strFile & "' ist nicht verfügbar!"
ElseIf intError = 70 Then
'Permission denied/File locked
'File is already opened by another user
GetFileErrorMessage = "Die angegebene Datei '" & strFile
& "' ist nicht verfügbar!"
ElseIf intError = 71 Then
'Disk not ready
GetFileErrorMessage = "Der Datenträger mit der angegebenen Datei
'" & strFile & "' ist nicht bereit (Diskette, CD-ROM, Wechselplatte usw.
ist nicht eingelegt)!"
ElseIf intError = 75 Then
'Path/File access error
'OLD: If Dir(strFileName, vbDirectory) <> "" Then
If Val(GetAttr(strFile) And vbDirectory) <> 16 Then
GetFileErrorMessage = "Bei der angegebenen Datei
'" & strFile & "' handelt es sich um einen Ordner!"
Else
GetFileErrorMessage = "Auf die angegebene Datei
'" & strFile & "' kann aus einem unbekannten Grund nicht zugegriffen
werden!"
End If
ElseIf intError = 76 Then
'Path not found
GetFileErrorMessage = "Das Verzeichnis der angegebenen Datei
'" & strFile & "' konnte nicht gefunden werden!"
ElseIf intError <> 0 Then
'All other errors
GetFileErrorMessage = "Beim Zugriff auf die angegebene Datei
'" & strFile & "' ist ein nicht näher bekannter Fehler
aufgetreten!" & vbCrLf & vbCrLf & "Fehler " & intError
& vbCrLf & strError
Else
'No error
GetFileErrorMessage = "Es trat kein Fehler auf."
End If
End Function
MsgBox GetFileErrorMessage(Err.Number, Err.Description, strFile)
Zuletzt aktualisiert am
20.05.2005 / 17:30 Uhr
© 2002-2005 by Philipp von Wartburg, CH-8916 Jonen
Alle Rechte vorbehalten