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).
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).
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).
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.
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.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: