Office Logo VBA  Zurück zur Hauptseite

VBA-Laufzeitfehler

       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

 

       Home Zur Hauptseite

To Top

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

VBA-Befehle und -Funktionen

VBA-Universallösungen

To Top

 


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

Laufzeitfehler 70: Zugriff verweigert

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.

To Top

 


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.

To Top

 


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)

To Top


Mögliche Laufzeitfehler beim Löschen einer Datei

...

 

53: Datei nicht gefunden

Kill "D:\NeueDaten\Dokumente\Save\Clipbord.txt"

 

To Top

 


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)

 

To Top

Haben Sie Fragen, Anregungen oder Hinweise?
Senden Sie mir ein Mail

Zuletzt aktualisiert am 20.05.2005 / 17:30 Uhr
© 2002-2005 by Philipp von Wartburg, CH-8916 Jonen
Alle Rechte vorbehalten