Dave fragt sich, ob er das Schließen einer Arbeitsmappe nach einer bestimmten Zeit erzwingen kann, sofern sie derzeit nicht verwendet wird. In seinem Büro öffnen Mitarbeiter Arbeitsmappen, die sich auf dem Server befinden, und vergessen dann, dass sie geöffnet sind. In diesem Fall kann niemand anderes sie bearbeiten. Daher möchte er das Schließen von Arbeitsmappen erzwingen, wenn diese 60 Minuten lang unbeaufsichtigt bleiben.

Es ist möglich, dies mithilfe von Makros zu tun, aber Sie möchten dies möglicherweise nicht wirklich aus geschäftlicher oder benutzerorientierter Sicht tun. Angenommen, ein Benutzer hat drei Arbeitsmappen auf seinem System geöffnet, damit Vergleiche zwischen ihnen durchgeführt werden können. Es ist möglich, „gefesselt“ zu werden

mit zwei der Arbeitsmappen für eine Weile, wobei die dritte diejenige ist, die ein Herunterfahren auslöst. Wenn Ihr VBA-Code nicht richtig geschrieben ist, wird er möglicherweise heruntergefahren, je nachdem, welche Arbeitsmappe sich gerade befindet – ein Ergebnis, das Sie nicht möchten.

Was machen Sie mit nicht gespeicherten Änderungen beim Schließen? Wenn Sie sie speichern, stoßen Sie auf das Problem, dass der Benutzer sie möglicherweise nicht speichern wollte. Wenn Sie sie nicht speichern, tritt das umgekehrte Problem auf – möglicherweise mussten viele Daten gespeichert werden. Sie können beim Abschlussvorgang nicht fragen, ob Informationen gespeichert werden sollen. das würde die Arbeitsmappe so sicher zusammenhalten wie offen (und unbenutzt).

Eine mögliche Lösung besteht darin, die Arbeitsmappe einfach freizugeben oder gemeinsam zu erstellen (Excel 2019 und Excel in Office 365). Wenn Sie die Freigabe oder das Co-Authoring aktivieren (wie in anderen ExcelTips beschrieben), können mehrere Personen dieselbe Arbeitsmappe gleichzeitig öffnen. Wenn eine dieser Personen es offen lässt, ist niemand anderes belästigt, da sie es weiterhin öffnen und optional Änderungen in der Arbeitsmappe vornehmen können.

Wenn Sie sich für die makrobasierte Route entscheiden, ist die Lösung recht einfach. Sie benötigen eine Art Timer-Struktur (die mithilfe der OnTime-Methode einfach implementiert werden kann) und eine Möglichkeit, um zu überprüfen, ob jemand etwas in der Arbeitsmappe tut.

Fügen Sie zunächst einem Standardmakromodul den folgenden Code hinzu. Beachten Sie, dass drei Routinen hinzugefügt werden müssen:

Dim DownTime As Date

Sub SetTimer()

DownTime = Now + TimeValue("01:00:00")

Application.OnTime EarliestTime:=DownTime, _       Procedure: = "ShutDown", Schedule:=True End Sub
Sub StopTimer()

On Error Resume Next     Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=False  End Sub
Sub ShutDown()

Application.DisplayAlerts = False     With ThisWorkbook         .Saved = True         .Close     End With End Sub

Diese drei Routinen sind ziemlich einfach. Die ersten beiden schalten jeweils den Timer ein und aus. Beachten Sie, dass diese Routinen die DownTime-Variable verwenden, die außerhalb einer der Routinen deklariert ist. Auf diese Weise kann sein Inhalt in mehreren Routinen verwendet werden.

Die dritte Routine, ShutDown, schließt die Arbeitsmappe tatsächlich. Es wird nur aufgerufen, wenn die OnTime-Methode nach einer Stunde abläuft. Die Arbeitsmappe wird geschlossen, ohne dass vorgenommene Änderungen gespeichert werden.

Die nächsten Routinen (es gibt vier davon) müssen dem ThisWorkbook-Objekt hinzugefügt werden. Öffnen Sie den VBA-Editor und doppelklicken Sie im Projektexplorer auf das ThisWorkbook-Objekt. Platzieren Sie im Codefenster, das Excel öffnet, die folgenden Routinen:

Private Sub Workbook_Open()

Call SetTimer End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Call StopTimer End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

Call StopTimer     Call SetTimer End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _   ByVal Target As Excel.Range)

Call StopTimer     Call SetTimer End Sub

Die ersten beiden Routinen werden ausgelöst, wenn die Arbeitsmappe geöffnet und geschlossen wird. Sie starten den Timer und schalten ihn aus. Die beiden anderen Routinen werden automatisch ausgeführt, wenn ein Arbeitsblatt neu berechnet wird oder wenn jemand eine Auswahl in der Arbeitsmappe trifft. Beides sind gute Indikatoren dafür, dass jemand die Arbeitsmappe verwendet (sie ist nicht inaktiv geöffnet). Sie stoppen den Timer und starten ihn dann neu, sodass der einstündige Countdown von vorne beginnt.

Die Verwendung einer Reihe von Makros wie diesen hat einen Nachteil: Sie eliminieren effektiv die Rückgängig-Funktion von Excel. Wenn ein Makro ausgeführt wird, wird der Rückgängig-Stapel automatisch von Excel gelöscht. Da Makros bei jeder in der Arbeitsmappe vorgenommenen Änderung ausgeführt werden, können die Änderungen der Person nicht rückgängig gemacht werden. (Es gibt keine Möglichkeit, diesen Nachteil zu umgehen.)

Ein weiteres Problem besteht darin, dass Makros nur in makrofähigen Arbeitsmappen gespeichert werden können. Daher funktioniert die makrobasierte Lösung nicht für normale XLSX-Dateien, da sie keine Makros in ihnen zulassen. In diesem Fall sind Sie auf Nicht-Makro-Lösungen beschränkt, z. B. das Aktivieren der Freigabe von Arbeitsmappen oder das Co-Authoring.

_Hinweis: _

Wenn Sie wissen möchten, wie die auf dieser Seite (oder auf einer anderen Seite der ExcelTips-Websites) beschriebenen Makros verwendet werden, habe ich eine spezielle Seite vorbereitet, die hilfreiche Informationen enthält.

ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.

Dieser Tipp (8192) gilt für Microsoft Excel 2007, 2010, 2013, 2016, 2019 und Excel in Office 365. Eine Version dieses Tippes für die ältere Menüoberfläche von Excel finden Sie hier: