{"id":55001535,"date":"2025-02-01T00:00:00","date_gmt":"2025-01-31T12:51:28","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1535"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Referenzieren_von_Formularen_und_Steuerelementen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/","title":{"rendered":"Referenzieren von Formularen und Steuerelementen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/fca23536cf7845db91d8e3652f8e9acd\" width=\"1\" height=\"1\" alt=\"\"><b>Wenn man mit VBA programmiert, kommt man nicht um das Referenzieren von Formularen und Steuerelementen herum. Dabei gibt es verschiedene Schreibweisen, verschiedene Ziele und auch noch verschiedene Ausgangspunkte. Bei den Schreibweisen scheiden sich die Geister, ob man Punkte oder Ausrufezeichen verwendet und wie detailliert oder kurz es sein soll. Die Ziele sind Formulare, Unterformulare und die darin enthaltenen Steuerelemente mit oder ohne Datenbindung. Und warum gibt es verschiedene Ausgangspunkte? Weil man einerseits vom Klassenmodul eines Formulars selbst auf die enthaltenen Steuerelemente zugreifen m&ouml;chte, andererseits aber auch von Formularen auf die Elemente anderer Formulare oder auch von Prozeduren aus Standardmodulen. Wie all dies zusammenh&auml;ngt und wie die Ausdr&uuml;cke f&uuml;r die verschiedenen Konstellationen formuliert werden m&uuml;ssen, zeigen wir in diesem Beitrag.<\/b><\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Als Beispiel verwenden wir eine Datenbank, die verschiedene Tabellen zum Speichern von Kunden, Projekten und Mitarbeitern enth&auml;lt.<\/p>\n<p>Hier nutzen wir zun&auml;chst das Formular <b>frmKundenUndProjekte <\/b>mit dem Unterformular <b>sfmKundenUndProjekte<\/b>, wobei das Unterformular-Steuerelement zur besseren Unterscheidung <b>sfm <\/b>genannt wurde (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/Snag_c7114d.png\" alt=\"Formular zum Anzeigen von Kunden und Projekten\" width=\"549,559\" height=\"354,8682\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular zum Anzeigen von Kunden und Projekten<\/span><\/b><\/p>\n<h2>Verschiedene Ausgangspunkte<\/h2>\n<p>Je nachdem, von wo aus wir auf Formulare, Unterformulare und Steuerelemente zugreifen wollen, k&ouml;nnen wir unterschiedliche Ausdr&uuml;cke zum Referenzieren des jeweiligen Elements verwenden.<\/p>\n<p>Dabei gibt es allgemeine Ausdr&uuml;cke, die wir grunds&auml;tzlich von &uuml;berall aus nutzen k&ouml;nnen, aber auch solche, die nur von speziellen Orten aus funktionieren.<\/p>\n<p>Wenn wir also beispielsweise ein Steuerelement in einem Formular von einem Standardmodul aus oder von einem Klassenmodul eines anderen Moduls aus referenzieren wollen, werden wir &uuml;blicherweise die <b>Forms<\/b>-Auflistung nutzen, dar&uuml;ber den Formularnamen angeben und schlie&szlig;lich &uuml;ber die Steuerelemente-Auflistung das Steuerelement referenzieren.<\/p>\n<p>Einen solchen Ausdruck k&ouml;nnen wir beispielsweise auch vom Direktbereich aus nutzen. Dieser sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms.Item(\"frmKundenUndProjekte\").Controls.Item(\"Vorname\").Value<\/pre>\n<p>Wir nutzen also zun&auml;chst die <b>Forms<\/b>-Auflistung, greifen &uuml;ber die <b>Items<\/b>-Auflistung auf das Formular <b>frmKundenUndProjekte <\/b>zu und &uuml;ber dessen <b>Controls<\/b>-Auflistung auf das Steuerelement namens <b>Vorname<\/b>.<\/p>\n<p>Diesen Ausdruck k&ouml;nnen wir grunds&auml;tzlich von &uuml;berall aus verwenden, denn er ist absolut und nicht relativ. Einen relativen Ausdruck k&ouml;nnten wir innerhalb des Klassenmoduls des Formulars platzieren.<\/p>\n<p>Innerhalb des Klassenmoduls k&ouml;nnen wir auf das Formular mit dem Schl&uuml;sselwort <b>Me <\/b>zugreifen. Dabei ersetzen wir den Bezug zum Formular, n&auml;mlich <b>Forms.Item(&#8222;frmKundenUndProjekte&#8220;) <\/b>durch <b>Me<\/b>. Der Rest bleibt gleich:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Me.Controls.Item(\"Vorname\").Value<\/pre>\n<p>&Auml;hnlich verh&auml;lt es sich, wenn wir auf ein Element im Unterformular zugreifen wollen. Um die Bezeichnung des aktuell markierten Projekts zu ermitteln, k&ouml;nnen wir von &uuml;berall aus diesen Ausdruck verwenden:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms.Item(\"frmKundenUndProjekte\").Controls(\"sfm\").Form.Controls(\"Projektbezeichnung\")<\/pre>\n<p>Vom Hauptformular aus k&uuml;rzen wir den Ausdruck wie zuvor ab:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Me.Controls(\"sfm\").Form.Controls(\"Projektbezeichnung\").Value<\/pre>\n<p>Vom Unterformular aus hingegen reicht dieser Ausdruck:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Me.Controls(\"Projektbezeichnung\").Value<\/pre>\n<h2>Lang und kurz<\/h2>\n<p>In den ersten Beispielen haben wir die jeweils l&auml;ngste Form des ben&ouml;tigten Ausdrucks verwendet. Es g&auml;be nur noch eine Steigerung, denn die <b>Forms<\/b>-Auflistung ist eigentlich eine Eigenschaft der <b>Application<\/b>-Klasse von Access. Das k&ouml;nnen wir wie folgt im Direktbereich herausfinden:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> TypeName(Forms.Parent)\r\nApplication<\/pre>\n<p>Es ist aber erst dann zwingend notwendig, einen Verweis auf das <b>Application<\/b>-Objekt von Access anzugeben, wenn wir von einer anderen Anwendung aus eine Access-Instanz fernsteuern wollen.<\/p>\n<p>Wir schauen uns nun die m&ouml;glichen Kurzformen an und beginnen mit dem ersten Ausdruck, diesmal ohne <b>Debug.Print<\/b>:<\/p>\n<pre>Forms.Item(\"frmKundenUndProjekte\").Controls.Item(\"Vorname\").Value<\/pre>\n<p>Hier k&ouml;nnen wir als Erstes auf die <b>Value<\/b>-Eigenschaft verzichten. <b>Value <\/b>ist n&auml;mlich die Standardeigenschaft des <b>Textbox<\/b>-Steuerelements und vieler weiterer Steuerelemente. Das hei&szlig;t, wenn wir keine Eigenschaft angeben, wird in der Regel <b>Value <\/b>als Eigenschaft verwendet.<\/p>\n<h2>Die Standardeigenschaft einer Klasse<\/h2>\n<p>Warum &#8222;in der Regel&#8220;? Weil es auch hier eine Ausnahme gibt. Wenn wir n&auml;mlich wie folgt eine Objektvariable des Typs <b>TextBox<\/b> definieren und das Textfeld zuweisen, wird logischerweise nicht der Inhalt der Standardeigenschaft zugewiesen, sondern ein Verweis auf das <b>TextBox<\/b>-Element.<\/p>\n<p>Wenn wir jedoch eine Operation durchf&uuml;hren wie <b>Debug.Print <\/b>oder den Wert einer <b>String<\/b>-Variablen zuweisen, dann liefert der Ausdruck den Wert der Standardeigenschaft.<\/p>\n<p>Woher wissen wir das? Dazu &ouml;ffnen wir den Objektkatalog des VBA-Editors, suchen nach <b>TextBox<\/b>, w&auml;hlen das Ergebnis aus und suchen unter <b>Elemente von &#8220;TextBox&#8220;<\/b> nach einem Element mit einem abweichenden Icon. Dieses sieht wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/Snag_db9fff.png\" alt=\"Standardeigenschaft einer Klasse im Objektkatalog\" width=\"599,559\" height=\"428,9449\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Standardeigenschaft einer Klasse im Objektkatalog<\/span><\/b><\/p>\n<p>Damit landen wir bei der ersten Verk&uuml;rzung, denn den Wert unseres Textfeldes k&ouml;nnen wir nun auch wie folgt ausgeben:<\/p>\n<pre>Forms.Item(\"frmKundenUndProjekte\").Controls.Item(\"Vorname\")<\/pre>\n<h2>Item ist ebenfalls eine Standardeigenschaft<\/h2>\n<p>Und auf der gleichen Basis k&ouml;nnen wir noch zwei weitere Verk&uuml;rzungen vornehmen. Genau wie <b>Value <\/b>f&uuml;r das <b>TextBox<\/b>-Element ist <b>Item <\/b>die Standardeigenschaft sowohl der <b>Forms<\/b>&#8211; als auch der <b>Controls<\/b>-Auflistung. Auch davon kann man sich im Objektkatalog &uuml;berzeugen.<\/p>\n<p>Damit landen wir direkt bei einer sehr viel k&uuml;rzeren Version des vorherigen Ausdrucks:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms(\"frmKundenUndProjekte\").Controls(\"Vorname\")<\/pre>\n<p>Dieser Ausdruck ist bereits wesentlich &uuml;bersichtlicher als die erste und die zweite Variante.<\/p>\n<p>Doch es geht noch weiter. Mit <b>Forms(&#8222;frmKundenUndProjekte&#8220;) <\/b>referenzieren wir n&auml;mlich ein Formular, also ein Element des Typs <b>Form<\/b>.<\/p>\n<p>Und welche Standardeigenschaft hat das <b>Form<\/b>-Element? Richtig: die <b>Controls<\/b>-Auflistung!<\/p>\n<p>Damit k&ouml;nnen wir auch diese weglassen und erhalten diesen noch k&uuml;rzeren Ausdruck:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms(\"frmKundenUndProjekte\")(\"Vorname\")<\/pre>\n<p>Und es geht noch weiter, denn es gibt sogar noch eine Abk&uuml;rzung f&uuml;r das Referenzieren des gew&uuml;nschten Auflistungselements. Dabei lassen wir die &ouml;ffnende und schlie&szlig;enden Klammern und Anf&uuml;hrungszeichen weg. Stattdessen stellen wir ein Ausrufezeichen voran. Das machen wir der &Uuml;bersicht halber in zwei Schritten, als Erstes f&uuml;r das Steuerelement:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms(\"frmKundenUndProjekte\")!Vorname<\/pre>\n<p>Und schlie&szlig;lich k&ouml;nnen wir die gleiche Vereinfachung auch noch f&uuml;r das gew&uuml;nschte Element der <b>Forms<\/b>-Auflistung erledigen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmKundenUndProjekte!Vorname<\/pre>\n<p>Damit w&auml;re alles gut und sch&ouml;n. Wir h&auml;tten mit dem Ausrufezeichen ein eindeutiges Zeichen, um eine Abk&uuml;rzung f&uuml;r Auflistungen zu schreiben. Allerdings k&ouml;nnen wir auch die folgenden Notationen nutzen, um den Inhalt des Feldes <b>Vorname <\/b>auszugeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms.frmKundenUndProjekte.Vorname<\/pre>\n<p>Allerdings funktioniert die Eingabe der Punkte nicht f&uuml;r IntelliSense. Der Grund ist ganz einfach: Die <b>Forms<\/b>-Auflistung wei&szlig; w&auml;hrend des Entwurfs nicht, welche Elemente sie beinhaltet. Und auch die <b>Controls<\/b>-Auflistung wei&szlig; das nicht. Wie aber k&ouml;nnen wir dennoch unter bestimmten Umst&auml;nden per IntelliSense auf Steuerelemente zugreifen? Das schauen wir uns im folgenden Abschnitt an.<\/p>\n<h2>Klassen als Eigenschaften<\/h2>\n<p>Wie erw&auml;hnt, ist es manchmal m&ouml;glich, &uuml;ber den Punkt per IntelliSense auf Steuerelemente zuzugreifen.<\/p>\n<p>Das gelingt allerdings nur in den folgenden beiden Situationen. Die erste d&uuml;rfte die weitaus bekanntere sein. Hier verwenden wir das <b>Me<\/b>-Schl&uuml;sselwort gefolgt von dem Punkt. Dies liefert wie in Bild 3 beispielsweise die Steuerelemente <b>KundeID <\/b>und <b>Land<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_003.png\" alt=\"Steuerelemente als Eigenschaften\" width=\"549,559\" height=\"441,1797\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Steuerelemente als Eigenschaften<\/span><\/b><\/p>\n<p>Lassen wir uns hier den Vornamen ausgeben, um beim bisherigen Beispiel zu bleiben, verwenden wir also den folgenden Ausdruck:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Me.Vorname<\/pre>\n<p>Auch hier funktioniert &uuml;brigens die Notation mit dem Ausrufezeichen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Me!Vorname<\/pre>\n<p>Diese Ausdr&uuml;cke sind &uuml;brigens wieder identisch mit den folgenden:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Me.Vorname.Value\r\n<span style=\"color:blue;\">Debug.Print<\/span> Me.Controls(\"Vorname\").Value<\/pre>\n<h2>Zugriff auf Steuerelemente als Eigenschaften von au&szlig;erhalb des Klassenmoduls<\/h2>\n<p>Bevor wir zu den Unterschieden zwischen der Punkt- und der Ausrufezeichen-Notation kommen, schauen wir uns noch den zweiten und weniger h&auml;ufigen Fall an, bei dem wir &uuml;ber IntelliSense auf die Steuerelemente zugreifen.<\/p>\n<p>Diese Methode unterscheidet sich vor allem dadurch, dass wir nicht nur vom Klassenmodul des jeweiligen Formulars per IntelliSense auf die Steuerelemente zugreifen k&ouml;nnen, sondern auch vom Direktbereich, von Standardmodulen oder von anderen Klassenmodulen aus.<\/p>\n<p>Dazu m&uuml;ssen wir den Namen des Klassenmoduls des jeweiligen Formulars kennen. Dieser setzt sich aus der Zeichenkette <b>Form_ <\/b>und dem Formularnamen zusammen. Im Falle des Formulars <b>frmKundenUndProjekte <\/b>hei&szlig;t das Klassenmodul folglich <b>Form_frmKundenUndProjekte<\/b>.<\/p>\n<p>Damit k&ouml;nnen wir sogar vom Direktbereich per IntelliSense auf die Steuerelemente zugreifen und beispielsweise ihren Inhalt ausgeben:<\/p>\n<p>In Bild 4 sehen wir ein Beispiel daf&uuml;r. Warum werden die Steuerelemente aber &uuml;berhaupt per IntelliSense angezeigt?<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_004.png\" alt=\"Zugriff per IntelliSense auf ein Steuerelement\" width=\"599,559\" height=\"207,5028\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Zugriff per IntelliSense auf ein Steuerelement<\/span><\/b><\/p>\n<p>Der Grund ist: In dem Moment, wo wir einem Formular ein Steuerelement hinzuf&uuml;gen, wird die Formularklasse um dieses Element erweitert. Und damit erh&auml;lt die Formularklasse eine Eigenschaft, die den gleichen Namen wie das Steuerelement tr&auml;gt.<\/p>\n<p>Das l&auml;sst sich einfach reproduzieren, indem man beispielsweise ein neues Steuerelement namens <b>cmdTest <\/b>hinzuf&uuml;gt. Sobald man &uuml;ber die Eingabe von <b>Me<\/b> oder <b>Form_frmKundenUndProjekte <\/b>plus Eingabe des Punktes IntelliSense aktiviert, wird das neue Steuerelement dort aufgelistet.<\/p>\n<h2>Einsatz von Me vs. Name des Formularklassenmoduls<\/h2>\n<p>Der Einsatz des Schl&uuml;sselwortes <b>Me <\/b>wirkt sich immer nur auf das Klassenmodul aus, in dem es verwendet wird. Das ist logisch &#8211; wo sollte man es nutzen k&ouml;nnen? Letztlich ist es eine Abk&uuml;rzung f&uuml;r <b>Form_ <\/b>plus Formularname. Wir k&ouml;nnen auch innerhalb des Klassenmoduls eines Formulars zum Beispiel <b>Form_frmKundenUndProjekte <\/b>nutzen. Das hat allerdings folgenden Nachteil: Wenn man einmal den Namen des Formulars &auml;ndert, l&auml;uft diese Referenz ins Leere und l&ouml;st einen Fehler aus.<\/p>\n<p>Au&szlig;erhalb von Formularklassenmodulen k&ouml;nnen wir <b>Me <\/b>logischerweise nicht einsetzen. Wenn wir hier per IntelliSense auf die Steuerelemente des Formulars zugreifen wollen, m&uuml;ssen wir also beispielsweise <b>Form_frmKundenUndProjekte <\/b>referenzieren und k&ouml;nnen dann nach Eingabe des Punktes IntelliSense nutzen.<\/p>\n<p>Es gibt allerdings einen entscheidenden Unterschied: Sowohl Me als auch <b>Form_frmKundenUndProjekte <\/b>greifen auf eine Instanz der Klasse <b>Form_frmKundenUndProjekte <\/b>zu. Daf&uuml;r muss aber auch eine solche Klasse vorhanden sein! Davon k&ouml;nnen wir bei Verwendung von <b>Me <\/b>ausgehen, denn <b>Me <\/b>kann nur vom Klassenmodul selbst auf die Eigenschaften zugreifen. Wenn wir jedoch &uuml;ber <b>Form_frmKundenUndProjekte <\/b>von au&szlig;erhalb des Klassenmoduls auf seine Elemente zugreifen wollen, und es ist noch keine Instanz vorhanden, dann wird nun eine neue Instanz erstellt beziehungsweise das Formular ge&ouml;ffnet.<\/p>\n<h2>Forms!frmKundenUndProjekte vs. Form_frmKundenUndProjekte<\/h2>\n<p>Damit haben wir nun zwei Methoden, um von au&szlig;erhalb eines Formulars auf ein Formular zuzugreifen. Die erste verwendet die <b>Forms<\/b>-Auflistung und kann so aussehen, wobei wir hier den Namen des Formulars mit der Name-Eigenschaft ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmKundenUndProjekte.Name\r\n<span style=\"color:blue;\">Debug.Print<\/span> Forms(\"frmKundenUndProjekte\").Name<\/pre>\n<p>Mit <b>Form_ <\/b>sieht der Zugriff wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Form_frmKundenUndProjekte.Name<\/pre>\n<p>Hier sehen wir einen weiteren Unterschied:<\/p>\n<ul>\n<li>Wenn wir &uuml;ber die <b>Forms<\/b>-Auflistung auf ein Formular zugreifen und es ist nicht ge&ouml;ffnet, erhalten wir einen Fehler.<\/li>\n<li>Wenn wir &uuml;ber die <b>Form_<\/b>-Notation darauf zugreifen und es ist nicht ge&ouml;ffnet, wird die Instanz automatisch erstellt.<\/li>\n<\/ul>\n<p>Beides kann zu unterwarteten Ergebnissen f&uuml;hren. Deshalb sollten wir vorher pr&uuml;fen, ob das jeweilige Formular bereits ge&ouml;ffnet ist und erst dann auf die Inhalte zugreifen. Anderenfalls erhalten wir im besten Fall einen Fehler, wenn das Formular noch nicht ge&ouml;ffnet ist und wir &uuml;ber die Auflistung darauf zugreifen wollen.<\/p>\n<p>Im schlechtesten Fall greifen wir &uuml;ber den Namen des Klassenmoduls des Formulars darauf zu und erstellen das Formular neu, obwohl dieses eigentlich gerade gar nicht ge&ouml;ffnet sein sollte.<\/p>\n<p>Wie wir herausfinden, ob ein Formular gerade ge&ouml;ffnet ist, schauen wir uns im Beitrag <b>Pr&uuml;fen, ob ein Formular ge&ouml;ffnet ist <\/b>(<b>www.access-im-unternehmen.de\/1537<\/b>) an.<\/p>\n<p>Kurz gefasst: Bevor wir &uuml;ber den Namen des Klassenmoduls eines Formulars auf dieses zugreifen wollen, k&ouml;nnten wir in einer einfachen <b>If&#8230;Then<\/b>-Bedingung und einer Hilfsfunktion pr&uuml;fen, ob dieses &uuml;berhaupt ge&ouml;ffnet ist:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmKundenUndProjekte\") = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Form_frmKundenUndProjekte.Name\r\n<span style=\"color:blue;\">Else<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Formular nicht ge&ouml;ffnet\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Nur, wenn das Formulare ge&ouml;ffnet ist, sollten wir auch mit dem Klassennamen darauf zugreifen, weil wir es sonst neu erstellen.<\/p>\n<p>Interessanterweise liefern der Zugriff &uuml;ber die Auflistung Forms als auch der &uuml;ber den Klassennamen beide ein Element des Typs der Formularklasse zur&uuml;ck &#8211; hier zun&auml;chst f&uuml;r die <b>Forms<\/b>-Auflistung:<\/p>\n<pre>  TypeName(Forms!frmKundenUndProjekte)\r\nForm_frmKundenUndProjekte<\/pre>\n<p>Wenn wir direkt auf das Klassenmodul zugreifen, erhalten wir das gleich Ergebnis:<\/p>\n<pre>  TypeName(Form_frmKundenUndProjekte)\r\nForm_frmKundenUndProjekte<\/pre>\n<h2>IntelliSense f&uuml;r Steuerelemente bei Unterformularen<\/h2>\n<p>Wenn wir die Auflistungen verwenden wollen, k&ouml;nnen wir wie folgt auf die Steuerelemente eines Unterformulars zugreifen &#8211; hier in der vereinfachten Form mit Ausrufezeichen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmKundenUndProjekte!sfm.Form!Projektbezeichnung<\/pre>\n<p>Hier ist zu sehen, dass wir diesmal das Unterformular-Steuerelement namens <b>sfm <\/b>als Steuerelement der Steuerelementliste des Hauptformulars nutzen. Um das darin enthaltene Formular zu referenzieren, verwenden wir die <b>Form<\/b>-Eigenschaft. Dies liefert zwar einen Verweis auf das Klassenmodul, aber dennoch k&ouml;nnen wir nicht mit IntelliSense auf die enthaltenen Steuerelemente zugreifen.<\/p>\n<p>Stattdessen m&uuml;ssen wir diese wieder erst nachschauen oder aus dem Ged&auml;chtnis eingeben.<\/p>\n<p>Wenn wir auch f&uuml;r das Unterformular IntelliSense f&uuml;r den Zugriff auf die enthaltenen Steuerelemente nutzen wollen, m&uuml;ssen wir dieses zuerst mit einer Variablen referenzieren, die den Typ der Formularklasse hat:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objSfmKundenUndProjekte<span style=\"color:blue;\"> As <\/span>Form_sfmKundenUndProjekte<\/pre>\n<p>Dann setzen wir einen Verweis auf das <b>Form<\/b>-Element in dem in der Steuerelement-Auflistung enthaltene Unterformular-Steuerelement:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objSfmKundenUndProjekte = Form_frmKundenUndProjekte.sfm.Form<\/pre>\n<p>Danach k&ouml;nnen wir auch auf die Steuerelemente im Unterformular per IntelliSense zugreifen (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_005.png\" alt=\"IntelliSense f&uuml;r Unterformulare\" width=\"599,559\" height=\"280,7602\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: IntelliSense f&uuml;r Unterformulare<\/span><\/b><\/p>\n<h2>Steuerelement oder Feld der Datensatzquelle?<\/h2>\n<p>Bisher haben wir die ganze Zeit mit gebundenen Steuerelementen gearbeitet, die genauso hei&szlig;en, wie die Felder, an die sie gebunden sind. Das ist der Standard, wenn man die Felder nach dem Festlegen der Datensatzquelle aus der Feldliste in das Formular zieht. Access vergibt automatisch die Feldnamen als Namen f&uuml;r die Steuerelemente.<\/p>\n<p>Aus unserer Sicht ist es wesentlich einfacher, Steuerelemente so umzubenennen, dass sie zwar noch den Namen des gebundenen Feldes enthalten, aber ein Pr&auml;fix aufweisen, das dem Typ des Steuerelements entspricht. Die wichtigsten sind dabei:<\/p>\n<ul>\n<li><b>txt<\/b>: Textfeld<\/li>\n<li><b>cbo<\/b>: Kombinationsfeld<\/li>\n<li><b>chk<\/b>: Kontrollk&auml;stchen<\/li>\n<li><b>lst<\/b>: Listenfeld<\/li>\n<\/ul>\n<p>Sie k&ouml;nnen nat&uuml;rlich auch andere Pr&auml;fixe verwenden &#8211; wichtig ist, dass sie konsistent sind. Der Grund ist, dass bei Verwendung von IntelliSense nat&uuml;rlich auch alle Textfelder, Kombinationsfelder, Kontrollk&auml;stchen, Listenfelder und so weiter immer an der gleichen Stelle gefunden werden sollen.<\/p>\n<p>Aber k&ouml;nnen wir eigentlich gezielt entweder auf das Steuerelement oder das gebundene Feld zugreifen, wenn beide den gleichen Namen haben?<\/p>\n<p>Wenn wir beispielsweise den Typ des Textfeldes <b>Vorname <\/b>ausgeben, erhalten wir folgendes Ergebnis:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> TypeName(Forms!frmKundenUndProjekte!Vorname)\r\n<span style=\"color:blue;\">Text<\/span>Box<\/pre>\n<p>Aber k&ouml;nnen wir &uuml;berhaupt auf das Feld selbst zugreifen, statt auf das daran gebundene Steuerelement? Und welchen Objekttyp hat ein solches Feld in einem Formular eigentlich? Das finden wir heraus, indem wir das Steuerelement <b>Vorname <\/b>einmal in <b>txtVorname <\/b>umbenennen. Danach erhalten wir beim Zugriff auf das Element <b>Vorname <\/b>den folgenden Datentyp:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> TypeName(Forms!frmkundenundprojekte!Vorname)\r\nAccessField<\/pre>\n<p>Hier erhalten wir beispielsweise den Datentyp <b>AccessField<\/b>. Was ist nun genau der Unterschied zwischen den beiden? Dieser ist riesig: W&auml;hrend die Steuerelementtypen <b>TextBox<\/b>, <b>ComboBox<\/b>, <b>CheckBox<\/b>, <b>ListBox <\/b>et cetera einige Eigenschaften aufweisen, mit denen sich alles programmieren l&auml;sst, was wir ben&ouml;tigen, weist der Datentyp <b>AccessField <\/b>lediglich eine einzige Eigenschaft auf!<\/p>\n<p>Schauen wir uns das einmal im Objektkatalog an, finden wir diesen Datentyp &uuml;ber die Suche zun&auml;chst einmal gar nicht (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_006.png\" alt=\"Der Datentyp AccessField existiert anscheinend gar nicht.\" width=\"499,5589\" height=\"377,7367\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Der Datentyp AccessField existiert anscheinend gar nicht.<\/span><\/b><\/p>\n<p>Der Grund ist, dass es sich hier um einen verborgenen Objekttyp handelt. Diesen decken wir auf, indem wir im Objektkatalog mit der rechten Maustaste das Kontextmen&uuml; &ouml;ffnen und dort den Befehl <b>Verborgene Elemente anzeigen <\/b>bet&auml;tigen. Danach finden wir dort den Eintrag <b>AccessField<\/b>. Markieren wir diesen und schauen uns die Liste der Elemente an, finden wir lediglich den Eintrag <b>Value<\/b> (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_007.png\" alt=\"Der Datentyp taucht erst auf, wenn wir die verborgenen Elemente einblenden.\" width=\"499,5589\" height=\"377,7367\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Der Datentyp taucht erst auf, wenn wir die verborgenen Elemente einblenden.<\/span><\/b><\/p>\n<p>Warum m&uuml;ssen wir das &uuml;berhaupt wissen? Das ist zum Beispiel dann wichtig, wenn Sie nicht gleich zu Beginn der Entwicklung Wert darauf legen, Pr&auml;fixe f&uuml;r die Steuerelemente festzulegen und dies sp&auml;ter nachholen wollen.<\/p>\n<p>Wenn man n&auml;mlich bis dahin zum Beispiel die folgende Zeile verwendet, um den Standardwert des Steuerelements namens <b>Vorname <\/b>zu ermitteln, gelingt dies zun&auml;chst problemlos:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmKundenUndProjekte!Vorname.DefaultValue<\/pre>\n<p>Wenn wir nun den Namen des Steuerelements von Vorname zu <b>txtVorname <\/b>&auml;ndern und diese Zeile erneut aufrufen, erhalten wir einen Fehler:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmKundenUndProjekte!Vorname.DefaultValue<\/pre>\n<p>Die entsprechende Fehlermeldung ist in Bild 8 abgebildet.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/Snag_af02ecd.png\" alt=\"Fehler beim Versuch, nicht vorhandene Eigenschaften eines AccessField-Elements zu lesen\" width=\"424,5589\" height=\"173,9816\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Fehler beim Versuch, nicht vorhandene Eigenschaften eines AccessField-Elements zu lesen<\/span><\/b><\/p>\n<h2>Wozu eigentlich die ausf&uuml;hrliche Form?<\/h2>\n<p>Weiter oben sind wir mit der folgenden langen Form zum Referenzieren eines Steuerelements gestartet:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms.Item(\"frmKundenUndProjekte\").Controls.Item(\"Vorname\").Value<\/pre>\n<p>Nachdem wir gesehen haben, dass wir es auch so kurz schreiben k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmKundenUndProjekte!Vorname<\/pre>\n<p>Oder dass wir auch direkt &uuml;ber <b>Form_frmKundenUndProjekte <\/b>sogar mit IntelliSense auf die Steuerelemente zugreifen k&ouml;nnen.<\/p>\n<p>Wieso sollten wir dann &uuml;berhaupt die Variante mit der Auflistung mit Klammern und Anf&uuml;hrungszeichen verwenden?<\/p>\n<p>Der erste Grund ist, dass wir vielleicht nicht den Namen des Formulars oder Steuerelements angeben wollen, sondern diesen in einer Variablen gespeichert haben.<\/p>\n<p>Wenn wir beispielsweise eine Variable wie die folgende deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strFormularname<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Und dann den Namen zuweisen:<\/p>\n<pre>strFormularname = \"frmKundenUndProjekte\"<\/pre>\n<p>Dann k&ouml;nnen wir diese Variable in der Anweisung zum Referenzieren des Formulars einbauen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms(strFormularname)!Vorname<\/pre>\n<p>Warum sollte man das tun? Zum Beispiel, weil man in mehreren Anweisungen hintereinander auf das Formular zugreift und bei einer &Auml;nderung des Formularnamens die &Auml;nderung nur an einer Stelle in der Prozedur durchf&uuml;hren m&ouml;chte.<\/p>\n<p>Es gibt noch andere Anwendungsf&auml;lle, die wir nur &uuml;ber die Auflistungen l&ouml;sen k&ouml;nnen. Wenn wir beispielsweise viele gleichartige Steuerelemente in einem Formular platzieren, beispielsweise um einen Kalender abzubilden, dann werden wir diese vermutlich mit Namen nach einem bestimmten Schema mit numerischen Anteilen versehen, zum Beispiel <b>txt001<\/b>, <b>txt002<\/b>, <b>txt003 <\/b>und so weiter.<\/p>\n<p>Wenn wir diese nun durchlaufen wollen, um ihre Eigenschaften entsprechend des darzustellenden Kalenders anzupassen, k&ouml;nnen wir die <b>Controls<\/b>-Auflistung nutzen und dabei dynamisch zusammengesetzte Bezeichnungen nutzen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>lngControl<span style=\"color:blue;\"> As Long<\/span>\r\nFor lngControl = 1 To 42\r\n     Me.Controls(\"txt\" & Format(lngControl, \"000\")).Value = lngControl\r\n<span style=\"color:blue;\">Next<\/span> lngControl<\/pre>\n<h2>Was nun?<\/h2>\n<p>Nach den vielen verschiedenen Beispielen f&uuml;r den Zugriff auf Formulare und die enthaltenen Unterformulare und Steuerelemente stellt sich nun noch die Frage, wann nun welche Option am sinnvollsten ist. Auch dazu gibt es ein paar Richtlinien, aber leider keine eindeutigen.<\/p>\n<h2>Me im eigenen Klassenmodul ist gesetzt<\/h2>\n<p>Ganz klar: Wenn Sie auf Elemente in dem Formular zugreifen wollen, in dessen Formularklassenmodul Sie gerade programmieren, dann verwenden wir immer das Schl&uuml;sselwort <b>Me<\/b> f&uuml;r den Zugriff auf Elemente des aktuellen Formulars.<\/p>\n<h2>Punkt oder Ausrufezeichen?<\/h2>\n<p>Aber referenzieren wir die Steuerelemente dann &uuml;ber den Punkt oder das Ausrufezeichen?<\/p>\n<p>Ganz ehrlich: Bisher habe immer das Ausrufezeichen verwendet, einfach um benutzerdefinierte Elemente von Eigenschaften unterscheiden zu k&ouml;nnen. <\/p>\n<p>Aber im Rahmen der Recherche zu diesem Beitrag ist deutlich geworden, dass dies Nachteile haben kann. Auch wenn sich diese Nachteile in meinem Programmieralltag sehr selten bemerkbar gemacht haben.<\/p>\n<p>Der Nachteil entsteht, wenn man ein Steuerelement nachtr&auml;glich umbenennt, das bereits anders hei&szlig;t als das gebundene Feld (also zum Beispiel beim Feld <b>Vorname<\/b>, das im Textfeld <b>txtVorname <\/b>angezeigt wird). Wir schauen uns ein Beispiel an, bei dem wir die folgende Prozedur f&uuml;r die Schaltfl&auml;che <b>cmdVornameAusgeben <\/b>hinterlegt haben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVornameAusgeben_Click()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Me!txtVorname\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Me.txtVorname\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<p>Solange das Steuerelement <b>txtVorname <\/b>hei&szlig;t, liefern beide Zeilen das korrekte Ergebnis.<\/p>\n<p>Wenn wir jedoch den Namen des Textfeldes im Formularentwurf auf <b>txtFirstname <\/b>&auml;ndern, wird es interessant. Wir bekommen dann n&auml;mlich zwei unterschiedliche Fehler. Wir schauen uns erst einmal den ersten Fehler an. Dabei handelt es sich gleich um einen Kompilierfehler, der in der Zeile auftaucht, wo wir die Punktsyntax verwendet haben (siehe Bild 9). Warum ein Kompilierfehler? Weil wir hier &uuml;ber die Punktsyntax auf die Eigenschaft zugreifen und nicht auf ein Element einer Auflistung. Die Eigenschaft ist nicht vorhanden und deshalb kann die Prozedur nicht kompiliert werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_008.png\" alt=\"Kompilierfehler\" width=\"499,5589\" height=\"252,4735\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Kompilierfehler<\/span><\/b><\/p>\n<p>Auf diesen Fehler w&uuml;rden wir auch sto&szlig;en, wenn wir das VBA-Projekt mit <b>Debuggen|Kompilieren von Datenbankname <\/b>kompilieren w&uuml;rden oder wenn wir versuchen w&uuml;rden, eine <b>.accde<\/b>-Datei aus der Datenbank zu erstellen.<\/p>\n<p>Wenn wir diesen Fehler behoben haben und die Prozedur erneut ausf&uuml;hren, sehen wir den n&auml;chsten Fehler bei der Zeile mit der Ausrufezeichen-Syntax. Hier handelt es sich allerdings um einen Laufzeitfehler (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_009.png\" alt=\"Laufzeitfehler\" width=\"574,559\" height=\"309,0886\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Laufzeitfehler<\/span><\/b><\/p>\n<p>Warum ist es in diesem Fall nun sinnvoller, die Punkt-Syntax zu verwenden? Weil wir so bereits beim Kompilieren erkennen k&ouml;nnen, ob es noch Fehler durch falsch benannte Elemente gibt.<\/p>\n<p>Wenn wir die Ausrufezeichen-Syntax verwendet h&auml;tten, w&auml;re dieser Fehler erst beim Testen oder, noch schlimmer, bei Kunden aufgefallen.<\/p>\n<h2>Forms-Auflistung oder Formularklassenname?<\/h2>\n<p>Damit kommen wir zur Situation, dass wir nicht von innerhalb des gleichen Formularklassenmoduls aus programmieren. Auch hier sollte nun das Ziel sein, auf die Steuerelemente als Eigenschaften zuzugreifen, um eventuelle Probleme mit falsch benannten Referenzen direkt als Kompilierfehler zu erkennen.<\/p>\n<p>Dies ist allerdings nur m&ouml;glich, wenn wir bereits bei den Formularen nicht wie bei <b>Form!frmKundenUndProjekte <\/b>die Auflistung verwenden, sondern direkt mit dem Klassennamen die Formularklasse referenzieren, also <b>Form_frmKundenUndProjekte<\/b>.<\/p>\n<p>Bei einem Ausdruck wie <b>Form_frmKundenUndProjekte.txtVorname <\/b>k&ouml;nnen wir durch Kompilieren gleich zwei Fehlern vorbeugen &#8211; sowohl einem ge&auml;nderten Formular- als auch einem ge&auml;nderten Steuerelementnamen.<\/p>\n<h2>Performancefrage<\/h2>\n<p>Wenn wir die Unterschiede schon so genau unter die Lupe nehmen, sollten wir auch noch einen Blick auf die Performance werfen.<\/p>\n<p>Hier wollen wir die folgenden Funktionen untersuchen, in denen wir einerseits &uuml;ber die Klasseninstanz auf das Objekt zugreifen und andererseits &uuml;ber die Auflistung:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Objekt()\r\n     <span style=\"color:blue;\">Dim <\/span>strVorname<span style=\"color:blue;\"> As String<\/span>\r\n     strVorname = Form_frmKundenUndProjekte.txtFirstname\r\n<span style=\"color:blue;\">End Function<\/span>\r\n<span style=\"color:blue;\">Public Function <\/span>Liste()\r\n     <span style=\"color:blue;\">Dim <\/span>strVorname<span style=\"color:blue;\"> As String<\/span>\r\n     strVorname = Forms!frmKundenUndProjekte!txtFirstname\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Bild 11 zeigt das Ergebnis. Die Variante mit der Objektinstanz ist zwischen 15% und 20% schneller als die andere Variante.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1535_010.png\" alt=\"Performancevergleich\" width=\"574,559\" height=\"399,7881\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Performancevergleich<\/span><\/b><\/p>\n<p>Wir haben auch noch getestet, ob die lange oder die kurze Schreibweise &uuml;ber die Auflistungen schneller ist:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Lang()\r\n     <span style=\"color:blue;\">Dim <\/span>strVorname<span style=\"color:blue;\"> As String<\/span>\r\n     strVorname = Forms.Item(\"frmKundenUndProjekte\").Controls(\"txtFirstname\").Value\r\n<span style=\"color:blue;\">End Function<\/span>\r\n<span style=\"color:blue;\">Public Function <\/span>Kurz()\r\n     <span style=\"color:blue;\">Dim <\/span>strVorname<span style=\"color:blue;\"> As String<\/span>\r\n     strVorname = Forms!frmKundenUndProjekte!txtFirstname\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das Ergebnis: Beide sind ungef&auml;hr gleich schnell.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag liefert eine &Uuml;bersicht &uuml;ber die verschiedenen M&ouml;glichkeiten, Formulare und Steuerelemente zu referenzieren.<\/p>\n<p>Dabei untersuchen wir auch, welche Methode welche Vor- und Nachteile aufweist.<\/p>\n<p>Schlie&szlig;lich haben wir uns noch angesehen, wie sich verschiedene Ma&szlig;nahmen auf die Performance auswirken.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Mitarbeiterverwaltung.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/281E369A-EAE2-4A61-85D3-A52EB595CB7D\/aiu_1535.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man mit VBA programmiert, kommt man nicht um das Referenzieren von Formularen und Steuerelementen herum. Dabei gibt es verschiedene Schreibweisen, verschiedene Ziele und auch noch verschiedene Ausgangspunkte. Bei den Schreibweisen scheiden sich die Geister, ob man Punkte oder Ausrufezeichen verwendet und wie detailliert oder kurz es sein soll. Die Ziele sind Formulare, Unterformulare und die darin enthaltenen Steuerelemente mit oder ohne Datenbindung. Und warum gibt es verschiedene Ausgangspunkte? Weil man einerseits vom Klassenmodul eines Formulars selbst auf die enthaltenen Steuerelemente zugreifen m&ouml;chte, andererseits aber auch von Formularen auf die Elemente anderer Formulare oder auch von Prozeduren aus Standardmodulen. Wie all dies zusammenh&auml;ngt und wie die Ausdr&uuml;cke f&uuml;r die verschiedenen Konstellationen formuliert werden m&uuml;ssen, zeigen wir in diesem Beitrag.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012025,662025,44000026,44000023],"tags":[],"class_list":["post-55001535","post","type-post","status-publish","format-standard","hentry","category-66012025","category-662025","category-Interaktiv","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Referenzieren von Formularen und Steuerelementen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Referenzieren von Formularen und Steuerelementen\" \/>\n<meta property=\"og:description\" content=\"Wenn man mit VBA programmiert, kommt man nicht um das Referenzieren von Formularen und Steuerelementen herum. Dabei gibt es verschiedene Schreibweisen, verschiedene Ziele und auch noch verschiedene Ausgangspunkte. Bei den Schreibweisen scheiden sich die Geister, ob man Punkte oder Ausrufezeichen verwendet und wie detailliert oder kurz es sein soll. Die Ziele sind Formulare, Unterformulare und die darin enthaltenen Steuerelemente mit oder ohne Datenbindung. Und warum gibt es verschiedene Ausgangspunkte? Weil man einerseits vom Klassenmodul eines Formulars selbst auf die enthaltenen Steuerelemente zugreifen m&ouml;chte, andererseits aber auch von Formularen auf die Elemente anderer Formulare oder auch von Prozeduren aus Standardmodulen. Wie all dies zusammenh&auml;ngt und wie die Ausdr&uuml;cke f&uuml;r die verschiedenen Konstellationen formuliert werden m&uuml;ssen, zeigen wir in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-31T12:51:28+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Referenzieren von Formularen und Steuerelementen\",\"datePublished\":\"2025-01-31T12:51:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/\"},\"wordCount\":3608,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/fca23536cf7845db91d8e3652f8e9acd\",\"articleSection\":[\"1\\\/2025\",\"2025\",\"Interaktiv\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/\",\"name\":\"Referenzieren von Formularen und Steuerelementen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/fca23536cf7845db91d8e3652f8e9acd\",\"datePublished\":\"2025-01-31T12:51:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/fca23536cf7845db91d8e3652f8e9acd\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/fca23536cf7845db91d8e3652f8e9acd\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Referenzieren_von_Formularen_und_Steuerelementen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Referenzieren von Formularen und Steuerelementen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Referenzieren von Formularen und Steuerelementen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/","og_locale":"de_DE","og_type":"article","og_title":"Referenzieren von Formularen und Steuerelementen","og_description":"Wenn man mit VBA programmiert, kommt man nicht um das Referenzieren von Formularen und Steuerelementen herum. Dabei gibt es verschiedene Schreibweisen, verschiedene Ziele und auch noch verschiedene Ausgangspunkte. Bei den Schreibweisen scheiden sich die Geister, ob man Punkte oder Ausrufezeichen verwendet und wie detailliert oder kurz es sein soll. Die Ziele sind Formulare, Unterformulare und die darin enthaltenen Steuerelemente mit oder ohne Datenbindung. Und warum gibt es verschiedene Ausgangspunkte? Weil man einerseits vom Klassenmodul eines Formulars selbst auf die enthaltenen Steuerelemente zugreifen m&ouml;chte, andererseits aber auch von Formularen auf die Elemente anderer Formulare oder auch von Prozeduren aus Standardmodulen. Wie all dies zusammenh&auml;ngt und wie die Ausdr&uuml;cke f&uuml;r die verschiedenen Konstellationen formuliert werden m&uuml;ssen, zeigen wir in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-01-31T12:51:28+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Referenzieren von Formularen und Steuerelementen","datePublished":"2025-01-31T12:51:28+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/"},"wordCount":3608,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/fca23536cf7845db91d8e3652f8e9acd","articleSection":["1\/2025","2025","Interaktiv","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/","url":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/","name":"Referenzieren von Formularen und Steuerelementen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/fca23536cf7845db91d8e3652f8e9acd","datePublished":"2025-01-31T12:51:28+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/fca23536cf7845db91d8e3652f8e9acd","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/fca23536cf7845db91d8e3652f8e9acd"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Referenzieren_von_Formularen_und_Steuerelementen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Referenzieren von Formularen und Steuerelementen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001535"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001535\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}