Home > Artikel > Ausgabe 6/2014 > Datenbankereignis beim Schließen

Datenbankereignis beim Schließen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Access bietet die Möglichkeit, beim Start ein Makro namens AutoExec auszuführen oder ein als Startformular angegebenes Startformular anzuzeigen. Damit lassen sich gleich bei Start notwendige Aktionen durchführen. Beim Schließen einer Datenbank sieht es anders aus: Hier stellt Microsoft keine eingebaute Möglichkeit bereit, um abschließende Arbeiten durchzuführen. Dazu gehört beispielsweise das Speichern von während der Benutzung geänderten Konfigurationsdaten. Dieser Artikel zeigt, wie Sie diese Funktion nachrüsten.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1406_DatenbankereignisBeimSchliessen.mdb.

Dass beim Öffnen einer Datenbank Aktionen ausgeführt werden, ist selbstverständlich. Aber manchmal ist es auch nötig, das Schließen einer Datenbank abzufangen – und wenn Sie auch nur aus irgendeinem Grund fragen möchten: Wollen Sie die Anwendung wirklich beenden?

Vielleicht haben Sie aber auch einen besseren Grund – beispielsweise könnten Sie so Informationen, die Sie während der Anwendung in globalen Variablen oder in TempVars speichern, um nicht ständig auf die Optionentabelle zugreifen zu müssen, wieder zurückschreiben.

Wie auch immer: Zunächst einmal müssen herausfinden, wie man den Zeitpunkt des Schließens der Anwendung ermittelt. Tatsache ist nämlich, dass Access keine solche Funktion wie etwa beim Starten einer Anwendung bereitstellt.

AutoClose über Umwege

Da es keine eingebaute Möglichkeit gibt, prüfen wir einmal, welchen Weg wir wählen können. Gibt es überhaupt andere Ereignisse, die man etwa mit dem Access-Anwendungsobjekt assoziieren könnte? Also so etwas wie Access_Close? Nein: Access bietet keine solchen Möglichkeiten.

Aber wer sagt denn, dass wir uns in diesem Fall an Access selbst halten müssen? Vielleicht löst Access ja ein Ereignis eines anderen Objekts aus, wenn man es schließt ... und das ist unser Ansatzpunkt: Wenn beispielsweise bei Schließen von Access noch ein Formular geöffnet ist, dass wird dieses natürlich auch geschlossen. Außer, Sie haben Änderungen am Entwurf vorgenommen – dann fragt Access noch, ob Sie die Änderungen speichern wollen. Wir wollen uns aber ohnehin eher auf die Ereignisse konzentrieren, und dort bieten Formulare beim Schließen gleich mehrere Ereignisse, zum Beispiel

  • Beim Schließen und
  • Beim Entladen.

Legen wir also für beide Ereignisse testweise je eine Ereignisprozedur an, indem wir die entsprechenden Eigenschaften Beim Schließen und Beim Entladen auf [Ereignisprozedur] einstellen und dann auf die Schaltfläche mit den drei Punkten auf der rechten Seite klicken (siehe Bild 1).

Ereignisse anlegen, die beim Schließen eines Formulars ausgelöst werden

Bild 1: Ereignisse anlegen, die beim Schließen eines Formulars ausgelöst werden

Zunächst wollen wir testen, in welcher Reihenfolge die beiden Ereignisse ausgelöst werden. Dazu legen Sie für beide Prozeduren je einen Haltepunkt im VBA-Editor fest (Sie können auch Meldungsfenster einfügen, wenn Sie möchten). Dann öffnen Sie das Formular in der Formularansicht und schließen es. Schnell wird deutlich, dass Beim Entladen zuerst aufgerufen wird, erst dann folgt Beim Schließen (siehe Bild 2).

Haltepunkte der beiden beim Schließen ausgelösten Prozeduren im Test

Bild 2: Haltepunkte der beiden beim Schließen ausgelösten Prozeduren im Test

Wenn wir uns die beiden Ereignisse ansehen, fällt ein für unsere Anforderungen gravierender Unterschied auf: Die Ereignisprozedur Form_Unload (Beim Entladen) besitzt einen Parameter namens Cancel. Wenn Sie diesen auf True einstellen, wird das Schließen des Formulars abgebrochen! Das ist wichtig für unser Vorhaben, wenn wir die Möglichkeit haben wollen, das Schließen der Anwendung zu verhindern.

