VBA-Programmierung mit Klassen

Klassen in MS Office: Formulare in Access

∅ 4 / 1 Bewertungen

Klassen in MS Office: Formulare in Access

Auf dieser Seite

Es ist Ihnen möglicherweise noch nicht aufgefallen, aber Sie hatten in Office schon längst mit Klassen zu tun: Formulare und Berichte in Access sind ebenso Klassen wie UserForms in den übrigen Office-Programmen.

Das ist im VBA-Editor links oben im Projekt-Explorer-Fenster schon zu sehen, weil die Module beispielsweise von Formularen und Berichten in der Gruppe Microsoft Office Access Klassenobjekte zusammengefasst werden. Tatsächlich ist der Formularentwurf das grafische Interface (Oberfläche) der Formularklasse und sein Modul das Programmierinterface.

56893_klassen11.png

Formulare sind Klassen(-objekte)

Erstellen Sie zu Testzwecken ein Formular frmMehrfachaufruf ohne Datenbindung. Auf seinen Detailbereich legen Sie ein Bezeichnungsfeld namens lblStartzeit mit einer beliebigen Beschriftungs-Eigenschaft.

Der Formular-Entwurf sieht jetzt so aus wie im folgenden Bild:

56889_klassen08.png

Der Entwurf des Testformulars

Die Anzeige eines Formulars erzeugt genau eine Instanz (also das "Stempel-Abbild") der Klasse, egal ob direkt aus dem Navigationsbereich per Doppelklick oder per VBA gestartet. Der übliche Befehl in einem normalen Modul dazu liest sich so:

Sub ZeigeFormular()
	DoCmd.OpenForm "frmMehrfachaufruf"
End Sub

Allerdings können Sie diese Anweisung DoCmd.OpenForm so oft aufrufen, wie Sie möchten, es wird immer nur das selbe Formular geöffnet. Da sich damit nicht mehrere Instanzen parallel anzeigen lassen, fühlen sich Formulare auch nicht wie Klassen an. Das Problem liegt in der VBA-Anweisung. Also muss sich daran etwas ändern:

Damit das Formular als Klasse erkannt wird, müssen Sie die Enthält Modul-Eigenschaft auf Ja stellen, sonst ist es nicht mit dem folgenden Code ansprechbar. Schreiben Sie, wiederum in einem normalen Modul, die Deklaration der Klasse genau so, wie Sie es oben schon für Klassen ohne Oberfläche gesehen haben:

Option Explicit

Dim m_frmEins As Form_frmMehrfachaufruf
Dim m_frmZwei As Form_frmMehrfachaufruf

Sub Formularzwilling()
	Set m_frmEins = New Form_frmMehrfachaufruf
	Set m_frmZwei = New Form_frmMehrfachaufruf

	m_frmEins.Visible = True
	m_frmZwei.Visible = True
End Sub

Beachten Sie vor allem, dass die beiden m_frm...-Variablen Modul-öffentlich sind. Sonst machen Sie nämlich die frustrierende Erfahrung: Es ist nichts zu sehen. Lokale Variablen würden nämlich mit dem End Sub zerstört, was auch das darin enthaltene Formular so schnell wieder schließt, dass Sie es nicht sehen.

Bevor Sie diese Prozedur aufrufen, müssen Sie allerdings den Formularentwurf schließen, weil das sonst einen Laufzeitfehler auslöst.

56890_klassen09.png

Die zwei Instanzen des Testformulars

Sie meinen, da sei nur ein Formular erschienen? Die beiden Formulare liegen deckungsgleich aufeinander. Sie müssen sie also auseinanderziehen. Das soll daher jetzt konzeptionell ein wenig verbessert werden:

Zur besseren Unterscheidung soll das Formular in lblStartzeit die Uhrzeit des Erscheinens anzeigen. Wenn die Formular-Instanzen mit wenigstens einer Sekunde Abstand gestartet werden, sind sie schon an der Uhrzeit zu unterscheiden. Daher soll auch der Aufruf nicht mehr mit einer einzigen Prozedur erfolgen.

Zeigen Sie in der Entwurfsansicht des Formulars das Eigenschaftenblatt an und wählen Sie dort in der Auswahlliste ganz oben das Formular aus. In der Eigenschaften-Registerkarte Ereignis wählen Sie für die Bei Laden-Eigenschaft den Eintrag [Ereignisprozedur] aus und klicken dann auf die Schaltfläche mit den drei Pünktchen.

Sie befinden sich jetzt im Formularmodul, welches wie jedes andere Modul bedient wird. Ergänzen Sie den schon vorhandenen Formularrumpf mit diesem Code:

Private Sub Form_Load()
	Me.lblStartzeit.Caption = "Startzeit: " & Time()
End Sub

Dann können Sie das Formular speichern und dessen Entwurfsansicht schließen. Machen Sie danach aus der bisherigen Prozedur Formularzwilling zwei eigene Prozeduren wie folgt:

Sub FormularEins()
	Set m_frmEins = New Form_frmMehrfachaufruf
	m_frmEins.Visible = True
End Sub

Sub FormularZwei()
	Set m_frmZwei = New Form_frmMehrfachaufruf
	m_frmZwei.Visible = True
End Sub

Starten Sie diese nun nacheinander mit wenigstens einer Sekunde Abstand. Anhand der angezeigten Startzeit auf dem Formular können Sie erkennen, dass es sich tatsächlich um unterschiedliche Formulare handelt und diese eigene Inhalte haben:

56891_klassen10.png

Die zwei Testformulare mit unterschiedlichen Inhalten