Home > Artikel > Ausgabe 5/2018 > Formulare per VBA referenzieren

Formulare per VBA referenzieren

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).

Wenn Sie Formulare und Steuerelemente programmieren wollen, müssen Sie wissen, wie Sie diese referenzieren. Nicht immer geschieht dies vom Klassenmodul des Formulars selbst aus – manchmal wollen Sie vielleicht auch von anderen Formularen auf die Steuer­elemente eines anderen Formulars zugreifen oder auch von einer VBA-Prozedur in eine Standardmodul. Dieser Artikel zeigt, wie Sie von verschiedenen Orten aus auf die Formulare zugreifen können. In weiteren Artikeln betrachten wir dann etwa den Zugriff auf die darin enthaltenen Steuer­elemente.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1803_FormsControlsVBARead.accdb.

Innerhalb des Formulars

Wenn Sie ein Formular erstellen und diesem ein Klassenmodul zuweisen, das sogenannte Code behind-Modul, dann können Sie von diesem aus auf andere Weise auf die Elemente des Formulars zugreifen als dies etwa von einem anderen Formular oder auch von einem Standardmodul aus möglich ist.

Hier steht nämlich das Me-Schlüsselwort für den Zugriff auf die Objektvariable des aktuellen Formulars zur Verfügung. Zur Verdeutlichung legen Sie einfach einmal ein neues Formular in einer leeren Datenbank an und speichern dieses unter dem Namen frmBeispiel.

Diesem fügen wir nun eine Schaltfläche hinzu, die wir mit der Beschriftung Name anzeigen und dem Namen cmdNameAnzeigen versehen und für die wir eine neue Ereignisprozedur für das Ereignis Beim Klicken anlegen (siehe Bild 1).

Hinzufügen einer Ereignisprozedur für eine Schaltfläche

Bild 1: Hinzufügen einer Ereignisprozedur für eine Schaltfläche

Der Ereignisprozedur fügen wir nun eine Anweisung hinzu, die den Namen des Formulars in einem Meldungsfenster ausgeben soll:

Private Sub cmdNameAnzeigen_Click()

MsgBox Me.Name

End Sub

Das hier wie selbstverständlich verwendete Schlüsselwort Me ist eine sehr praktische Vereinfachung für den Zugriff auf die Elemente des Formulars, auf das sich das Klassenmodul bezieht.

Mit diesem Schlüsselwort können Sie auf alle Eigenschaften und Methoden des Formulars zugreifen und auch auf die darin angelegten Steuer­elemente – darauf gehen wir später ein.

Von außen

Wie aber greifen wir denn eigentlich von außen auf dieses Formular zu? Dazu müssen wir erst einmal wissen, ob das Formular geöffnet ist. Greifen wir auf ein Formular zu, das nicht geöffnet ist, erhalten wir einen Laufzeitfehler.

Um dies auszuprobieren, fügen Sie der Beispieldatenbank ein Standardmodul namens mdlFormularzugriff hinzu. Hier legen Sie die folgende Prozedur an:

Public Sub NameAnzeigen()

MsgBox Forms!frmBeispiel.Name

End Sub

Die Prozedur erledigt nichts anders als die im Formular für die Schaltfläche cmdNameAnzeigen – Sie gibt ein Meldungsfenster mit dem Namen des Formulars aus.

Allerdings wissen wir, wenn wir auf die Schaltfläche des Formulars klicken, dass dieses logischerweise gerade geöffnet ist und brauchen dies nicht zu prüfen. Beim Zugriff von außen müssen wir dies jedoch vorher absichern. Rufen Sie die obige Prozedur auf, nachdem Sie das Formular geschlossen haben, löst dies den Fehler aus Bild 2 aus.

Fehler beim Zugriff auf ein nicht geöffnetes Formular

Bild 2: Fehler beim Zugriff auf ein nicht geöffnetes Formular

Prüfen, ob ein Formular geöffnet ist

Für die Prüfung, ob ein Formular geöffnet ist, hat sich die folgende Funktion etabliert. Sie erwartet den Namen des zu untersuchenden Formulars als Parameter. Sie nutzt die SysCmd-Funktion, der sie die Konstante acSysCmdGetObjectState, den Objekttyp undd den Namen des Formulars übergibt. Wenn das Ergebnis größer als 0 ist, ist das Formular geöffnet:

Public Function IstFormularGeoeffnet(strFormular As String) As Boolean

IstFormularGeoeffnet = SysCmd( acSysCmdGetObjectState, acForm, strFormular) > 0

End Function

Mit dieser Funktion können wir bei Zugriff von außen leicht prüfen, ob das Formular geöffnet ist. Die obige Prozedur erweitern wir dabei wie folgt:

Public Sub NameAnzeigen()

If IstFormularGeoeffnet("frmBeispiel") Then

MsgBox Forms!frmBeispiel.Name

Else

MsgBox "Das Formular ist nicht geöffnet."

End If

End Sub

Wenn das Formular nicht geöffnet ist, weist die Prozedur per Meldungsfenster auf diesen Zustand hin.

Auf das aktuelle Formular zugreifen

In manchen Fällen möchten Sie auch einfach auf das aktuell geöffnete Formular zugreifen, um beispielsweise dessen Namen zu ermitteln. Hierfür stellt Microsoft eine Klasse mit verschiedenen Eigenschaften bereit. Diese heißt Screen und liefert beispielsweise über die Eigenschaft ActiveForm Zugriff auf das aktuell aktive Formular. Die folgende Prozedur gibt beispielsweise den Namen des aktuellen Formulars aus:

Public Sub AktuellesFormular()

MsgBox Screen.ActiveForm.Name

End Sub

Wenn Sie diese Prozedur ausführen und es ist kein Formular geöffnet, erhalten Sie wiederum eine Fehlermeldung – diesmal die aus Bild 3. Dieser Fehler kann übrigens auch dann auftreten, wenn ein Formular geöffnet ist! Die ActiveForm-Eigenschaft ermittelt nämlich tatsächlich nur das aktive Formular, wenn es sich bei dem aktuell im Access-Fenster aktiven Element um ein Formular handelt. Wenn gerade eine Tabelle und ein Formular angezeigt werden, aber die Tabelle den Fokus hat, erhalten Sie den gleichen Fehler, als wenn gar kein Formular geöffnet ist.

Weiterer Fehler beim Zugriff auf ein nicht geöffnetes Formular

Bild 3: Weiterer Fehler beim Zugriff auf ein nicht geöffnetes Formular

In diesem Fall gibt es keine geeignete Funktion, um zu prüfen, ob es sich bei dem Objekt, das aktuell den Fokus besitzt, um ein Formular handelt. Wir können hier lediglich unter Deaktivierung der eingebauten Fehlerbehandlung prüfen, ob es sich um ein Formular handelt.

Diese Prüfung können wir allerdings wieder in einer eigenen Funktion unterbringen, die dann wie folgt aussieht. Die Funktion deaktiviert die Fehlerbehandlung und ermittelt dann die Länge des Namens des aktiven Formulars. Diese vergleicht sie mit dem Wert 0 und schreibt das Ergebnis in die Variable bolFormularAktiv. Ist ein Formular aktiv, liefert dies den Wert True. Falls nicht, wird ein Fehler ausgelöst, den die zuvor deaktivierte Fehlerbehandlung allerdings unterdrückt. Der Wert von bolFormularAktiv bleibt dann False:

Public Function FormularAktiv()

Dim bolFormularAktiv As Boolean

On Error Resume Next

bolFormularAktiv = Len(Screen.ActiveForm.Name) > 0

On Error GoTo 0

FormularAktiv = bolFormularAktiv

End Function

Diese Funktion setzen wir dann wie folgt ein:

Public Sub AktuellesFormular()

If FormularAktiv Then

MsgBox Screen.ActiveForm.Name

Else

MsgBox "Kein Formular aktiv."

End If

End Sub

Geöffnete Formular ermitteln

Ob das Access-Fenster überhaupt Formulare anzeigt, ermitteln wir beispielsweise mit der Forms-Auflistung. Diese enthält eine Auflistung aller aktuell geöffneten Formular im Access-Fenster, also auch diejenigen, die in der Entwurfsansicht geöffnet sind. Die Anzahl der geöffneten Formular geben Sie wie folgt aus:

Public Sub AnzahlGeoeffneterFormulare()

MsgBox "Es sind " & Forms.Count & " Formulare geöffnet."

End Sub

Formulare ausgeben

Nachdem wir schon die Anzahl der Formulare kennen, wollen wir auch die Namen der Formulare ausgeben. Dazu nutzen wir erneut die Auflistung Forms. Diesmal deklarieren wir zuvor eine Objektvariable namens frm mit dem Datentyp Form.

Mit dieser durchlaufen wir in einer For Each-Schleife alle Elemente der Forms-Auflistung und geben die Namen im Direktbereich des VBA-Editors aus:

Public Sub FormulareAusgeben()

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!