VBA-Programmierung mit Klassen
Klassen in MS Office: Formulare in Access
Klassen in MS Office: Formulare in Access
Auf dieser Seite
Mit Bild
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.
Mit Bild
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.
Mit Bild
Formulare sind Klassen(-objekte)
Mit Bild
Mit Bild
Erstellen Sie zu Testzwecken ein Formular frmMehrfachaufruf ohne Datenbindung. Auf seinen Detailbereich legen Sie ein Bezeichnungsfeld namens lblStartzeit mit einer beliebigen Beschriftungs-Eigenschaft.
Mit Bild
Der Formular-Entwurf sieht jetzt so aus wie im folgenden Bild:
Mit Bild
Der Entwurf des Testformulars
Mit Bild
Mit Bild
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:
Mit Bild
Sub ZeigeFormular() DoCmd.OpenForm "frmMehrfachaufruf" End Sub
Mit Bild
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:
Mit Bild
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
Mit Bild
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.
Mit Bild
Die zwei Instanzen des Testformulars
Mit Bild
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:
Mit Bild
Private Sub Form_Load() Me.lblStartzeit.Caption = "Startzeit: " & Time() End Sub
Mit Bild
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:
Mit Bild
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
Mit Bild
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:
Mit Bild
Die zwei Testformulare mit unterschiedlichen Inhalten
Mit Bild