Home > Artikel > Ausgabe 6/2014 > Von Formular zu Formular mit OpenArgs

Von Formular zu Formular mit OpenArgs

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

Formulare zeigen üblicherweise die Daten aus Tabellen oder Abfragen an. Beim Aufruf von einem anderen Formular teilt man gegebenenfalls mit, welcher Datensatz angezeigt werden soll. In manchen Fällen ist es aber nötig, weitere Daten zu übergeben oder auch Daten von einem geöffneten Formular auszulesen. Wie dies in den verschiedenen Konstellationen gelingt, zeigt der vorliegende Artikel.

Beispieldatenbank

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

Wert an Steuerelement übergeben

Im ersten Beispiel wollen wir einfach einen Wert in ein Textfeld in ein erstes Formular eingeben und diesen Wert per Schaltfläche in ein Textfeld eines anderen Formulars übertragen. Die Protagonisten dieses Beispiels heißen frm1 und frm2 (siehe Bild 1).

Übergeben eines Wertes von einem Formular zum nächsten

Bild 1: Übergeben eines Wertes von einem Formular zum nächsten

frm1 enthält ein Textfeld namens txtZuUebergeben und eine Schaltfläche namens cmdWertUebergeben, frm2 enthält ein Textfeld namens txtUebergebenerWert.

Damit die Schaltfläche beim Anklicken die gewünschte Ereignisprozedur ausführt, wählen Sie für die Ereigniseigenschaft Beim Klicken des Steuerelements den Eintrag [Ereignisprozedur] aus und klicken dann auf die Schaltfläche rechts von der Eigenschaft. Es erscheint die leere Ereignisprozedur im VBA-Editor, die Sie wie in Listing 1 ergänzen. Die einzige Anweisung liest den Wert des Textfeldes txtZuUebergeben des Formulars frm1 aus. frm1 kann über den Ausdruck Me referenziert werden, da es sich im gleichen Formular befindet, zu dem das Klassenmodul mit dieser Prozedur gehört.

Private Sub cmdWertUebergeben_Click()

     Forms!frm2!txtUebergebenerWert = Me!txtZuUebergeben

End Sub

Listing 1: Übergeben eines Wertes zwischen zwei Formularen

Wenn Sie den Wert des Ausdrucks Me!txtZuUebergeben nun an ein Textfeld in einem anderen Formular übergeben möchten, können Sie nicht mit dem Ausdruck Me auf das Zielformular zugreifen – schließlich handelt es sich um ein anderes Formular. Also referenzieren wir dieses Formular über die Auflistung Forms und dessen Element frm2 (Forms!frm2). Das Zielsteuerelement hängen wir, durch ein weiteres Ausrufezeichen angeführt, an diesen Ausdruck an (Forms!frm2!txtUebergebenerWert). Die Zuweisung sieht nun so aus:

Forms!frm2!txtUebergebenerWert = Me!txtZuUebergeben

Es gibt noch eine ganze Menge weiterer Schreibweisen, um das Zieltextfeld zu referenzieren. Die folgende ist noch relativ einfach:

Forms("frm2")("txtUebergebenerWert")

Diese Version ist die ausführlichste:

Forms.Item("frm2").Controls.Item( "txtUebergebenerWert").Value

Hier identifizieren wir das Zielformular über die Item-Eigenschaft der Forms-Auflistung. Dieses wiederum hat eine Controls-Auflistung, die ebenfalls eine Item-Eigenschaft für den Zugriff auf das gewünschte Element bietet.

Schließlich verwenden wir die Eigenschaft Value, um auf den Wert des Steuerelements zuzugreifen. Dabei handelt es sich um die Standardeigenschaft, die Sie normalerweise nicht anzugeben müssen.

Sie können das Zielformular auch vorher mit einer Variable des Typs Form referenzieren, was den Ausdruck etwas übersichtlicher macht – hier für eine zweite Schaltfläche namens cmdWertUebergebenII hinterlegt. Die Variable heißt frmZiel und wird mit dem Verweis auf Forms!frm2 gefüllt (alternativ Forms("frm2") oder Forms.Item("frm2")):

Private Sub cmdWertUebergebenII_Click()

Dim frmZiel As Form

Set frmZiel = Forms!frm2

frmZiel!txtUebergebenerWert = Me!txtZuUebergeben

End Sub

Wert beim Öffnen übergeben

