{"id":55001336,"date":"2022-04-01T00:00:00","date_gmt":"2022-05-10T18:31:20","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1336"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Steuerelemente_per_VBA_erstellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/","title":{"rendered":"Steuerelemente per VBA erstellen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/6e6646c6832943f289aa644a441110c5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Formulare per VBA erstellen&#8220; (www.access-im-unternehmen.de\/1332) haben wir gezeigt, wie Sie per VBA ein neues, leeres Formular erstellen und seine Eigenschaften einstellen. Darauf wollen wir in diesem Beitrag aufbauen und zeigen, wie Sie dem Formular per VBA die gew&uuml;nschten Steuerelemente hinzuf&uuml;gen k&ouml;nnen. Und auch Steuerelemente haben eine Menge Eigenschaften, die wir nach dem Anlegen einstellen m&uuml;ssen &#8211; Position, Aussehen und auch wieder Ereigniseigenschaften. Nach der Lekt&uuml;re des vorliegenden Beitrags haben Sie alle Werkzeuge, die Sie brauchen, um beispielsweise Access-Add-Ins zu nutzen, um einer Anwendung neue Formulare und Steuerelemente hinzuzuf&uuml;gen.<\/b><\/p>\n<h2>Vorbereitung: Formular anlegen<\/h2>\n<p>Als Vorbereitung wollen wir mit den Techniken, die wir im oben genannten Beitrag zum Erstellen von Formularen gelernt haben, zun&auml;chst ein neues Formular erzeugen. Dazu verwenden wir eine Funktion, die weitere Funktionen aus dem oben genannten Beitrag nutzt.<\/p>\n<p>Die folgende Funktion erwartet den Namen des zu erstellenden Formulars und &uuml;bergibt diesen an eine weitere Funktion namens <b>CreateNewForm<\/b>. Liefert diese den Wert <b>True <\/b>zur&uuml;ck, wurde das Formular erfolgreich erstellt.<\/p>\n<p>Dann &ouml;ffnen wir dieses Formular in der Formularansicht und stellen noch die Anzeige von Kopf- und Fu&szlig;bereich ein &#8211; diese Bereiche werden wir weiter unten n&auml;mlich auch mit Steuerelementen versehen. Schlie&szlig;lich gibt die Funktion einen Verweis auf das noch in der Entwurfsansicht ge&ouml;ffnete <b>Form<\/b>-Objekt zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetNewForm(strForm<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">If <\/span>CreateNewForm(strForm) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.OpenForm strForm, acDesign\r\n         <span style=\"color:blue;\">Set<\/span> frm = Forms(strForm)\r\n         <span style=\"color:blue;\">With<\/span> frm\r\n             RunCommand acCmdFormHdrFtr\r\n             .Section(acHeader).Visible = <span style=\"color:blue;\">True<\/span>\r\n             .Section(acFooter).Visible = <span style=\"color:blue;\">True<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> GetNewForm = frm\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Steuerelemente anlegen per VBA<\/h2>\n<p>Diese Funktion rufen wir von der folgenden Prozedur aus auf und referenzieren das erstellte und ge&ouml;ffnete Formular mit der Variablen <b>frm<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SteuerelementeAnlegen()\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Set<\/span> frm = GetNewForm(\"frmMitSteuerelementen\")\r\n     ''Steuerelemente anlegen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach k&ouml;nnen wir bereits loslegen, indem wir die gew&uuml;nschten Anweisungen an Stelle des Kommentars <b>&#8220;Steuerelemente anlegen <\/b>einf&uuml;gen! Die minimale Version der Methode <b>CreateControl <\/b>hat nur zwei Parameter &#8211; den Namen des Formulars und den Typ des Steuerelements, hier <b>acTextBox <\/b>f&uuml;r ein Textfeld:<\/p>\n<pre>CreateControl frm.Name, acTextBox<\/pre>\n<p>Dieser Befehl legt bereits ein einfaches Steuerelement an, wobei die Position links oben im Detailbereich des Formulars ist.<\/p>\n<p>Wichtig ist, dass Sie genau wie &uuml;ber die Benutzeroberfl&auml;che nur Steuerelemente anlegen k&ouml;nnen, wenn das Formular in der Entwurfsansicht ge&ouml;ffnet ist.<\/p>\n<h2>Die Methode CreateControl<\/h2>\n<p>Die Methode <b>CreateControl<\/b>, eigentlich ein Teil des <b>Application<\/b>-Objekts, aber auch ohne dessen Angabe aufrufbar, hat noch weitere Parameter. Nur die ersten beiden Parameter <b>FormName <\/b>und <b>ControlType <\/b>sind Pflichtparameter:<\/p>\n<ul>\n<li><b>FormName<\/b>: Name des Formulars, in dem das Steuerelement angelegt werden soll<\/li>\n<li><b>ControlType<\/b>: Typ des Steuerelements, der durch eine Konstante angegeben wird &#8211; zum Beispiel <b>acTextBox<\/b>, <b>acLabel <\/b>oder <b>acCommandButton<\/b>.<\/li>\n<li><b>Section<\/b>: Bereich, in dem das Steuerelement angelegt werden soll. Sinnvolle Werte f&uuml;r das Anlegen von Steuerelementen in Formularen sind <b>acDetail<\/b>, <b>acHeader <\/b>und <b>acFooter<\/b>. Die &uuml;brigen M&ouml;glichkeiten, die per IntelliSense angezeigt werden, sind f&uuml;r Berichte gedacht.<\/li>\n<li><b>Parent<\/b>: Verweis auf das &uuml;bergeordnete Steuerelement. Hiermit k&ouml;nnen Sie beispielsweise festlegen, zu welchem Textfeld ein Bezeichnungsfeld geh&ouml;rt.<\/li>\n<li><b>ColumnName<\/b>: Angabe eines Feldes der Datensatzquelle des Formulars, an welches das Steuerelement gebunden werden soll. F&uuml;llt die Eigenschaft <b>Steuerelementinhalt <\/b>und mehr &#8211; siehe weiter unten.<\/li>\n<li><b>Left<\/b>: Position vom linken Rand des Formulars<\/li>\n<li><b>Top<\/b>: Position vom oberen Rand des Formulars<\/li>\n<li><b>Width<\/b>: Breite des Steuerelements<\/li>\n<li><b>Height<\/b>: H&ouml;he des Steuerelements<\/li>\n<\/ul>\n<h2>Textfeld mit Bezeichnungsfeld anlegen<\/h2>\n<p>Um ein Textfeld mit einem Bezeichnungsfeld zu erstellen, ben&ouml;tigen Sie zwei Aufrufe der <b>CreateControl<\/b>-Methode. Mit dem ersten erstellen Sie das Textfeld, mit dem zweiten das Bezeichnungsfeld.<\/p>\n<p>F&uuml;r das Bezeichnungsfeld stellen wir den Parameter <b>Parent <\/b>auf das Textfeld ein. Auf diese Weise werden die beiden Steuerelemente so verkn&uuml;pft, wie es auch beim Anlegen von Textfeldern &uuml;ber den Entwurf geschieht oder wenn Sie Felder aus der Feldliste in den Entwurf ziehen.<\/p>\n<p>F&uuml;r ein einfaches Textfeld mit einem Bezeichnungsfeld ben&ouml;tigen Sie die folgenden Anweisungen. Die Variablen <b>txt <\/b>und <b>lbl <\/b>dienen zum Referenzieren der neu erstellten Steuerelemente. Das Textfeld erstellen wir im Formular mit dem Namen, den wir mit <b>frm.Name <\/b>f&uuml;r das mit <b>frm <\/b>wie oben referenzierte Formular abfragen, als <b>acTextBox <\/b>im Bereich <b>acDetail<\/b>. Au&szlig;erdem legen wir die Position mit 1400 Twips vom linken und 100 Twips vom oberen Rand und die Gr&ouml;&szlig;e mit einer Breite von 2000 Twips und einer H&ouml;he von 300 Twips fest:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n<span style=\"color:blue;\">Dim <\/span>lbl<span style=\"color:blue;\"> As <\/span>Label\r\n<span style=\"color:blue;\">Set<\/span> txt = CreateControl(frm.Name, acTextBox,  acDetail, , , 1400, 100, 2000, 300)<\/pre>\n<p>Danach erstellen wir das Bezeichnungsfeld ebenfalls in <b>frm.Name<\/b> als <b>acLabel <\/b>im Bereich <b>acDetail<\/b>. Es soll dem zuvor erstellten Textfeld untergeordnet werden, also geben wir f&uuml;r den Parameter <b>Parent <\/b>den Namen des Textfeldes an (mit <b>txt.Name<\/b>). <b>txt.Name <\/b>funktioniert immer, auch wenn wir den Namen des Textfeldes nicht explizit festgelegt haben und liefert f&uuml;r das erste Textfeld im Formular beispielsweise den Wert <b>Text0<\/b>.<\/p>\n<p>Die Position und die Abmessungen definieren wir so, dass das Bezeichnungsfeld links vom Textfeld erscheint. Anschlie&szlig;end legen wir noch die Beschriftung fest, indem wir die Eigenschaft <b>Caption <\/b>f&uuml;r das zuvor definierte und mit der Variablen <b>lbl <\/b>referenzierte Bezeichnungsfeld auf den Wert <b>Textfeld: <\/b>festlegen:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> lbl = CreateControl(frm.Name, acLabel,  acDetail, txt.Name, , 100, 100, 1200, 300)\r\nlbl.Caption = \"Textfeld:\"<\/pre>\n<p>Indem Sie das Bezeichnungsfeld mit dem <b>Parent<\/b>-Parameter an das Textfeld binden, sorgen Sie gleichzeitig daf&uuml;r, dass die Eigenschaft <b>Bezeichnungsname <\/b>des Textfeldes auf den Namen des Bezeichnungsfeldes eingestellt wird.<\/p>\n<p>Das Ergebnis finden Sie in Bild 1 (siehe Prozedur <b>FormularMitTextfeldUndBezeichnungsfeld<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_001.png\" alt=\"Textfeld mit Bezeichnungsfeld\" width=\"424,5589\" height=\"229,8364\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Textfeld mit Bezeichnungsfeld<\/span><\/b><\/p>\n<h2>Gebundene Textfelder anlegen<\/h2>\n<p>Nun gehen wir einen Schritt weiter und wollen zwei gebundenen Textfelder anlegen. Dazu stellen wir als Erstes die Eigenschaft <b>Recordsource <\/b>(<b>Datensatzquelle<\/b>) des Formulars auf die Tabelle <b>tblArtikel <\/b>ein:<\/p>\n<pre>frm.RecordSource = \"tblArtikel\"<\/pre>\n<p>Danach erstellen wir nacheinander zwei Textfelder mit Bezeichnungsfeldern, wobei wir im Gegensatz zum vorherigen Beispiel nun den Parameter <b>ColumnName <\/b>nutzen, um das Feld anzugeben, an welches das jeweilige Textfeld gebunden werden soll:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n<span style=\"color:blue;\">Dim <\/span>lbl<span style=\"color:blue;\"> As <\/span>Label\r\n<span style=\"color:blue;\">Set<\/span> txt = CreateControl(frm.Name, acTextBox,  acDetail, , \"ArtikelID\", 1500, 100, 2000, 300)\r\n<span style=\"color:blue;\">Set<\/span> lbl = CreateControl(frm.Name, acLabel,  acDetail, txt.Name, , 100, 100, 1300, 300)\r\nlbl.Caption = \"ArtikelID:\"\r\n<span style=\"color:blue;\">Set<\/span> txt = CreateControl(frm.Name, acTextBox,  acDetail, , \"Artikelname\", 1500, 500, 2000, 300)\r\n<span style=\"color:blue;\">Set<\/span> lbl = CreateControl(frm.Name, acLabel,  acDetail, txt.Name, , 100, 500, 1300, 300)\r\nlbl.Caption = \"Artikelname:\"<\/pre>\n<p>Das so erstellte Formular sieht in der Formularansicht wie in Bild 2 aus (siehe Prozedur <b>GebundeneTextfelder<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_002.png\" alt=\"Formular mit gebundenen Textfeldern\" width=\"424,5589\" height=\"236,9826\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Formular mit gebundenen Textfeldern<\/span><\/b><\/p>\n<h2>Gebundene Kombinationsfelder anlegen<\/h2>\n<p>Wenn wir die Tabelle <b>tblArtikel <\/b>betrachten, finden wir als N&auml;chstes zwei Nachschlagefelder.<\/p>\n<p>Diese wollen wir nun in Form von Kombinationsfeldern zum Formular hinzuf&uuml;gen. F&uuml;r das erste Nachschlagefeld namens <b>KategorieID <\/b>sieht der dazu n&ouml;tige Code wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>cbo<span style=\"color:blue;\"> As <\/span>ComboBox\r\n...\r\n<span style=\"color:blue;\">Set<\/span> cbo = CreateControl(frm.Name, acComboBox,  acDetail, , \"KategorieID\", 1500, 900, 2000, 300)\r\n<span style=\"color:blue;\">Set<\/span> lbl = CreateControl(frm.Name, acLabel,  acDetail, cbo.Name, , 100, 900, 1300, 300)\r\nlbl.Caption = \"KategorieID:\"<\/pre>\n<p>Wie wir in Bild 3 sehen, brauchen wir nur das zugrunde liegende Nachschlagefeld der Tabelle mit dem Parameter <b>Column-Name <\/b>anzugeben, damit ein neues Kombinationsfeld mit allen in der Tabelle f&uuml;r dieses Feld festgelegten Eigenschaften erstellt wird (siehe Prozedur <b>GebundeneKombinationsfelder<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_003.png\" alt=\"Formular mit gebundenem Kombinationsfeld\" width=\"649,559\" height=\"388,7256\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Formular mit gebundenem Kombinationsfeld<\/span><\/b><\/p>\n<h2>&Uuml;bernahme von Eigenschaften bei gebundenen Steuerelementen<\/h2>\n<p>Wenn Sie mit dem Parameter <b>ColumnName <\/b>ein Feld der zugrunde liegenden Datensatzquelle angeben, stellt dies nicht nur die Eigenschaft <b>Steuerelementinhalt <\/b>auf den Namen des zu bindenden Feldes ein. Dazu geh&ouml;ren Eigenschaften wie <b>Textformat<\/b>, <b>Eingabeformat<\/b>, <b>Standardwert<\/b>, <b>G&uuml;ltigkeitsregel <\/b>oder <b>G&uuml;ltigkeitsmeldung<\/b>. Bei Kombinationsfeldern auf Basis von Nachschlagefeldern werden, wir oben gezeigt, sogar die Eigenschaften des Nachschlagefeldes &uuml;bernommen.<\/p>\n<h2>Detailformular erstellen<\/h2>\n<p>Ein oft erledigter Schritt ist das Erstellen eines Detailformulars, also ein Formular, das die Daten einer Tabelle oder Abfrage anzeigen soll. Dazu sind normalerweise einige Schritte n&ouml;tig wie das Erstellen des Formulars, das Hinzuf&uuml;gen der Datensatzquelle, das Hineinziehen der Felder in den Formularentwurf und gegebenenfalls noch das Anordnen der Felder, weil Access beim Hineinziehen von Feldern aus der Feldliste beispielsweise Kontrollk&auml;stchen immer links vom Bezeichnungsfeld anordnet und die &uuml;brigen Steuerelemente immer rechts vom Bezeichnungsfeld.<\/p>\n<p>Deshalb zeigen wir im Folgenden eine praktische Anwendung der Techniken, die Sie weiter oben gelernt haben.<\/p>\n<p>Die Prozedur <b>DetailformularErstellen <\/b>erwartet drei Parameter:<\/p>\n<ul>\n<li><b>strForm<\/b>: Name des zu erstellenden Formulars<\/li>\n<li><b>strRecordsource<\/b>: Name der Datensatzquelle<\/li>\n<li><b>lngCaptionWidth<\/b>: Breite der Bezeichnungsfelder mit einem Standardwert von 1500 Twips<\/li>\n<\/ul>\n<p>Die Prozedur, deren Code Sie in Listing 1 finden, schlie&szlig;t zun&auml;chst eine gegebenenfalls noch ge&ouml;ffnete Instanz des Formulars mit dem in <b>strForm <\/b>&uuml;bergebenen Namen. Dann erstellt sie dieses mit der Funktion <b>GetNewForm <\/b>unter dem angegebenen Namen neu und referenziert das neu erstellte und in der Entwurfsansicht ge&ouml;ffnete Formular mit der Variablen <b>frm<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DetailformularErstellen(strForm<span style=\"color:blue;\"> As String<\/span>, strRecordsource<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> lngCaptionWidth<span style=\"color:blue;\"> As Long<\/span> = 1500)\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>strDisplayControl<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCaption<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">Dim <\/span>lbl<span style=\"color:blue;\"> As <\/span>Label\r\n     <span style=\"color:blue;\">Dim <\/span>cbo<span style=\"color:blue;\"> As <\/span>ComboBox\r\n     <span style=\"color:blue;\">Dim <\/span>chk<span style=\"color:blue;\"> As <\/span>CheckBox\r\n     <span style=\"color:blue;\">Dim <\/span>lngTop<span style=\"color:blue;\"> As Long<\/span>\r\n     DoCmd.Close acForm, strForm\r\n     <span style=\"color:blue;\">Set<\/span> frm = GetNewForm(strForm)\r\n     frm.RecordSource = strRecordsource\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(strRecordsource)\r\n     For Each fld In rst.Fields\r\n         strDisplayControl = 0\r\n         strCaption = \"\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         intDisplayControl = fld.Properties(\"DisplayControl\")\r\n         strCaption = fld.Properties(\"Caption\")\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strCaption) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strCaption = fld.Name\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Select Case intDisplayControl\r\n             <span style=\"color:blue;\">Case <\/span>acCheckBox\r\n                 <span style=\"color:blue;\">Set<\/span> chk = CreateControl(frm.Name, acCheckBox, acDetail, , fld.Name, lngCaptionWidth + 200, lngTop + 100)\r\n                 chk.Name = \"chk\" & fld.Name\r\n                 <span style=\"color:blue;\">Set<\/span> lbl = CreateControl(frm.Name, acLabel, acDetail, chk.Name, , 100, lngTop + 100, lngCaptionWidth, 300)\r\n             <span style=\"color:blue;\">Case <\/span>acComboBox\r\n                 <span style=\"color:blue;\">Set<\/span> cbo = CreateControl(frm.Name, acComboBox, acDetail, , fld.Name, lngCaptionWidth + 200, _\r\n                     lngTop + 100, 2000, 300)\r\n                 cbo.Name = \"cbo\" & fld.Name\r\n                 <span style=\"color:blue;\">Set<\/span> lbl = CreateControl(frm.Name, acLabel, acDetail, cbo.Name, , 100, lngTop + 100, lngCaptionWidth, 300)\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">Set<\/span> txt = CreateControl(frm.Name, acTextBox, acDetail, , fld.Name, lngCaptionWidth + 200, _\r\n                     lngTop + 100, 2000, 300)\r\n                 txt.Name = \"txt\" & fld.Name\r\n                 <span style=\"color:blue;\">Set<\/span> lbl = CreateControl(frm.Name, acLabel, acDetail, txt.Name, , 100, lngTop + 100, lngCaptionWidth, 300)\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         lbl.Caption = strCaption\r\n         lngTop = lngTop + 400\r\n     <span style=\"color:blue;\">Next<\/span> fld\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Erstellen eines Detailformulars<\/span><\/b><\/p>\n<p>Die einzige Formulareigenschaft, welche die Prozedur einstellt, ist <b>RecordSource<\/b>. Sie erh&auml;lt den Wert aus <b>strRecordsource<\/b>.<\/p>\n<p>Danach referenziert die Prozedur mit <b>db <\/b>das aktuelle <b>Database<\/b>-Objekt und mit <b>rst <\/b>ein Recordset auf Basis der mit <b>strRecordsource <\/b>&uuml;bergebenen Datensatzquelle, bei der es sich um eine Tabelle, Abfrage oder auch einen SQL-Ausdruck handeln kann. Anschlie&szlig;end durchl&auml;uft sie in einer <b>For Each<\/b>-Schleife alle Felder der <b>Fields<\/b>-Auflistung des Recordsets.<\/p>\n<p>In dieser Schleife stellt die Prozedur zun&auml;chst die beiden Variablen <b>intDisplayControl <\/b>und <b>strCaption<\/b> auf die Werte <b>0 <\/b>beziehungsweise eine leere Zeichenkette ein. <b>intDisplayControl <\/b>soll sp&auml;ter den Steuerelementtyp aufnehmen, der f&uuml;r die Anzeige des Feldes in der Datenblattansicht definiert wurde. Dieser Steuerelementtyp wird beim Entwerfen einer Tabelle automatisch von Access vorgegeben &#8211; bei Feldern des Datentyps <b>Kurzer Text <\/b>zum Beispiel Textfeld, bei Nachschlagefeldern Kombinationsfeld oder bei <b>Ja\/Nein<\/b>-Feldern Kontrollk&auml;stchen.<\/p>\n<p>Bei reinen Zahlenfeldern wird kein Steuerelement voreingestellt. Bild 4 zeigt, wo Sie die Eigenschaft <b>DisplayControl <\/b>beziehungsweise <b>Steuerelement anzeigen <\/b>im Entwurf der Tabelle einsehen k&ouml;nnen. <b>DisplayControl <\/b>liefert Werte einer Enumeration wie <b>acTextBox<\/b>, <b>acComboBox <\/b>oder <b>acCheckBox<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_004.png\" alt=\"Wert der Eigenschaft DisplayControl\" width=\"424,5589\" height=\"312,3541\"\/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Wert der Eigenschaft DisplayControl<\/span><\/b><\/p>\n<p>Die Variable <b>strCaption <\/b>soll den Wert der Eigenschaft <b>Beschriftung <\/b>aufnehmen oder, wenn keine Beschriftung angelegt wurde, den Feldnamen. Die Eigenschaft <b>Beschriftung<\/b> hei&szlig;t unter VBA <b>Caption<\/b>. Sie k&ouml;nnen diese auf der Registerseite <b>Allgemein <\/b>des oben referenzierten Screenshots festlegen, diese Beschriftung wird dann als Spalten&uuml;berschrift oder auch als Label-Beschriftung beim Ziehen von Feldern aus der Feldliste verwendet.<\/p>\n<p>Warum setzen wir die beiden Variablen <b>intDisplayControl <\/b>und <b>strCaption<\/b> immer wieder auf <b>0 <\/b>und <b>&#8222;&#8220;<\/b> Weil die Properties <b>DisplayControl <\/b>und <b>Caption<\/b>, mit denen wir diese f&uuml;llen wollen, nicht immer vorhanden sind und wir versuchen, diese unter Deaktivierung der Fehlerbehandlung aus den Properties abzufragen. Da wir dies innerhalb einer Schleife machen, w&uuml;rden die Variablen, wenn sie nicht aus den Properties gef&uuml;llt werden k&ouml;nnen, gegebenenfalls noch den Wert aus dem vorherigen Durchgang enthalten, wenn wir sie nicht leeren.<\/p>\n<p>Die Werte der Eigenschaften <b>DisplayControl <\/b>und <b>Caption <\/b>fragen wir also bei deaktivierter Fehlerbehandlung &uuml;ber die Auflistung <b>Properties <\/b>ab und speichern diese in <b>intDisplayControl <\/b>und <b>strCaption<\/b>. War die Property <b>Caption <\/b>nicht vorhanden, ist <b>strCaption <\/b>danach leer und wir f&uuml;llen es ersatzweise mit dem Namen des Feldes.<\/p>\n<p><b>intDisplayControl <\/b>nimmt einen der Werte <b>acCheckbox<\/b>, <b>acComboBox<\/b>, <b>acTextBox <\/b>oder <b>0 <\/b>an. Diesen pr&uuml;fen wir in der folgenden <b>Select Case<\/b>-Bedingung. Im Falle von <b>acCheckBox <\/b>erstellt die Prozedur mit der <b>CreateControl<\/b>-Methode ein neues Steuerelement des Typs <b>acCheckbox <\/b>im Detailbereich des Formulars. Das Feld wird an den mit <b>fld.Name <\/b>gelieferten Feldnamen gebunden.<\/p>\n<p>Die Breite ermitteln wir aus dem Parameter <b>lngCaptionWidth <\/b>plus <b>200<\/b>, damit wir 200 Twips Abstand zwischen Label und Steuerelement erhalten. Den Abstand von oben stellen wir &uuml;ber den Wert der Variablen <b>lngTop <\/b>plus <b>100 <\/b>ein. <b>lngTop<\/b> erh&ouml;hen wir nach jedem Steuerelement um <b>400<\/b>, damit das n&auml;chste Steuerelement um 400 Twips weiter unten angeordnet wird. Im Falle von <b>acCheckBox <\/b>brauchen wir H&ouml;he und Breite nicht anzugeben, da die <b>CheckBox<\/b> immer gleich gro&szlig; ist.<\/p>\n<p>Anschlie&szlig;end weisen wir dem mit <b>chk <\/b>referenzierten neuen <b>CheckBox<\/b>-Steuerelement &uuml;ber die Eigenschaft <b>Name <\/b>den Namen des Feldes plus Pr&auml;fix <b>chk <\/b>zu. Das folgende <b>Label<\/b>-Steuerelement legen wir links vom <b>CheckBox<\/b>-Steuerelement an. Weiter unten, au&szlig;erhalb der <b>Select Case<\/b>-Bedingung, stellen wir noch seine Eigenschaft <b>Caption <\/b>auf den Wert aus <b>strCaption <\/b>ein.<\/p>\n<p>Auf &auml;hnliche Weise verfahren wir mit den Feldern, die f&uuml;r die Eigenschaft <b>DisplayControl <\/b>die Werte <b>acComboBox <\/b>oder <b>acTextBox <\/b>hinterlegt haben. Der Unterschied ist, dass wir diese Variablen des jeweiligen Typs zuweisen (<b>ComboBox <\/b>und <b>TextBox<\/b>) und dass wir f&uuml;r diese noch die Breite und die H&ouml;he auf die Werte <b>2000 <\/b>und <b>300 <\/b>einstellen.<\/p>\n<p>Schlie&szlig;lich weisen wir auch diesen Steuerelementen als Name ein Pr&auml;fix wie <b>cbo <\/b>oder <b>txt <\/b>plus dem Feldnamen zu und erstellen die entsprechenden <b>Label<\/b>-Steuerelemente links neben dem Kombinations- oder Textfeld.<\/p>\n<p>Die letzte Bedingung pr&uuml;ft &uuml;brigens nicht auf den Wert <b>acTextBox<\/b>, sondern verarbeitet alle &uuml;brigen Werte. Der Hintergrund ist, dass wir es ja nicht unbedingt mit <b>acTextBox <\/b>zu tun haben, sondern dass bei dem Steuerelement die Eigenschaft <b>DisplayControl <\/b>nicht definiert ist &#8211; dann soll dieses auch als <b>TextBox<\/b>-Steuerelement realisiert werden.<\/p>\n<p>Nach dem Verlassen der <b>Select Case<\/b>-Bedingung stellen wir noch die Eigenschaft <b>Caption <\/b>des <b>Label<\/b>-Steuerelements aus <b>lbl <\/b>ein und erh&ouml;hen den Wert von <b>lngTop <\/b>um <b>400<\/b>, damit das folgende Steuerelement unter dem aktuellen Steuerelement angelegt wird.<\/p>\n<p>Den Aufruf gestalten wir beispielsweise wie folgt:<\/p>\n<pre>DetailformularErstellen \"frmArtikelDetail\",  \"tblArtikel\", 2000<\/pre>\n<p>Das Ergebnis finden Sie in Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_005.png\" alt=\"Entwurf des per Code erstellten Formulars zur Anzeige von Artikeln in der Detailansicht\" width=\"424,5589\" height=\"423,6594\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurf des per Code erstellten Formulars zur Anzeige von Artikeln in der Detailansicht<\/span><\/b><\/p>\n<h2>Doppelpunkte sicherstellen<\/h2>\n<p>Hier sehen wir noch einen kleinen Makel, denn die Beschriftungen werden nicht mit einem Doppelpunkt abgeschlossen. Wenn Sie das w&uuml;nschen, k&ouml;nnen Sie es auf zwei Arten erledigen:<\/p>\n<ul>\n<li>Erg&auml;nzen der <b>Label<\/b>-Beschriftung um den Doppelpunkt<\/li>\n<li>Einstellen beziehungsweise sicherstellen, dass der Doppelpunkt automatisch hinzugef&uuml;gt wird<\/li>\n<\/ul>\n<p>Die letztere Variante w&auml;re sinnvoller, denn es kann auch sein, dass bei Ihnen die Doppelpunkte automatisch hinzugef&uuml;gt werden. Dies h&auml;ngt von der Einstellung der Eigenschaft <b>Mit Doppelpunkt <\/b>der jeweiligen Standardsteuerelemente ab. Diese Eigenschaft sehen Sie bei bereits hinzugef&uuml;gten Steuerelementen nicht, sondern nur, wenn Sie im Ribbon auf das jeweilige Steuerelement klicken &#8211; beispielsweise auf das <b>Textfeld<\/b>-Steuerelement -, ohne das Steuerelement tats&auml;chlich zum Entwurf des Formulars hinzuzuf&uuml;gen und dann im Eigenschaftenblatt auf der Registerseite Format unten die Eigenschaft <b>Mit Doppelpunkt <\/b>betrachten (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_006.png\" alt=\"Einstellen der Eigenschaften f&uuml;r das Standardsteuerelement, hier f&uuml;r ein Textfeld.\" width=\"549,559\" height=\"404,4633\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Einstellen der Eigenschaften f&uuml;r das Standardsteuerelement, hier f&uuml;r ein Textfeld.<\/span><\/b><\/p>\n<p>Aber selbst wenn wir diese Eigenschaft wie folgt per VBA zu Beginn der Prozedur beispielsweise f&uuml;r die Textfelder dieses Formulars einstellen und den Formularentwurf anschlie&szlig;end speichern, f&uuml;hrt dies nicht dazu, dass die Label anschlie&szlig;end automatisch mit abschlie&szlig;enden Doppelpunkten versehen werden. Das Standardsteuerelement f&uuml;r die Textbox erhalten Sie beispielsweise mit <b>frm.DefaultControl(acTextBox) <\/b>und weisen wie folgt den Wert <b>True <\/b>der Eigenschaft <b>AddColon <\/b>beziehungsweise <b>Mit Doppelpunkt <\/b>hinzu:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> txt = frm.DefaultControl(acTextBox)\r\ntxt.AddColon = <span style=\"color:blue;\">True<\/span>\r\nDoCmd.Save acForm, frm.Name<\/pre>\n<p>Es scheint also unabh&auml;ngig davon zu sein, ob die Eigenschaft <b>AddColon <\/b>aktiviert ist oder nicht &#8211; wenn wir die <b>Label<\/b>-Steuerelemente separat hinzuf&uuml;gen, was per VBA nicht anders m&ouml;glich ist, k&ouml;nnen wir die Doppelpunkte per VBA hinzuf&uuml;gen. Offensichtlich werden Doppelpunkte auch bei aktivierter Eigenschaft <b>Mit Doppelpunkt <\/b>f&uuml;r das Standardsteuerelement nur angelegt, wenn Sie das Textfeld &uuml;ber die Benutzeroberfl&auml;che hinzuf&uuml;gen oder durch das Ziehen von Feldern aus der Feldliste.<\/p>\n<p>Also passen wir die Prozedur schlicht so an, dass die Doppelpunkte immer hinzugef&uuml;gt werden:<\/p>\n<pre>lbl.Caption = strCaption & \":\"<\/pre>\n<p>Danach erhalten wir die Beschriftungen mit Doppelpunkten.<\/p>\n<h2>Formular in der Datenblattansicht erstellen<\/h2>\n<p>Auf &auml;hnliche Weise k&ouml;nnen Sie ein Formular erstellen, das standardm&auml;&szlig;ig in der Datenblattansicht angezeigt wird. Dazu m&uuml;ssen Sie zu der zuvor beschriebenen Prozedur lediglich die Zuweisung einer Eigenschaft hinzuf&uuml;gen, mit der wir die Standardansicht auf Datenblatt einstellen:<\/p>\n<pre>frm.DefaultView = acDefViewDatasheet<\/pre>\n<p>Sie erhalten dann genau das gleiche Ergebnis, allerdings in der Datenblattansicht. Die einzigen Elemente, die wir wegnehmen k&ouml;nnten, sind die Angaben der Position der Steuerelemente &#8211; alle anderen werden auch im Formular in der Datenblattansicht ben&ouml;tigt.<\/p>\n<p>Allerdings wollen Sie vielleicht sp&auml;ter manuelle &Auml;nderungen am Entwurf vornehmen, was schwierig wird, wenn alle Elemente &uuml;bereinander angelegt wurden.<\/p>\n<p>Die Prozedur f&uuml;r diesen Zweck hei&szlig;t <b>Datenblattformular-Erstellen<\/b> und kann beispielsweise wie folgt aufgerufen werden:<\/p>\n<pre>DatenblattformularErstellen \"sfmArtikelUebersicht\",  \"tblArtikel\", 2000<\/pre>\n<p>Damit erstellen wir ein Formular in der Datenblattansicht, das wir prima f&uuml;r das folgende Beispiel nutzen k&ouml;nnen.<\/p>\n<h2>Unterformular hinzuf&uuml;gen<\/h2>\n<p>Wenn Sie einem Formular ein Unterformular-Steuerelement hinzuf&uuml;gen m&ouml;chten und in diesem ein Unterformular anzeigen wollen, m&uuml;ssen Sie zwei Formulare erstellen &#8211; eines als Haupt- und eines als Unterformular. Das Unterformular zeigt seine Daten normalerweise in der Datenblattansicht an, w&auml;hrend das Hauptformular in der Formularansicht erscheint. Also k&ouml;nnen wir als Unterformular prima ein mit der Prozedur <b>Datenblattformular-Erstellen <\/b>angelegtes Formular nutzen. Daher bauen wir diese Prozedur in die nachfolgend vorgestellte Prozedur <b>FormularMitUnterformular <\/b>ein (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FormularMitUnterformular(strForm<span style=\"color:blue;\"> As String<\/span>, strSubform<span style=\"color:blue;\"> As String<\/span>, strRecordsource<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>sfm<span style=\"color:blue;\"> As <\/span>SubForm\r\n     DoCmd.Close acForm, strForm\r\n     <span style=\"color:blue;\">Set<\/span> frm = GetNewForm(strForm)\r\n     DatenblattformularErstellen strSubform, strRecordsource, 2000\r\n     DoCmd.Close acForm, strSubform, acSaveYes\r\n     frm.DividingLines = <span style=\"color:blue;\">False<\/span>\r\n     frm.NavigationButtons = <span style=\"color:blue;\">False<\/span>\r\n     frm.RecordSelectors = <span style=\"color:blue;\">False<\/span>\r\n     frm.ScrollBars = <span style=\"color:blue;\">False<\/span>\r\n     frm.AutoCenter = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> sfm = CreateControl(strForm, acSubform, acDetail, , , 100, 100, frm.Width - 200, frm.Section(0).Height - 200)\r\n     sfm.Name = \"sfm\"\r\n     sfm.HorizontalAnchor = acHorizontalAnchorBoth\r\n     sfm.VerticalAnchor = acVerticalAnchorBoth\r\n     sfm.SourceObject = strSubform\r\n     DoCmd.OpenForm strForm\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Erstellen eines Formulars mit Unterformular<\/span><\/b><\/p>\n<p>Diese Prozedur haben wir auch gleich mit Parametern versehen:<\/p>\n<ul>\n<li><b>strForm<\/b>: Name des Hauptformulars<\/li>\n<li><b>strSubform<\/b>: Name des Unterformulars<\/li>\n<li><b>strRecordsource<\/b>: Datensatzquelle f&uuml;r das Unterformular<\/li>\n<\/ul>\n<p>Die Prozedur schlie&szlig;t zun&auml;chst ein gegebenenfalls noch ge&ouml;ffnetes Formular mit dem Namen aus <b>strForm<\/b> und erstellt dieses dann mit der Prozedur <b>GetNewForm <\/b>neu. Dann erstellt sie mit der zuvor beschriebenen Prozedur <b>DatenblattformularErstellen <\/b>das Unterformular, wobei sie die beiden Parameter <b>strSubform <\/b>und <b>strRecordsource <\/b>an diese Prozedur &uuml;bergibt. Anschlie&szlig;end schlie&szlig;t sie dieses frisch erstellte Unterformular.<\/p>\n<p>F&uuml;r das mit <b>frm <\/b>referenzierte Hauptformular stellt die Prozedur dann die Eigenschaften <b>DividingLines <\/b>(<b>Trennlinien<\/b>), <b>NavigationButtons <\/b>(<b>Navigationsschaltfl&auml;chen<\/b>), <b>RecordSelectors <\/b>(<b>Datensatzmarkierer<\/b>) und <b>ScrollBars <\/b>(<b>Bildlaufleisten<\/b>) auf <b>False <\/b>ein sowie die Eigenschaft <b>AutoCenter <\/b>(<b>Automatisch zentrieren<\/b>) auf <b>True<\/b>.<\/p>\n<p>Anschlie&szlig;end erstellt sie mit der <b>CreateControl<\/b>-Methode ein neues Unterformular-Steuerelement. Dabei verwenden wir den Namen aus <b>strForm<\/b>, den Typ <b>acSubform <\/b>und als Zielbereich <b>acDetail<\/b>. Den Abstand vom linken und oberen Rand sowie die H&ouml;he und die Breite stellen wir diesmal so ein, dass das Unterformular-Steuerelement von allen R&auml;ndern einen Abstand von 100 Twips hat. F&uuml;r den Abstand vom linken und oberen Rand ist das einfach, aber f&uuml;r den gleichen Abstand vom rechten und unteren Rand m&uuml;ssen wir die Werte f&uuml;r die Parameter <b>Width <\/b>und <b>Height <\/b>noch berechnen.<\/p>\n<p>Bei der Breite ist es einfach: Wir nehmen einfach die Breite des Formulars (<b>frm.Width<\/b>) und ziehen dort 200 Twips ab &#8211; jeweils 100 f&uuml;r den Abstand vom linken und vom rechten Rand. F&uuml;r die H&ouml;he k&ouml;nnen wir nicht einfach die Eigenschaft <b>Height <\/b>des <b>Form<\/b>-Elements nehmen &#8211; die gibt es schlichtweg nicht.<\/p>\n<p>Hier ben&ouml;tigen wir die H&ouml;he des Bereichs, in dem wir das Unterformular-Steuerelement einf&uuml;gen wollen. Diesen referenzieren wir mit <b>frm.Section(acDetail) <\/b>und erhalten die H&ouml;he mit der <b>Height<\/b>-Eigenschaft dieses Bereichs.<\/p>\n<p>Anschlie&szlig;end weist die Prozedur dem Unterformular-Steuerelement den Namen <b>sfm <\/b>zu und stellt die beiden Eigenschaften <b>HorizontalAnchor <\/b>(<b>Horizontaler Anker<\/b>) und <b>VerticalAnchor <\/b>(<b>Vertikaler Anker<\/b>) auf die Werte <b>acHorizontalAnchorBoth <\/b>und <b>acVerticalAnchorBoth <\/b>ein.<\/p>\n<p>Die wichtigste Einstellung ist jedoch die Eigenschaft <b>SourceObject <\/b>des Unterformular-Steuerelements. Diesem weisen wir den Namen des als Unterformular anzuzeigenden Formulars zu. Schlie&szlig;lich &ouml;ffnet die Prozedur das neu erstellte Formular in der Formularansicht.<\/p>\n<p>In der Entwurfsansicht sieht das Ergebnis wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_007.png\" alt=\"Entwurf des Formulars mit Unterformular\" width=\"424,5589\" height=\"402,5447\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Entwurf des Formulars mit Unterformular<\/span><\/b><\/p>\n<h2>Formular und Unterformular mit 1:n-Beziehung erstellen<\/h2>\n<p>Damit gehen wir noch einen Schritt weiter, indem wir das Hauptformular auch noch an eine Tabelle binden und dessen Daten im Hauptformular anzeigen. Die Tabellen der Daten im Haupt- und im Unterformular sollen in einer 1:n-Beziehung stehen und wir wollen daf&uuml;r sorgen, dass das Unterformular nur die zu dem aktuell im Hauptformular angezeigten Datensatz passen.<\/p>\n<p>Als Beispiel verwenden wir f&uuml;r das Hauptformular die Tabelle <b>tblKategorien <\/b>und f&uuml;r das Unterformular die Tabelle <b>tlbArtikel<\/b>.<\/p>\n<p>Diese Prozedur funktioniert &uuml;brigens nur, wenn sowohl das Hauptformular als auch das Unterformular Tabellen als Datensatzquellen verwenden &#8211; mit Abfragen oder SQL-Ausdr&uuml;cken funktioniert es nicht. Die Erkl&auml;rung daf&uuml;r finden Sie weiter unten.<\/p>\n<p>Die Prozedur <b>FormularMitUnterformular_1n <\/b>finden Sie in Listing 3. Sie erwartet vier Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FormularMitUnterformular_1n(strForm<span style=\"color:blue;\"> As String<\/span>, strSubform<span style=\"color:blue;\"> As String<\/span>, strRecordsourceForm<span style=\"color:blue;\"> As String<\/span>, _\r\n         strRecordsourceSubform<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>sfm<span style=\"color:blue;\"> As <\/span>SubForm\r\n     <span style=\"color:blue;\">Dim <\/span>lngTop<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctlBottom<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>strLinkChildFields<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLinkMasterFields<span style=\"color:blue;\"> As String<\/span>\r\n     DetailformularErstellen strForm, strRecordsourceForm\r\n     DatenblattformularErstellen strSubform, strRecordsourceSubform, 2000\r\n     DoCmd.Close acForm, strSubform, acSaveYes\r\n     <span style=\"color:blue;\">Set<\/span> frm = Forms(strForm)\r\n     frm.AutoCenter = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ctlBottom = frm.Controls(frm.Controls.Count - 1)\r\n     lngTop = ctlBottom.Top + ctlBottom.Height + 100\r\n     <span style=\"color:blue;\">Set<\/span> sfm = CreateControl(strForm, acSubform, acDetail, , , 100, lngTop, frm.Width - 200, _\r\n         frm.Section(0).Height - lngTop - 100)\r\n     sfm.Name = \"sfm\"\r\n     sfm.HorizontalAnchor = acHorizontalAnchorBoth\r\n     sfm.VerticalAnchor = acVerticalAnchorBoth\r\n     sfm.SourceObject = strSubform\r\n     GetLinkedFields strRecordsourceForm, strRecordsourceSubform, strLinkChildFields, strLinkMasterFields\r\n     sfm.LinkChildFields = strLinkChildFields\r\n     sfm.LinkMasterFields = strLinkMasterFields\r\n     DoCmd.OpenForm strForm\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Erstellen eines Formulars mit Unterformular f&uuml;r per 1:n-Beziehung verkn&uuml;pfte Tabellen<\/span><\/b><\/p>\n<ul>\n<li><b>strForm<\/b>: Name des Hauptformulars<\/li>\n<li><b>strSubform<\/b>: Name des Unterformulars<\/li>\n<li><b>strRecordsourceForm<\/b>: Datensatzquelle f&uuml;r das Hauptformular<\/li>\n<li><b>strRecordsourceSubform<\/b>: Datensatzquelle f&uuml;r das Unterformular<\/li>\n<\/ul>\n<p>Wir gehen f&uuml;r die folgende Beschreibung davon aus, dass wir die Prozedur <b>FormularMitUnterformular_1n <\/b>mit den Parametern in der folgenden Anweisung aufgerufen haben:<\/p>\n<pre>FormularMitUnterformular_1n \"frmKategorienUndArtikel\",  \"sfmKategorienUndArtikel\", \"tblKategorien\", \"tblArtikel\"<\/pre>\n<p>Wir wollen also ein Hauptformular namens <b>frmKategorienUndArtikel <\/b>erstellen, das die Daten der Tabelle <b>tblKategorien <\/b>anzeigt, und ein Unterformular namens <b>sfmKategorienUndArtikel<\/b>, das die Daten der Tabelle <b>tblArtikel <\/b>anzeigt. Und dabei wollen wir auch noch erreichen, dass die Daten im Unterformular nach dem aktuell im Hauptformular angezeigten Datensatz gefiltert werden.<\/p>\n<p>Dazu nutzt diese Prozedur die beiden zuvor beschriebenen Prozeduren <b>DetailformularErstellen <\/b>und <b>DatenblattformularErstellen<\/b>, um das Haupt- und das Unterformular zu erstellen. Als Ergebnis des Aufrufs der Prozedur <b>DetailformularErstellen <\/b>mit den Werten <b>frmKategorienUndArtikel <\/b>und <b>tblKategorien <\/b>als Parameter erhalten wir das Formular <b>frmKategorienArtikel<\/b>, das im Entwurf wie in Bild 8 aussieht und die Felder der Tabelle <b>tblKategorien<\/b> anzeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_008.png\" alt=\"Entwurf des Hauptformulars\" width=\"424,5589\" height=\"238,6086\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Entwurf des Hauptformulars<\/span><\/b><\/p>\n<p>Das Feld <b>Abbildung <\/b>enth&auml;lt noch ein OLE-Objekt. Um zu verhindern, dass dieses ebenfalls als Textfeld und &uuml;berhaupt abgebildet wird, k&ouml;nnten wir noch eine genauere Behandlung des <b>Else<\/b>-Zweigs der <b>Select Case<\/b>-Bedingung in der Prozedur <b>DetailformularErstellen <\/b>unterbringen, mit dem auch andere Felddatentypen wie Anlagefeld etc. behandelt werden. Dies lassen wir jedoch hier aus, bei Bedarf l&ouml;schen Sie solche Felder nachtr&auml;glich oder passen den Code gegebenenfalls selbst noch an.<\/p>\n<p>Der Prozedur <b>DatenblattformularErstellen <\/b>&uuml;bergeben wir mit den Parametern die Werte <b>sfmKategorienUndArtikel <\/b>sowie <b>tblArtikel<\/b>. Damit erstellt die Prozedur das Formular, dass wir als Unterformular nutzen wollen (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_009.png\" alt=\"Entwurf des Unterformulars\" width=\"424,5589\" height=\"320,6688\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Entwurf des Unterformulars<\/span><\/b><\/p>\n<p>Danach schlie&szlig;t die Prozedur das von <b>DatenblattformularErstellen <\/b>noch offen gelassene Formular <b>sfmKategorienUndArtikel<\/b>. Das zuk&uuml;nftige Hauptformular <b>frmKategorienUndArtikel <\/b>lassen wir hingegen ge&ouml;ffnet, da wir dieses direkt weiterbearbeiten wollen, und referenzieren es mit der Variablen <b>frm<\/b>.<\/p>\n<p>Wir stellen die Eigenschaft <b>AutoCenter <\/b>(<b>Automatisch zentrieren<\/b>) des Formulars auf <b>True <\/b>ein. Au&szlig;erdem ermitteln wir das zuletzt angelegte Steuerelement im Formular, und zwar indem wir die Anzahl der Steuerelemente ermitteln (<b>frm.Controls.Count<\/b>) und diesen Wert minus <b>1 <\/b>als Index f&uuml;r den Zugriff auf das entsprechende Steuerelement nutzen.<\/p>\n<p>Dieses Steuerelement referenzieren wir mit der Variablen <b>ctlBottom<\/b>. Wozu ben&ouml;tigen wir dieses Steuerelement Weil wir das Unterformular-Steuerelement unter dem untersten Steuerelement anlegen wollen und dazu dessen Abstand vom oberen Rand des Formularbereichs plus der H&ouml;he plus einem zus&auml;tzlichen Abstand ben&ouml;tigen.<\/p>\n<p>Diesen Wert ermitteln wir dann mit <b>ctlBottom.Top + ctlBottom.Height + 100 <\/b>und speichern ihn in <b>lngTop<\/b>.<\/p>\n<p>Das sind schon alle Informationen, die wir zum Anlegen des Unterformular-Steuerelements ben&ouml;tigen. Dieses legen wir dann mit der Methode <b>CreateControl <\/b>in <b>strForm <\/b>als Element des Typs <b>acSubform <\/b>im Bereich <b>acDetail <\/b>an. Der Abstand vom linken Rand ist 100 Twips, vom oberen Rand des Bereichs <b>lngTop<\/b>, die Breite entspricht der Formularbreite minus 200 Twips, die H&ouml;he entspricht der H&ouml;he des Detailbereichs minus <b>lngTop <\/b>als Abstand von oben minus 100 Twips als Abstand vom unteren Rand.<\/p>\n<p>Den Namen des Unterformular-Steuerelements legen wir auf <b>sfm <\/b>fest. Au&szlig;erdem soll das Steuerelement horizontal und vertikal verankert werden, damit es sich beim &Auml;ndern der Gr&ouml;&szlig;e des Formulars an diese anpasst &#8211; dazu nutzen wir die Eigenschaften <b>HorizontalAnchor <\/b>mit dem Wert <b>acHorizontalAnchorBoth <\/b>und <b>VerticalAnchor <\/b>mit dem Wert <b>acVerticalAnchorBoth<\/b>.<\/p>\n<p>Nun stellen wir die Eigenschaft <b>SourceObject <\/b>des Unterformular-Steuerelements <b>sfm <\/b>auf den Namen des ebenfalls neu erstellten Unterformulars ein, hier auf <b>sfmKategorienUndArtikel<\/b>. Das ist soweit noch aus dem vorherigen Beispiel bekannt, aber jetzt wird es spannend:<\/p>\n<p>Das Unterformular zeigt jetzt zwar schon die Daten der Tabelle <b>tblArtikel <\/b>an, aber diese werden noch nicht nach der im Hauptformular angezeigten Kategorie gefiltert. Wir k&ouml;nnen die Kategorie im Hauptformular wechseln, aber das Unterformular zeigt immer die Datens&auml;tze aus allen Kategorien an (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_012.png\" alt=\"Das Unterformular mit Hauptformular in der Formularansicht\" width=\"424,5589\" height=\"370,3771\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Das Unterformular mit Hauptformular in der Formularansicht<\/span><\/b><\/p>\n<p>Damit die Datens&auml;tze im Unterformular nach der Kategorie im Hauptformular gefiltert werden, m&uuml;ssen wir die beiden Eigenschaften <b>Verkn&uuml;pft von <\/b>und <b>Verkn&uuml;pft nach <\/b>des Unterformular-Steuerelements einstellen, und zwar auf die beiden an der Beziehung zwischen den Tabellen <b>tblKategorien <\/b>und <b>tblArtikel <\/b>beteiligten Felder &#8211; in diesem Fall das Prim&auml;rschl&uuml;sselfeld <b>KategorieID <\/b>der Tabelle <b>tblKategorien <\/b>und das Fremdschl&uuml;sselfeld <b>KategorieID <\/b>der Tabelle <b>tblArtikel<\/b>.<\/p>\n<h2>Verkn&uuml;pfungsfelder ermitteln<\/h2>\n<p>Diese sind allerdings nicht ohne weiteres herauszufinden &#8211; dazu m&uuml;ssen wir uns die Beziehungen ansehen, die zwischen den beiden Tabellen <b>tblArtikel <\/b>und <b>tblKategorien <\/b>bestehen und die Felder identifizieren, die daran beteiligt sind.<\/p>\n<p>Das erledigen wir mit einer Prozedur namens <b>GetLinkedFields<\/b> (siehe Listing 4), die vier Parameter entgegennimmt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GetLinkedFields(strRecordsourceForm<span style=\"color:blue;\"> As String<\/span>, strRecordsourceSubform<span style=\"color:blue;\"> As String<\/span>, _\r\n        strLinkChildFields<span style=\"color:blue;\"> As String<\/span>, strLinkMasterFields<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rel<span style=\"color:blue;\"> As <\/span>DAO.Relation\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     For Each rel In db.Relations\r\n         <span style=\"color:blue;\">If <\/span>rel.ForeignTable = strRecordsourceSubform And rel.Table = strRecordsourceForm<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> fld = rel.Fields(0)\r\n             strLinkChildFields = fld.ForeignName\r\n             strLinkMasterFields = fld.Name\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> rel\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Ermitteln der Felder, &uuml;ber die eine 1:n-Beziehung herstellt wurde<\/span><\/b><\/p>\n<ul>\n<li><b>strRecordsourceForm<\/b>: Datensatzquelle des Hauptformulars<\/li>\n<li><b>strRecordsourceSubform<\/b>: Datensatzquelle des Unterformulars<\/li>\n<li><b>strLinkChildFields<\/b>: R&uuml;ckgabeparameter f&uuml;r den zu ermittelnden Wert f&uuml;r die Eigenschaft <b>Verkn&uuml;pfen von<\/b><\/li>\n<li><b>strLinkMasterFields<\/b>: R&uuml;ckgabeparameter f&uuml;r den zu ermittelnden Wert f&uuml;r die Eigenschaft <b>Verkn&uuml;pfen nach<\/b><\/li>\n<\/ul>\n<p>Um die Namen der beiden Felder zu ermitteln, verwenden wir die <b>Relations<\/b>-Auflistung des <b>Database<\/b>-Objekts der aktuellen Datenbank. Die <b>Relation<\/b>-Objekte dieser Auflistung durchlaufen wir in einer <b>For Each<\/b>-Schleife und referenzieren das aktuelle Objekt jeweils mit der Variablen <b>rel <\/b>mit dem Typ <b>Relation<\/b>.<\/p>\n<p>In der Schleife pr&uuml;fen wir, ob die Eigenschaft <b>ForeignTable <\/b>des <b>Relation<\/b>-Objekts mit der Datensatzquelle aus dem Unterformular &uuml;bereinstimmt und die Eigenschaft Table mit der Datensatzherkunft des Hauptformulars. Dies ist &uuml;brigens der Grund, warum die Prozedur <b>FormularMitUnterformular_1n <\/b>nur mit Tabellen als Datensatzquelle in Haupt- und Unterformular funktioniert.<\/p>\n<p>Hat die Prozedur ein <b>Relation<\/b>-Objekt gefunden, das zu den im Haupt- und Unterformular als Datensatzquelle verwendeten Tabellen passt, stellen wir die <b>Field<\/b>-Variable <b>fld <\/b>auf das erste Feld der <b>Fields<\/b>-Auflistung des <b>Relation<\/b>-Objekts ein.<\/p>\n<p>Dieses liefert &uuml;ber die Eigenschaften <b>ForeignName <\/b>und <b>Name <\/b>die Bezeichnungen der an der Beziehung beteiligten Felder, die wir den R&uuml;ckgabeparametern <b>strLinkChildFields <\/b>und <b>strLinkMasterFields <\/b>zuweisen. Nach dem Auffinden des passenden <b>Relation<\/b>-Objekts k&ouml;nnen wir die Prozedur bereits verlassen.<\/p>\n<h2>Verkn&uuml;pfungseigenschaften des Unterformular-Steuerelements einstellen<\/h2>\n<p>Damit geht es weiter in der Prozedur <b>FormularMitUnterformular_1n<\/b>, wo wir die gefundenen Werte den Eigenschaften <b>LinkChildFields <\/b>und <b>LinkMasterFields <\/b>zuweisen. Im Entwurf sieht das Formular nun bereits wie in Bild 11 aus &#8211; die f&uuml;r das Filtern der Daten im Unterformular ben&ouml;tigten Eigenschaften sind also wie gew&uuml;nscht gef&uuml;llt worden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_010.png\" alt=\"Verkn&uuml;pfungseigenschaften des Unterformular-Steuerelements\" width=\"599,559\" height=\"471,4713\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Verkn&uuml;pfungseigenschaften des Unterformular-Steuerelements<\/span><\/b><\/p>\n<p>Anschlie&szlig;end &ouml;ffnet die Prozedur das Formular noch in der Formularansicht, die nun die Daten im Unterformular nach der im Hauptformular ausgew&auml;hlten Kategorie filtert (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_013.png\" alt=\"Daten im Unterformular gefiltert nach der Kategorie im Hauptformular\" width=\"499,5589\" height=\"407,0176\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Daten im Unterformular gefiltert nach der Kategorie im Hauptformular<\/span><\/b><\/p>\n<h2>Schaltfl&auml;chen erstellen<\/h2>\n<p>Eine Schaltfl&auml;che zu erstellen ist verglichen mit den zuvor erstellten Steuerelementen wie Textfeldern oder Bezeichnungsfeldern keine Raketentechnik, aber es ist doch ein zus&auml;tzlicher Schritt notwendig: Sie m&uuml;ssen eine Ereignisprozedur anlegen, sonst ergibt es nur wenig Sinn, eine Schaltfl&auml;che zu erzeugen. <\/p>\n<p>Ein Formular mit einer einfachen Schaltfl&auml;che erstellen wir mit der Prozedur aus Listing 5.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FormularMitSchaltflaeche()\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>strForm<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>CommandButton\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>lngLine<span style=\"color:blue;\"> As Long<\/span>\r\n     strForm = \"frmMitSchaltflaeche\"\r\n     DoCmd.Close acForm, strForm\r\n     <span style=\"color:blue;\">Set<\/span> frm = GetNewForm(strForm, , <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">Set<\/span> cmd = CreateControl(frm.Name, acCommandButton, acFooter, , , 100, 100, 1000, 400)\r\n     frm.Section(acFooter).Height = 600\r\n     cmd.Name = \"cmdOK\"\r\n     cmd.Caption = \"OK\"\r\n     cmd.OnClick = \"[Event Procedure]\"\r\n     frm.HasModule = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject.VBComponents(\"Form_\" & frm.Name).CodeModule\r\n     lngLine = objCodeModule.CreateEventProc(\"Click\", \"cmdOK\")\r\n     objCodeModule.ReplaceLine lngLine + 1, \"   <span style=\"color:blue;\">MsgBox<\/span> \"\"Test\"\"\"\r\n     DoCmd.OpenForm frm.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Erstellen eines Formulars mit Schaltfl&auml;che und Ereignisprozedur<\/span><\/b><\/p>\n<p>Die Prozedur nutzt den Parameter <b>bolFooter <\/b>der Routine <b>GetNewForm <\/b>zum Einblenden des Formularfu&szlig;bereichs. In diesem wollen wir die neue Schaltfl&auml;che erstellen und geben dazu als dritten Parameter diesmal nicht <b>acDetail<\/b>, sondern <b>acFooter <\/b>an.<\/p>\n<p>Der Abstand vom oberen und rechten Rand des Bereichs soll 100 Twips betragen, die Breite 1000 Twips und die H&ouml;he 400 Twips. Die H&ouml;he des Fu&szlig;bereichs stellen wir auf den Wert 600 Twips ein, damit der Abstand der Schaltfl&auml;che vom oberen und vom unteren Rand dieses Bereichs gleich ist. Schlie&szlig;lich weisen wir der Schaltfl&auml;che noch den Namen <b>cmdOK <\/b>und die Beschriftung <b>OK <\/b>zu, bevor wir uns an die Ereignisprozedur heranwagen.<\/p>\n<p>Hier stellen wir zun&auml;chst den Wert der Eigenschaft <b>OnClick <\/b>auf <b>[Event Procedure] <\/b>ein. Dies entspricht dem Einstellen der Eigenschaft <b>Beim Klicken <\/b>im Eigenschaftenblatt auf den Wert <b>[Ereignisprozedur]<\/b>.<\/p>\n<p>Damit haben wir allerdings noch nicht die Ereignisprozedur an sich erstellt, und genau genommen gibt es noch nicht einmal ein Klassenmodul f&uuml;r das Formular. Dennoch gibt es ein Zwischenergebnis &#8211; siehe Bild 13.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_011.png\" alt=\"Ereignisprozedur f&uuml;r die Schaltfl&auml;che\" width=\"574,559\" height=\"368,0768\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Ereignisprozedur f&uuml;r die Schaltfl&auml;che<\/span><\/b><\/p>\n<h2>Ereignisprozedur erstellen<\/h2>\n<p>Das Hinzuf&uuml;gen einer Ereignisprozedur erfordert einen Verweis auf die Bibliothek <b>Microsoft Visual Basic for Applications Extensibility 5.3 Object Library<\/b>, den Sie im <b>Verweise<\/b>-Dialog des VBA-Editors hinzuf&uuml;gen k&ouml;nnen (Men&uuml;eintrag <b>Extras|Verweise<\/b>).<\/p>\n<p>Wie Sie Ereignisprozeduren zu einem Modul eines Projekts hinzuf&uuml;gen, erfahren Sie im Detail im Beitrag <b>VBA-Code manipulieren mit der CodeModule-Klasse <\/b>(<b>www.access-im-unternehmen.de\/****<\/b>).<\/p>\n<p>Die erste Anweisung nach der Anweisung zum Hinzuf&uuml;gen des Klassenmoduls des Formulars referenziert das <b>CodeModule<\/b>-Objekt des Klassenmoduls. Dabei stellt es den Modulnamen aus <b>Form_ <\/b>und dem Formularnamen zusammen. Dann erstellt es mit <b>CreateEventProc <\/b>eine neue Ereignisprozedur des Typs <b>Click <\/b>f&uuml;r das Element <b>cmdOK <\/b>und speichert die davon zur&uuml;ckgegebene Position der ersten Zeile der Prozedur in der Variablen <b>lngLine<\/b>.<\/p>\n<p>Die Ereignisprozedur sieht nun wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Angabe der Zeile nutzt sie dann, um die auf diese folgende Zeile mit dem Aufruf einer <b>MsgBox <\/b>zu ersetzen. Schlie&szlig;lich &ouml;ffnet sie das neu erstellte Formular mit der <b>OpenForm<\/b>-Methode. Das Ergebnis sehen sie in Bild 14.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1336_014.png\" alt=\"Ein per VBA erstelltes Formular mit Meldung\" width=\"424,5589\" height=\"260,8145\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Ein per VBA erstelltes Formular mit Meldung<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag hat gezeigt, wie Sie zu zuvor frisch erstellten Formularen ebenso frische Steuerelemente hinzuf&uuml;gen. Dabei haben wir nicht nur einfache Steuerelemente hinzugef&uuml;gt, sondern uns speziell um die Konstellationen zur Darstellung von Daten gek&uuml;mmert &#8211; also einfache Detailformulare, Formulare mit Unterformularen ohne Bindung untereinander und Formulare mit Unterformularen, in denen die Daten von Haupt- und Unterformular per m:n-Beziehung verkn&uuml;pft sind.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SteuerelementePerVBAErstellen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/BE9B00E8-3397-4D04-8063-37D2BDA0D472\/aiu_1336.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Formulare per VBA erstellen&#8220; (www.access-im-unternehmen.de\/1332) haben wir gezeigt, wie Sie per VBA ein neues, leeres Formular erstellen und seine Eigenschaften einstellen. Darauf wollen wir in diesem Beitrag aufbauen und zeigen, wie Sie dem Formular per VBA die gew&uuml;nschten Steuerelemente hinzuf&uuml;gen k&ouml;nnen. Und auch Steuerelemente haben eine Menge Eigenschaften, die wir nach dem Anlegen einstellen m&uuml;ssen &#8211; Position, Aussehen und auch wieder Ereigniseigenschaften. Nach der Lekt&uuml;re des vorliegenden Beitrags haben Sie alle Werkzeuge, die Sie brauchen, um beispielsweise Access-Add-Ins zu nutzen, um einer Anwendung neue Formulare und Steuerelemente hinzuzuf&uuml;gen.<\/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":[66022022,662022,44000025],"tags":[],"class_list":["post-55001336","post","type-post","status-publish","format-standard","hentry","category-66022022","category-662022","category-VBA_und_Programmiertechniken"],"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>Steuerelemente per VBA erstellen - 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\/Steuerelemente_per_VBA_erstellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Steuerelemente per VBA erstellen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Formulare per VBA erstellen&quot; (www.access-im-unternehmen.de\/1332) haben wir gezeigt, wie Sie per VBA ein neues, leeres Formular erstellen und seine Eigenschaften einstellen. Darauf wollen wir in diesem Beitrag aufbauen und zeigen, wie Sie dem Formular per VBA die gew&uuml;nschten Steuerelemente hinzuf&uuml;gen k&ouml;nnen. Und auch Steuerelemente haben eine Menge Eigenschaften, die wir nach dem Anlegen einstellen m&uuml;ssen - Position, Aussehen und auch wieder Ereigniseigenschaften. Nach der Lekt&uuml;re des vorliegenden Beitrags haben Sie alle Werkzeuge, die Sie brauchen, um beispielsweise Access-Add-Ins zu nutzen, um einer Anwendung neue Formulare und Steuerelemente hinzuzuf&uuml;gen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-10T18:31:20+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/6e6646c6832943f289aa644a441110c5\" \/>\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=\"28\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Steuerelemente per VBA erstellen\",\"datePublished\":\"2022-05-10T18:31:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/\"},\"wordCount\":4832,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6e6646c6832943f289aa644a441110c5\",\"articleSection\":[\"2\\\/2022\",\"2022\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/\",\"name\":\"Steuerelemente per VBA erstellen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6e6646c6832943f289aa644a441110c5\",\"datePublished\":\"2022-05-10T18:31:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6e6646c6832943f289aa644a441110c5\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6e6646c6832943f289aa644a441110c5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_per_VBA_erstellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Steuerelemente per VBA erstellen\"}]},{\"@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":"Steuerelemente per VBA erstellen - 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\/Steuerelemente_per_VBA_erstellen\/","og_locale":"de_DE","og_type":"article","og_title":"Steuerelemente per VBA erstellen","og_description":"Im Beitrag \"Formulare per VBA erstellen\" (www.access-im-unternehmen.de\/1332) haben wir gezeigt, wie Sie per VBA ein neues, leeres Formular erstellen und seine Eigenschaften einstellen. Darauf wollen wir in diesem Beitrag aufbauen und zeigen, wie Sie dem Formular per VBA die gew&uuml;nschten Steuerelemente hinzuf&uuml;gen k&ouml;nnen. Und auch Steuerelemente haben eine Menge Eigenschaften, die wir nach dem Anlegen einstellen m&uuml;ssen - Position, Aussehen und auch wieder Ereigniseigenschaften. Nach der Lekt&uuml;re des vorliegenden Beitrags haben Sie alle Werkzeuge, die Sie brauchen, um beispielsweise Access-Add-Ins zu nutzen, um einer Anwendung neue Formulare und Steuerelemente hinzuzuf&uuml;gen.","og_url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-05-10T18:31:20+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/6e6646c6832943f289aa644a441110c5","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"28\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Steuerelemente per VBA erstellen","datePublished":"2022-05-10T18:31:20+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/"},"wordCount":4832,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/6e6646c6832943f289aa644a441110c5","articleSection":["2\/2022","2022","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/","url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/","name":"Steuerelemente per VBA erstellen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/6e6646c6832943f289aa644a441110c5","datePublished":"2022-05-10T18:31:20+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/6e6646c6832943f289aa644a441110c5","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/6e6646c6832943f289aa644a441110c5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_per_VBA_erstellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Steuerelemente per VBA erstellen"}]},{"@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\/55001336","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=55001336"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001336\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001336"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001336"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}