Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

zweite Excel Datei schließen bei aktiver Userform

Begonnen von Blaupunkt79, Februar 13, 2024, 09:34:58

⏪ vorheriges - nächstes ⏩

Blaupunkt79

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

PhilS

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.


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

Prüfen, ob Datei bereits geöffnet ist

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
Mit freundlichem Glück Auf!

Eberhard

PhilS

#3
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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Blaupunkt79

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

Blaupunkt79

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