Normalerweise werden Sie den Wert gleich beim Öffnen eines Formulars vom öffnenden Formular an das geöffnete Formular übergeben wollen. Der Versuchsaufbau ist dem aus dem vorherigen Beispiel sehr ähnlich. Die Formulare heißen nun frm3 und frm4 (siehe Bild 2).

Aufruf eines Formulars mit direkter Übergabe eines Wertes

Bild 2: Aufruf eines Formulars mit direkter Übergabe eines Wertes

Der Unterschied liegt in der Zuständigkeit der verschiedenen Aufgaben. Während im ersten Beispiel der Wert innerhalb einer einzigen Anweisung von Formular zu Formular übergeben wurde, ist hier etwas mehr Aufwand erforderlich.

Die Schaltfläche cmdOeffnenUndWertUebergeben des Formulars frm3 soll diesmal das Formular frm4 öffnen und diesem gleich den entsprechenden Wert übergeben. Kein Problem, wie die Prozedur aus Listing 2 zeigt: Wir öffnen einfach das Formular frm4 mit dem Aufruf der Methode DoCmd.OpenForm mit dem Namen des zu öffnenden Formulars als Parameter, also frm4.

Private Sub cmdOeffnenUndWertUebergeben_Click()

     DoCmd.OpenForm "frm4"

     Forms!frm4!txtUebergebenerWert = Me!txtZuUebergeben

End Sub

Listing 2: Aufruf eines weiteren Formulars mit Übergabe eines Wertes

Direkt nach dieser Anweisung übergeben wir wie im vorherigen Beispiel den Wert aus dem Textfeld an das entsprechende Textfeld des aufgerufenen Formulars.

Übergabe an modalen Dialog

Nun kann es ja sein, dass Sie das Formular frm4 als modalen Dialog öffnen, damit der Benutzer zunächst die Eingaben in dieses Formular vornimmt und erst nach dem Schließen von frm4 mit der Bearbeitung in frm3 fortfahren kann.

In diesem Fall ändern wir die Parameter der DoCmd.OpenForm-Methode wie folgt:

DoCmd.OpenForm "frm4", WindowMode:=acDialog

Allerdings zeigt dies nicht die gewünschte Wirkung: Das Formular frm4 wird zwar geöffnet, das Textfeld aber nicht mit dem Wert aus dem Textfeld von frm3 gefüllt (siehe Bild 3).

Dies gelingt nicht, wenn das Formular als modaler Dialog geöffnet wird.

Bild 3: Dies gelingt nicht, wenn das Formular als modaler Dialog geöffnet wird.

Darüberhinaus tritt nach dem Schließen von frm4 auch noch ein Fehler auf (siehe Bild 4) – und zwar in der Zeile, welche die Zuweisung durchführen soll. Dies zeigt auch gleich, worin das Problem bei dieser Vorgehensweise liegt: Wenn die Prozedur das Formular frm4 mit dem Parameter WindowMode:=acDialog öffnet, wird die aufrufende Prozedur an dieser Stelle unterbrochen und erst dann fortgeführt, wenn der Benutzer das Formular frm4 wieder schließt.

Fehler nach dem Schließen des modal geöffneten Formulars

Bild 4: Fehler nach dem Schließen des modal geöffneten Formulars

In diesem Moment führt die Prozedur aus frm3 die Anweisung aus, welche das Textfeld in frm4 mit dem Wert des Textfeldes aus frm3 füllen soll. Dies führt dann zu einem Fehler, da frm4 ja gar nicht mehr vorhanden ist!

Wertübergabe per Öffnungsargument

Auch für diese Konstellation gibt es eine Lösung, die aber ein wenig aufwendiger zu programmieren ist. Sie sollten sich die notwendigen Schritte dennoch merken, denn Sie werden diese vermutlich sehr oft benötigen.

In diesem Falle ändern wir die Prozedur cmdOeffnenUndWertUebergeben erneut. Dabei entfernen wir die Anweisung, welche das Textfeld in frm4 direkt mit dem Inhalt des Textfeldes aus frm3 füllte. Dafür versehen wir die DoCmd.OpenForm-Anweisung mit einem weiteren Parameter, nämlich OpenArgs. Für diesen legen wir den Inhalt des Textfeldes als als Parameterwert fest (siehe Listing 3).

Private Sub cmdOeffnenUndWertUebergeben_Click()

     DoCmd.OpenForm "frm4", WindowMode:=acDialog, OpenArgs:=Me!txtZuUebergeben

End Sub

Listing 3: Aufruf als modaler Dialog und Übergabe eines Wertes als Öffnungsargument

