VB Überprüfen ob Datei offen, ohne Datei anzulegen

Hallo, ich bin neu hier, hab in letzter Zeit viel über VBA (Excel 2002) gegooglt und hab hier immer gute Antworten gefunden.
Jetzt steht ich das erste Mal vor einem Problem das ich mir nicht ergoogeln konnte.

Kurz zu mir: VBA seit ca. 4 Monaten wöchentlich autodidakisch, dadurch Grundlagen solala.

Zu meiner Frage: Ich hab mittlerweile ein komplexes Tool erstellt welches eine Datei X öffnet (mehrere Sheets) dort ein neues Sheeteinfügt und dieses dann anhand einer vorgegebenen Variablenliste die jeweiligen Spalten aus den anderen Sheets zusammenkopiert. Dies dann in einer neuen Datei Y speichert und die Orginaldatei nicht verändert. Momentan bin ich an der Fehlerbehebung.

Problem: Ich suche nach einer Schreibweise wie ich überprüfen kann ob die Datei X bereits geöffnet ist, wenn ja Abbruch und Meldung an den User. Hierfür hab ich bereits eine Lösung gefunden (Code steht unten). Allerdings erstellt dieser eine Datei mit dem gesuchten Namen, wenn Sie nicht vorhanden ist. Dadurch funktioniert meine Abfrage beim Speichern nicht mehr (es kommt jedesmal das Popup die Datei Y ist schon vorhanden soll sie überschrieben werden.)

Nun meine Frage: Gibt es auch andere Möglichkeiten herauszufinden, ob die Datei X noch geöffnet ist?

Vielen Dank für die Hilfe

Flow1224

Der Code:

Public Function Ist_Datei_Geoeffnet(speichernAdresse)

Dim FNr As Long
Dim FName As String

FName = speichernAdresse
On Error Resume Next
FNr = FreeFile
Open FName For Binary Access Read Lock Read Write As #FNr

If Err.Number 0 Then
Call MsgBox(„Die Datei kann nicht geöffnet werden.“ & vbNewLine & „Bitte überprüfen Sie folgende Punkte:“ & vbNewLine & vbNewLine & „- ist die Datei bereits geöffnet“ & vbNewLine & „- stimmt der angegebene Pfad (Schreibfehler)“ & vbNewLine & vbNewLine & „treffen diese Punkte nicht zu, laden Sie bitte die Quelldatei erneut.“)
Ist_Datei_Geoeffnet = True
Else
Ist_Datei_Geoeffnet = False
Close #FNr
End If
On Error GoTo 0

End Function

Hallo,

durch den Befehl „Open…“ legst du die Datei an, falls diese nicht existiert.

Wenn eine Datei nicht existiert, kann diese auch nicht geöffnet sein.
Dein Code ist eigentlich korrekt. Füge einfach eine Abfrage vor dem „Open“ ein. Überprüfe vor dem „Open“ ob die Datei überhaupt existiert (geht z.B. mit FileExist).
Falls die Datei nicht existiert, brauchst du den Test mit „Open“ nicht durchzuführen, und kannst normal weiterarbeiten.

Ich wünsche gutes Gelingen.
Grüße,
Martin

Nun… Kenne mich selber da nicht wirklich aus, aber ich sehe 2 Sachen:

  • Check ob das File existiert oder nicht. Das geht zB mit
    If Dir( „c:\myFile.txt“) „“ Then
    MsgBox „It Exists!“
    Else
    MsgBox „No Go!“
    End If
  • Wenn es existiert, dann mach einen Check, ob dieses File gesperrt ist durch eine andere Anwendung. Leider machen einige SWs wie zB notepad ein öffnen, Ins RAM lesen und dann die Datei wieder freigeben. Das heisst, dass die Datei dann nicht mehr in Verwendung durch Notepad ist.
    Unter http://www.xtremevbtalk.com/showthread.php?t=214424 fand ich:
    On Error Resume Next
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Dim fso
    Set fso = CreateObject(„Scripting.FileSystemObject“)

MySubje()

Private Sub MySubje()
On Error Resume Next
Dim strFileName
’ Full path and name of file.
strFileName = „k:\test.txt“
Set fLog = fso.OpenTextFile(strFileName, ForAppending, True)
If Err.Number = 70 Then
WScript.Echo „locked“
Else
WScript.Echo „not locked“
End If
Err.Clear
End Sub

Nichts davon habe ich ausprobiert und alles vom Handbuch der Menschheit, auch Google genannt.

Hallo Flow1224

Ein „open for binary“ erstellt immer die Datei mit Größe 0, wenn sie noch nicht vorhanden ist. Wenn sie nicht erstellt werden soll, muss ein „open for input“ gemacht werden.

Die Fehlermeldung kommt so natürlich bei jedem Fehler, also sowohl, wenn die Datei gesperrt ist, als auch, wenn sie gar nicht vorhanden ist.
Ich würde das noch unterscheiden, indem die err.number abgefragt wird.
err.number = 53 --> Die Datei ist nicht vorhanden.
err.number = 70 --> Die Datei ist gesperrt.

MfG
Roland

Zu meiner Frage: Ich hab mittlerweile ein komplexes Tool
erstellt welches eine Datei X öffnet (mehrere Sheets) dort ein
neues Sheeteinfügt und dieses dann anhand einer vorgegebenen
Variablenliste die jeweiligen Spalten aus den anderen Sheets
zusammenkopiert. Dies dann in einer neuen Datei Y speichert
und die Orginaldatei nicht verändert. Momentan bin ich an der
Fehlerbehebung.

Problem: Ich suche nach einer Schreibweise wie ich überprüfen
kann ob die Datei X bereits geöffnet ist, wenn ja Abbruch und
Meldung an den User. Hierfür hab ich bereits eine Lösung
gefunden (Code steht unten). Allerdings erstellt dieser eine
Datei mit dem gesuchten Namen, wenn Sie nicht vorhanden ist.
Dadurch funktioniert meine Abfrage beim Speichern nicht mehr
(es kommt jedesmal das Popup die Datei Y ist schon vorhanden
soll sie überschrieben werden.)

Nun meine Frage: Gibt es auch andere Möglichkeiten
herauszufinden, ob die Datei X noch geöffnet ist?

Vielen Dank für die Hilfe

Flow1224

Der Code:

Public Function Ist_Datei_Geoeffnet(speichernAdresse)

Dim FNr As Long
Dim FName As String

FName = speichernAdresse
On Error Resume Next
FNr = FreeFile
Open FName For Binary Access Read Lock Read Write As #FNr

If Err.Number 0 Then
Call MsgBox(„Die Datei kann nicht geöffnet werden.“ &
vbNewLine & „Bitte überprüfen Sie folgende Punkte:“ &
vbNewLine & vbNewLine & „- ist die Datei bereits geöffnet“ &
vbNewLine & „- stimmt der angegebene Pfad (Schreibfehler)“ &
vbNewLine & vbNewLine & „treffen diese Punkte nicht zu, laden
Sie bitte die Quelldatei erneut.“)
Ist_Datei_Geoeffnet = True
Else
Ist_Datei_Geoeffnet = False
Close #FNr
End If
On Error GoTo 0

End Function

Hallo Flow

Leider kann ich dir da auch nicht weiterhelfen
Gruß Bernd