Probieren wir dies aus, indem wir die die Prozedur wie in Listing 1 erweitern. Beim Schließen des Formulars erscheint das entsprechende Meldungsfenster. Wenn Sie dort auf Abbrechen klicken, wird das Formular nicht geschlossen. Klicken Sie auf OK, wird der Vorgang wie üblich mit dem Schließen des Formulars abgeschlossen. Damit steht nun fest, welches Ereignis uns in diesem Fall hilft.

Private Sub Form_Unload(Cancel As Integer)

     If MsgBox("Wirklich schließen?", vbYesNo) = vbNo Then

         Cancel = True

     End If

End Sub

Listing 1: Diese Prozedur wird beim Schließen des Formulars ausgelöst.

Aber funktioniert dies auch, wenn wir nicht das Formular schließen, sondern die Anwendung – wobei das Formular natürlich geöffnet sein muss? Probieren wir es aus, stellen wir schnell fest, dass auch dies gelingt. Nun haben wir nur noch ein Problem: Wir müssen dafür sorgen, dass das Formular gleich beim Öffnen der Anwendung geöffnet wird und dass der Benutzer es während der Arbeit mit der Anwendung nicht schließen kann. Dies stellen wir am einfachsen sicher, indem wir das Formular einfach unsichtbar machen!

Sicherungsformular beim Start öffnen

Also legen wir einen Mechanismus an, der das Formular bei Öffnen der Anwendung gleich mit öffnet – und dieses möglichst direkt unsichtbar schaltet. Das gelingt auf eine der folgenden Arten:

  • Indem wir das Formular als Startformular festlegen und das Formular mit einem entsprechenden Ereignis bei Öffnen direkt unsichtbar machen,
  • indem wir das Formular von dem standardmäßig beim Starten geöffneten Startformular unsichtbar öffnen lassen oder
  • indem wir das Formular über das AutoExec-Makro öffnen – ebenfalls unsichtbar.

Formular beim Öffnen unsichtbar machen

Eigentlich können wir für alle drei Varianten eine Vorgehensweise definieren, um das Formular unsichtbar zu machen – wir werden diese aber nicht für alle Varianten nutzen. Formulare haben die Eigenschaft Visible, die Sie auf den Wert False einstellen können, um das Formular auszublenden. Diese sollten wir eigentlich in einer der Ereignisprozeduren, die beim Öffnen des Formulars ausgeführt werden, nutzen können. Also legen wir direkt eine Ereignisprozedur für das Ereignis Beim Öffnen des Formulars an. Diese sieht wie folgt aus:

Private Sub Form_Open(Cancel As Integer)

Me.Visible = False

End Sub

Der erste Test verläuft allerdings wenig vielversprechend: Das Formular bleibt schlicht sichtbar. Funktioniert die Visible-Eigenschaft vielleicht gar nicht? Probieren wir dies doch mit der folgenden Anweisung im Direktbereich aus:

Forms!frmStart.Visible = False

Und siehe da: Das Formular verschwindet. Woran liegt es also, dass dies in der Ereignisprozedur Form_Open nicht gelingt (und in der Ereignisprozedur Form_Load, die durch das Ereignis Beim Laden ausgelöst wird, übrigens auch nicht)?

Um dies herauszufinden, legen wir wieder zwei Haltepunkte für die betroffenen Ereignisprozeduren an und öffnen dann das Formular über den Navigationsbereich. Wenn der erste Haltepunkt erreicht ist, können Sie die einzelnen Anweisungen mit der Taste F8 einzeln durchlaufen (siehe Bild 3). Der Grund, warum das Formular durch Me.Visible = False nicht ausgeblendet ist, liegt offenbar darin, dass es noch gar nicht sichtbar ist! Sprich: Es wird erst später überhaupt eingeblendet, sodass ein vorheriges Ausblenden keinen Sinn ergibt.

Prüfen, warum das Formular nicht ausgeblendet wird

Bild 3: Prüfen, warum das Formular nicht ausgeblendet wird

Um dies vorwegzunehmen: Es funktioniert auch nicht mit einer der übrigen Ereignisse, die beim Öffnen des Formulars ausgelöst werden (Bei Aktivierung, Bei Fokuserhalt, Bei Größenänderung). Die einzige Möglichkeit, die bleibt, ist der Zeitgeber. Dazu stellen legen Sie für die Eigenschaft Bei Zeitgeber den Wert [Ereigniseigenschaft] an und hinterlegen dafür die folgende Ereignisprozedur:

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!