Datei geöffnet Prüfung
#1
Hallo miteinander,

gern würde ich prüfen, ob eine Datei offen steht.

ich habe nun gefühlte 20 Codes aus dem inet durch. Jedoch kommt entweder immer die Antwort "Datei steht offen" oder immer "Datei ist geschlossen"

Diese beiden hier habe ich als Bsp angefügt.

Datei immer offen:
Code:
Private Function DateiGeoeffnet(DerPfad As String) As Boolean
' Bei shared Workbooks, schreibgeschützten Mappen o.ä.. kann dies auch ein falsch zurückgeben.
   On Error Resume Next
   Open DerPfad For Binary Access Read Lock Read As #1
   Close #1
   If Err.Number <> 0 Then
       DateiGeoeffnet = True
       Err.Clear
   End If
End Function
Code:
Public Sub datei_geöffnet_prüfung()
   Dim sPfad As String
   sPfad = "G:\ordner1\ordner2\test1.xlsm" ' Pfad ändern für Tests
   MsgBox "datei steht offen", DateiGeoeffnet(sPfad)

   
End Sub

Datei immer geschlossen:
Code:
Function IsFIleOpen(sFile As String) As Boolean
  Dim wkb As Object
  On Error Resume Next
  Set wkb = Workbooks(sFile)
  If Err = 0 And Not wkb Is Nothing Then
     IsFIleOpen = True
  End If
  On Error GoTo 0
End Function
Code:
Sub Prüfung()
Dim sFile As String
  sFile = "G:\ordner1\ordner2\test1.xlsm"
  If IsFIleOpen(sFile) Then
  MsgBox "Geöffnet"
  Else
   MsgBox "Nicht geöffnet"
  Exit Sub
  End If
End Sub

Wie kann das sein?
Bzw was kann ich tun damit das richtig erkannt wird?

Liebe Grüße 
Klaus
Top
#2
Hallo,

warum nicht Variante 21?

Wenn eine xlsx - Datei geöffnet wird, wird zuerst eine temporäre Kopie angelegt. Diese sollte mit einem einfachen DIR-Befehl geprüft werden können.

Code:
Pfad = "c:\temp\"
gesuchteDatei = "meineXLSX.xlsx"

if dir(Pfad & "~" & gesuchteDatei) <> vbnullstring then msgbox "offen"

(ungeprüft)

mfg
Top
#3
Vielen Dank Fennek,

das muss ich auf der Arbeit mal prüfen, ob ich da im Netzwerk überhaupt an den Temp Ordner ran komme...
Hätte ich besser sagen sollen dass das im Endstadium im Firmennetzwerk laufen soll... sorry

wie müsste man den Code dann erweitern, damit auch auswirft wenn / das die Datei geschlossen ist?

Liebe Grüße
Klaus
Top
#4
die temporäre Kopie ist NICHT im tmp-Ordner, sondern im selben Ordner wie die xlsx.

Falls Du sie nicht gehen solltest, musst Du im Explorer die "Anzeige versteckte Dateien" anklicken.
Top
#5
Hallöchen,

oder so:

Zitat:Sub test()
MsgBox Dir(ThisWorkbook.Path & "\~$" & ThisWorkbook.Name, vbHidden)
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#6
Hallo

ich habe den ungetesteten Code von Fennek so ans laufen gebracht.  Der von Schauan funktioniert auch, bezieht sich aber nur auf ThisWorkbook.
Mit Fenneks Version, erweitert um vbHidden, kann man jede beliebige Datei prüfen. Die Idee stammte von Schauan. Ich habe beides nur kombiniert.

mfg Gast 123

Code:
Sub Test()   'Code von Fennek
 sFile = "F:\Excel Clever Forum 2019\"
 Datei = "Test.xlsm"
 If Dir(sFile & "~$" & Datei, vbHidden) <> Empty Then MsgBox "offen"
End Sub
Top
#7
Hallo,

zuerst danke für die Ausarbeitung der Idee. Hier eine Ergänzung:

Ziel ist es den Namen eines beliebigen geöffneten Workbooks zu finden.

Im Test habe ich mit LO eine Datei erstellt und gespeichert, aber LO nicht geschlossen. Bekannt ist der Ordner, hier "Desktop". Die temporäre Datei ist ".~lock.Test.ods#"

Vorschlag 1: DIR

Code:
CMD: dir c:\users\xxxx\desktop\*.* /ah

Vorschlag 2: Tasklist

Code:
CMD: tasklist /v  /fi "imagename eq soffice.bin"

Der Name der Datei muss jeweils mit String/Array-Befehlen identifiziert werden. Diese Ansätze sollten auch bei anderen Instanzen funktionieren.

In der selben Instanz kann man einfach die Workbooks iterieren.

mfg

(eine Anpassung auch die Schlüsselwort von Excel und der Aufruf von CMD aus VBA ist kein Problem)

(Ergänzung: Powershell: get-childitem -Path C:\Users\xxxx\Desktop -Hidden -Name
)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste