12.03.2021, 21:10
Hallo,
wenn mit VBA eine Excel-Datei geöffnet werden soll, muss diese geschlossen sein.
Was ist "best practice" das zu prüfen?
Der folgende Code nutzt verschieden Ansätze für die Prüfung. Am Anfang muss ein geeigneter Pfad (einige aber nicht zu viele) mit xls? angegeben werden und ein Verweis auf MS-Word gesetzt werden. Die "Vorbereitung" definiert die Titel.
Alls Ansätze haben Vor- und Nachteile. Wa nutzt Ihr?
mfg
wenn mit VBA eine Excel-Datei geöffnet werden soll, muss diese geschlossen sein.
Was ist "best practice" das zu prüfen?
Der folgende Code nutzt verschieden Ansätze für die Prüfung. Am Anfang muss ein geeigneter Pfad (einige aber nicht zu viele) mit xls? angegeben werden und ein Verweis auf MS-Word gesetzt werden. Die "Vorbereitung" definiert die Titel.
Code:
'Prüfung, ob Datei verfügbar und geschlossen ist
Const Pfad As String = "C:\temp\" 'backslash am Ende
Dim FSO As Object
'Reference to Word.Application <<<<<<<<<<<<<<<<<<<
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Sub Vorbereitung()
Tit = Array("File", "OPEN LOCK", "Dir ('~$')", "API Tasks")
With Cells(1, 1).Resize(, 5)
.Value = Tit
.Font.Bold = True
.Interior.Color = 15123099
End With
End Sub
Sub Liste_xls_Dateien()
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FLD = FSO.GetFolder(Pfad) 'Folder
i = 1
For Each FL In FLD.Files
If InStr(1, FL.Name, ".xls") > 0 Then
'Debug.Print FL.Name
i = i + 1
Cells(i, 1) = FL.Name
If fn_Lock(FL.Name) Then Cells(i, 2) = "closed" Else Cells(i, 2) = "open"
If fn_Tilde(FL.Name) Then Cells(i, 3) = "closed" Else Cells(i, 3) = "open"
If fn_API(FL.Name) Then Cells(i, 4) = "closed" Else Cells(i, 4) = "open"
If fn_Task(FL.Name) Then Cells(i, 5) = "closed" Else Cells(i, 5) = "open"
End If
Next
End Sub
Function fn_Lock(ByVal file) As Boolean 'True = closed
On Error Resume Next
ff = FreeFile
Open (Pfad & file) For Binary Access Read Lock Read As #ff
Close #ff
If Err.Number = 0 Then
fn_Lock = True
Else
fn_Lock = False
End If
Err.Clear
End Function
Function fn_Tilde(ByVal file) As Boolean
If Left(file, 2) = "~$" Then fn_Tilde = False: Exit Function
If Dir(Pfad & "~$" & file, vbHidden) = vbNullString Then
fn_Tilde = True
Else
fn_Tilde = False
End If
End Function
Function fn_API(ByVal file) As Boolean
If FindWindow(vbNullString, file & " - Excel") = 0 Then
fn_API = True
Else
fn_API = False
End If
End Function
Function fn_Task(ByVal file) As Boolean ' benötigt Verweis zu Word
Dim Ts As Task
fn_Task = True
For Each Ts In Tasks
If InStr(1, Ts.Name, file, vbTextCompare) > 0 Then fn_Task = False
Next Ts
End Function
Alls Ansätze haben Vor- und Nachteile. Wa nutzt Ihr?
mfg