Hallo Zusammen,
ich habe eine Menüführung via Userform, in der der Benutzer eine weitere Exceldatei auswählen muss. Jetzt kommt es hin und wieder vor, dass die Exceldatei, die der Benutzer auswählt, bereits geöffnet ist. Besteht während der geöffneten Userform die Möglichkeit, abzufragen, ob die ausgewählte Datei bereits geöffnet ist und kann ich diese per VBA Code wieder schließen?
Danke
Grüße
Mirko
Zitat von: Blaupunkt79 am Februar 13, 2024, 09:34:58Besteht während der geöffneten Userform die Möglichkeit, abzufragen, ob die ausgewählte Datei bereits geöffnet ist und kann ich diese per VBA Code wieder schließen?
In der Regel läuft nur eine Instanz von Excel, auch wenn mehrere Dateien geöffnet sind. In diesem Szenario kannst du über die Collection
Excel.Application.Workbooks auf alle anderen Workbooks in deiner aktuellen Instanz zugreifen und dann mit der
Workbook.Close-Methode schließen.
Wenn das gewählte Workbook in einer anderen Excel-Instanz geöffnet ist, wird es schon schwieriger. Du findest sicher bei Google Beispiele, wie man mit der Windows API geöffnete Anwendungen/Fenster einer bestimmten Anwendung finden kann.
Einfacher und zuverlässiger geht es mit meiner (kostenpflichtigen) FileLockAnalyzer-Klasse (https://accessdevtools.com/product/file-lock-analyzer/).
Prüfen, ob Datei bereits geöffnet ist (https://vb-tec.de/isopen.htm)
Wenn die Mappe offen ist, kannst Du Dir mit GetObject die Referenz auf diese holen. Mit der Referenz kannst Du dann alles ausführen, auch ein gezieltes Schließen.
Dim oXL As Object
Dim oWB As Object
Set oWB = GetObject(FullPathWorkbook)
Set oXL = oWB.Application
Zitat von: ebs17 am Februar 13, 2024, 12:41:08Wenn die Mappe offen ist, kannst Du Dir mit GetObject die Referenz auf diese holen.
Guter Punkt! Das hatte ich eben nicht bedacht. Wenn die andere Datei in Excel geöffnet ist, ist das eine sehr gute Lösung.
Hallo Zusammen,
sehr gut funktioniert, hab es wie folgt gelöst:
Worksheets("BV").Range("A1:BB" & Rows.Count).ClearContents
Path = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx")
If Path = "Falsch" Then MsgBox ("Sie müssen eine Datei auswählen!"): Exit Sub
laenge = InStrRev(Path, "\")
Dateiname = Mid$(Path, InStrRev(Path, "\") + 1)
Pfad = Left$(Path, laenge)
Blatt = "Sheet1"
If IsFileOpen(Pfad & Dateiname) Then
Set oWB = GetObject(Pfad & Dateiname)
oWB.Close savechanges:=False
Set oWB = Nothing
Else
End If
lngAnzZeilen = ActiveSheet.Rows.Count - 1
SourcePath = Pfad
SourceFile = Dateiname
sourceSheet = "Tabelle1"
strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!"
Worksheets("BV").Range("a10").Formula = "=LookUp(2,1/(" & strQuelle & " $C$1:$C$" & lngAnzZeilen & "<>""""),Row(C:C))"
i = Worksheets("BV").Range("a10").Value
Worksheets("BV").Range("A10") = ""
Bereich = "A1:ad" & i
Set Ziel = Worksheets("BV").Range("A1")
If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
End If
Public Function IsFileOpen(ByRef Path As String) As Boolean
Dim FileNr As Integer
Dim ErrorNr As Long
'Datei testweise öffnen:
On Error Resume Next
FileNr = FreeFile
Open Path For Input Lock Write As #FileNr
ErrorNr = Err.Number
Close #FileNr
On Error GoTo 0
'Ggf. Fehler verarbeiten:
Select Case ErrorNr
Case 0 'kein Fehler:
'NOP
Case 70 'Permission denied':
IsFileOpen = True
Case Else 'sonstiger Fehler:
Err.Raise ErrorNr
End Select
End Function
Danke für die Hilfe
Grüße
Mirko
Hallo Zusammen,
befindet sich die offene Datei im One-Drive, erhalte ich folgende Fehlermeldung:
432 Datei- oder Klassename während Automatisierungsoperation nicht gefunden
Den One Drive Speicherort wandelt mir Excel um in eine lokale Adresse, dass funktioniert soweit.
Die Abfrage, ob die Datei offen oder geschlossen ist, funktioniert ebenso.
Das Programm bleibt hier hängen:
Set oWB = GetObject(pfad & Dateiname)
oWB.Close savechanges:=False
Hat jemand einen Rat?
Danke
Grüße
Mirko