Bedenken Sie beim automatischen Öffnen von Excel-Arbeitsmappen, was passieren kann, wenn Sie versuchen, ein bereits geöffnetes Buch zu öffnen. In der Nicht-VBA-Welt versucht Excel, die Datei erneut zu öffnen, wobei die Warnmeldung angezeigt wird, dass alle nicht gespeicherten Änderungen verloren gehen. Sie können sich vor einem solchen Ereignis schützen, indem Sie prüfen, ob eine bestimmte Datei bereits geöffnet ist, bevor Sie versuchen, sie erneut zu öffnen.

Vermeiden Sie diese Warnmeldung.
So funktioniert das Makro
Das erste, was bei diesem Makro auffällt, ist, dass es sich um eine Funktion und nicht um eine Sub-Prozedur handelt. Wie Sie sehen werden, können Sie dieses Makro zu einer Funktion machen, um ihm einen beliebigen Dateinamen zu übergeben, um zu testen, ob diese Datei bereits geöffnet ist.
Der Kern dieses Codes ist einfach. Sie testen einen bestimmten Dateinamen, um zu sehen, ob er einer Object-Variablen zugewiesen werden kann. Nur geöffnete Arbeitsmappen können einer Objektvariablen zugewiesen werden. Wenn Sie versuchen, der Variablen eine geschlossene Arbeitsmappe zuzuweisen, tritt ein Fehler auf.
Wenn die angegebene Arbeitsmappe zugewiesen werden kann, ist die Arbeitsmappe geöffnet; Tritt ein Fehler auf, wird die Arbeitsmappe geschlossen.
Funktion FileIsOpenTest(TargetWorkbook As String) As Boolean
'Schritt 1: Deklarieren Sie Ihre Variablen
Dim TestBook als Arbeitsbuch
'Schritt 2: Excel anweisen, bei einem Fehler fortzufahren
Bei Fehler Fortsetzen als nächstes
'Schritt 3: Versuchen Sie, die Zielarbeitsmappe TestBook zuzuweisen
Set TestBook = Workbooks(TargetWorkbook)
'Schritt 4: Wenn kein Fehler aufgetreten ist, ist die Arbeitsmappe bereits geöffnet
Wenn Err.Number = 0 Dann
FileIsOpenTest = True
Anders
FileIsOpenTest = False
Ende Wenn
Endfunktion
Als erstes deklariert das Makro eine String-Variable, die den vom Benutzer gewählten Dateinamen enthält. TestBook ist der Name Ihrer String-Variablen.
In Schritt 2 teilen Sie Excel mit, dass beim Ausführen dieses Codes möglicherweise ein Fehler aufgetreten ist, und setzen Sie den Code im Fehlerfall fort. Ohne diese Zeile würde der Code einfach anhalten, wenn ein Fehler auftritt. Auch hier testen Sie einen gegebenen Dateinamen, um zu sehen, ob er einer Object-Variablen zugewiesen werden kann. Wenn die angegebene Arbeitsmappe zugewiesen werden kann, ist sie geöffnet; Wenn ein Fehler auftritt, wird es geschlossen.
In Schritt 3 versuchen Sie, die angegebene Arbeitsmappe der TestBook-Objektvariablen zuzuweisen. Die Arbeitsmappe, die Sie zuweisen möchten, ist eine String-Variable namens TargetWorkbook. TargetWorkbook wird in den Funktionsdeklarationen an die Funktion übergeben (siehe die erste Zeile des Codes). Durch diese Struktur entfällt die Notwendigkeit, einen Arbeitsmappennamen fest zu codieren, sodass Sie ihn stattdessen als Variable übergeben können.
In Schritt 4 prüfen Sie einfach, ob ein Fehler aufgetreten ist. Wenn kein Fehler aufgetreten ist, ist die Arbeitsmappe geöffnet, sodass Sie FileIsOpenTest auf True setzen. Wenn ein Fehler aufgetreten ist, ist die Arbeitsmappe nicht geöffnet und Sie legen FileIsOpenTest auf False fest.
Auch hier kann diese Funktion verwendet werden, um jede Datei auszuwerten, die Sie über ihr TargetWorkbook-Argument an sie übergeben. Das ist das Schöne daran, das Makro in eine Funktion zu packen.
Das folgende Makro veranschaulicht, wie diese Funktion implementiert wird. Hier rufen Sie die neue Funktion FileIsOpenTest auf, um sicherzustellen, dass der Benutzer eine bereits geöffnete Datei nicht öffnen kann:
Untermakro1()
'Schritt 1: Definiere eine String-Variable
Dim FName als Variante
Dim FNFileOnly As String
'Schritt 2: GetOpenFilename-Methode aktiviert Dialogfeld
FName = Application.GetOpenFilename(_
FileFilter:="Excel-Arbeitsmappen,*.xl*", _
Title:="Wählen Sie eine Arbeitsmappe zum Öffnen", _
Mehrfachauswahl:=Falsch)
'Schritt 3: Öffnen Sie die ausgewählte Datei, falls sie noch nicht geöffnet ist
Wenn FName <> False Then
FNFileOnly = StrReverse(Links(StrReverse(FName), _
InStr(StrReverse(FName), ") - 1))