wie kann man per VBA testen, ob eine Datei vorhanden ist?
Ich möchte es nicht über das öffnen probieren und dann das
Fehlerobject auswerten, es müsste auch etwas einfacher
gehen.
Gruß Ronny
Gruss, Hans Faber
Sub Dateiprüfung()
Dim strPfad As String
'Prüfung, ob Datei "Test.xls" im gleichen Verzeichnis
vorhanden ist ...
strPfad = ActiveWorkbook.Path & Application.PathSeparator
'Aufruf Function ExistiertDatei
If Not ExistiertDatei(strPfad & "Test.xls") Then
MsgBox "Datei nicht vorhanden"
Else
MsgBox "Datei vorhanden"
End If
End Sub
Function ExistiertDatei(strDatei As String) As Boolean
If Dir(strDatei) <> "" Then
ExistiertDatei = True
Else
ExistiertDatei = False
End If
End Function
>-----Originalnachricht-----
>.
>
Man sollte mindestens drei Tests durchführen, bevor man eine
(xls-)Datei öffnet. Aber: Trotz sämtlicher Tests darfst du keines-
falls auf eine Fehlerbehandlungsroutine verzichten (mehr dazu am
Schluss dieses Postings)!
Hier der VBA-Code für die drei Tests:
1) Die Existenz einer Datei kann man mit VBA so prüfen:
Sub CheckFile()
If Dir("C:\Daten\MeineMappe.xls") <> "" Then
MsgBox "Die Datei existiert."
Else
MsgBox "Die Datei existiert nicht."
End If
End Sub
Wenn man ganz sicher gehen will und auch verborgene Dateien
berücksichtigen möchte, sollte man bei der Dir-Funktion den
Parameterwert "vbHidden" angeben:
If Dir("C:\Daten\MeineMappe.xls", vbHidden) <> "" Then
2) Zusätzlich sollte man vor dem Öffnen prüfen, ob die Datei nicht
bereits in der Excel-Sitzung geöffnet ist. Das lässt sich mit einer
kleinen Funktion erledigen:
Function CheckIfOpen(strFilename As String) As Boolean
Dim wbkWorkbook As Workbook
For Each wbkWorkbook In Application.Workbooks
If UCase(wbkWorkbook.Name) = UCase(strFilename) Then
CheckIfOpen = True
Exit Function
End If
Next wbkWorkbook
CheckIfOpen = False
End Function
Die obige Funktion wird wie folgt aufgerufen:
Sub TestCall()
If CheckIfOpen("MeineMappe.xls") Then
MsgBox "Die Mappe ist in dieser Excel-Sitzung geöffnet."
Else
MsgBox "Die Mappe ist in dieser Excel-Sitzung nicht geöffnet."
End If
End Sub
3) Ich empfehle eine weitere Überprüfung. Die zu öffnende Datei
könnte nämlich bereits in einer anderen Excel-Sitzung geöffnet
sein, d.h. auf dem gleichen oder einem anderen PC, von einem
anderen User oder einem anderem Programm. Ob die Datei
wirklich verfügbar ist, ermittelt diese Funktion:
Function IsFileOpen(ByVal strFileame As String) As Boolean
Dim intErrorNum As Integer
On Error Resume Next
Open strFilename For Input Lock Read As #1
Close #1
intErrorNum = Err.Number
On Error GoTo 0
Select Case intErrorNum
Case 0
'Kein Fehler, also ist Datei nicht geöffnet
IsFileOpen = False
Case 70
'Fehler "Zugriff verweigert", also ist Datei geöffnet
IsFileOpen = True
Case Else
'Anderer Fehler
Error intErrorNum
End Select
End Function
Die Funktion wird so aufgerufen:
Sub TestCall()
If IsFileOpen("C:\Daten\MeineMappe.xls") Then
MsgBox "Datei ist momentan geöffnet."
Else
MsgBox "Datei ist momentan nicht geöffnet."
End If
End Sub
Wenn die obigen drei Tests bestanden sind, kann man die Datei mit
hoher Wahrscheinlichkeit öffnen.
Betreffend Fehlerbehandlung:
Wenn man wie in Test 1) gezeigt mit der Dir-Funktion die Dateiexistenz
prüft, muss man unbedingt einen Error Handler verwenden, d.h.
"On Error Goto ErrorHandler" und Err.Number auswerten. Das Laufwerk
oder der Datenträger mit der Datei könnten nämlich nicht ansprechbar sein:
- Dir("A:\Daten\MeineMappe.xls") ohne Diskette führt zu Fehler 71
- Dir("E:\Daten\MeineMappe.xls") ohne CD führt zu Fehler 76
- Dir("S:\Daten\MeineMappe.xls") ohne LAN führt zu Fehler 68
In kritischen Geschäftsanwendungen sollte man unbedingt weitere Tests
durchführen, unter anderem diese:
- Besitzt die Datei das Excel Arbeitsmappen-Format?
- Ist die Datei grösser als 0 Byte?
- Sind genügend Benutzerrechte zum Öffnen vorhanden?
- Verwendet die Mappe ein Lese-/Schreibkennwort (Dateikennwort)?
- Besitzt die Mappe ein Schreibschutzkennwort?
PS: Auf der "The SOSCQ Page" findest du sämtliche Informationen über
alles, was irgendwie mit Excel und Dateien zu tun hat.
http://195.186.84.74/soscq/index.htm
Gruss
Philipp von Wartburg
"Ronny Rost" <anon...@discussions.microsoft.com> schrieb im Newsbeitrag
news:096001c3aaac$076285e0$a401...@phx.gbl...