Solange Sie nun am aufgerufenen Formular keine Änderungen vornehmen, tut sich dort nach dem Öffnen durch eine Klick auf die Schaltfläche cmdOeffnenUndWertUebergeben zunächst einmal nichts.

Die Änderung spielt sich eher im Hintergrund ab, denn der für den Parameter OpenArgs angegebene Wert wird im Hintergrund an das aufgerufene Formular übergeben. Abrufen können Sie diesen über die Eigenschaft OpenArgs des Formulars. Dies machen wir uns in einer Ereignisprozedur zunutze, die durch das Ereignis Beim Öffnen des Formulars frm4 ausgelöst wird. Diese legen Sie an, indem Sie das Formular frm4 in der Entwurfsansicht öffnen, für die Ereigniseigenschaft Beim Öffnen den Wert [Ereignisprozedur] auswählen und dann die Prozedur mit einem Klick auf die Schaltfläche mit den drei Punkten im VBA-Editor öffnen. Diese Prozedur ergänzen Sie nun wie in Listing 4. Sie deklariert zunächst eine Variable namens varOpenArgs. Diese füllt die Prozedur dann mit dem Wert der Eigenschaft OpenArgs des Formulars, das in diesem Fall wieder mit Me referenziert werden kann, da wir uns ja nun im Klassenmodul des Formulars frm4 befinden.

Private Sub Form_Open(Cancel As Integer)

     Dim varOpenArgs As Variant

     varOpenArgs = Me.OpenArgs

     Me!txtUebergebenerWert = varOpenArgs

End Sub

Listing 4: Entgegennahme des übergebenen Wertes vom geöffneten Formular

Auf fehlendes Öffnungsargument prüfen

Diesen Wert weisen wir dann dem Textfeld txtUebergebenerWert zu. Warum verwenden wir den Umweg über die Variable – und warum soll es überhaupt eine Variant-Variable sein? Nun: Es kann ja sein, dass ein Benutzer das Formular aufruft, ohne ein Öffnungsargument zu übergeben. Dies können Sie beispielsweise nachstellen, indem Sie das Formular frm4 einfach per Doppelklick auf den Formularnamen im Navigationsbereich öffnen. Dann ist das Öffnungsargument leer und auch das Textfeld txtUebergebenerWert wird nicht gefüllt.

Wenn Sie nun einen Anwendungsfall haben, bei dem das Vorhandensein des Öffnungsarguments zwingend nötig ist, haben Sie ein Problem. Also speichern wir den Wert kurz in einer Variablen zwischen, die wir schnell auf den enthaltenen Wert prüfen können. Im Fall eines leeren Öffnungsarguments geben Sie dann beispielsweise eine entsprechende Meldung aus – beispielsweise durch eine Prüfung von varOpenArgs auf den Wert Null mit der Funktion IsNull wie in Listing 5.

Private Sub Form_Open(Cancel As Integer)

     Dim varOpenArgs As Variant

     varOpenArgs = Me.OpenArgs

     If IsNull(varOpenArgs) Then

         MsgBox "Es wurde kein Öffnungsargument übergeben."

     End If

     Me!txtUebergebenerWert = varOpenArgs

End Sub

Listing 5: Anzeige einer Meldung, wenn kein Öffnungsargument übergeben wurde

Öffnen bei leeren Öffnungsargument abbrechen

Nun kann es sein, dass das Öffnen des Formulars keinen Sinn ergibt, wenn Sie kein Öffnungsargument übergeben. In diesem Fall soll der Öffnungsvorgang nach dem Anzeigen einer Meldung (oder auch ohne Anzeigen dieser Meldung) einfach abgebrochen werden. Das Abbrechen ist allerdings nur in der Ereignisprozedur möglich, die durch das Ereignis Beim Öffnen ausgelöst wird – diese stellt nämlich den Parameter Cancel mit dem Datentyp Boolean zur Verfügung.

Stellen Sie diesen innerhalb der Prozedur auf den Wert True ein, wird das Öffnen des Formulars nach dem Ausführen der Prozedur Form_Open nicht mehr fortgesetzt. Deshalb verwenden wir hier auch das Ereignis Beim Öffnen und nicht etwa Beim Laden. Wir erweitern die Prozedur Form_Open also noch um die Anweisung Cancel = True:

Private Sub Form_Open(Cancel As Integer)

...

If IsNull(varOpenArgs) Then

...

Cancel = True

End If

...

End Sub

Nach dem Anzeigen der Meldung wird das Formular dann kommentarlos geschlossen.

Formular mit leerem Öffnungsargument öffnen

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!