{"id":55001595,"date":"2026-04-01T00:00:00","date_gmt":"2026-03-05T20:56:47","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1595"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Form_und_Subform_in_der_Datenblattansicht_per_Wizard","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/","title":{"rendered":"Form und Subform in der Datenblattansicht per Wizard"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/643405e06e684afea841a64d05a6e3ad\" width=\"1\" height=\"1\" alt=\"\"><b>Eine immer wiederkehrende Aufgabe in meinem Programmieralltag ist das Erstellen von Formularen, die ein Unterformular mit Daten in der Datenblattansicht enthalten. Das umfasst einige Schritte, die ich immer wieder manuell durchgef&uuml;hrt habe. Bis ich die L&ouml;sung f&uuml;r diesen Beitrag programmiert habe. Einen Assistenten, den ich starte, statt im Ribbon den Befehl zum Erstellen eines neuen, leeren Formulars in der Entwurfsansicht aufzurufen. Und der lediglich eine Information ben&ouml;tigt: Welche Tabelle oder Abfrage soll die Daten f&uuml;r das Unterformular bereitstellen? Das Ganze in einem Assistenten verpackt, der in jeder ge&ouml;ffneten Access-Datenbank per Mausklick gestartet werden kann. Nachfolgend finden Sie die Anleitung, wie ich diesen Assistenten erstellt habe und wie er funktioniert.<\/b><\/p>\n<p>Die Anzeige der Daten einer Tabelle oder Abfrage in einem Unterformular wird oft ben&ouml;tigt. Das Unterformular zeigt die Daten in der Datenblattansicht an. Im Hauptformular kann man beliebige Steuerelemente zum Bearbeiten oder Hinzuf&uuml;gen von Datens&auml;tzen, zum Anzeigen eines Detailformulars zum ausgew&auml;hlten Datensatz, zum L&ouml;schen von Datens&auml;tzen oder zum Filtern oder Sortieren der Datens&auml;tze anzeigen.<\/p>\n<p>Die Anzeige der Daten in der Datenblattansicht erm&ouml;glicht au&szlig;erdem die Nutzung der Filter- und Sortierm&ouml;glichkeiten dieser Ansicht. Zudem k&ouml;nnen wir Spalten anordnen oder ein- und ausblenden.<\/p>\n<p>Das Anlegen einer solchen Kombination aus Haupt- und Unterformular erfordert einige Schritte, die wir nachfolgend auflisten:<\/p>\n<ul>\n<li>Anlegen des Unterformulars<\/li>\n<li>Zuweisen der Datensatzquelle f&uuml;r das Formular <\/li>\n<li>Hinzuf&uuml;gen der anzuzeigenden Felder <\/li>\n<li>Einstellen der Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt<\/b><\/li>\n<li>Speichern des Unterformulars unter dem gew&uuml;nschten Namen<\/li>\n<li>Anlegen des Hauptformulars<\/li>\n<li>Einf&uuml;gen des Unterformulars<\/li>\n<li>Einstellen weiterer Eigenschaften des Hauptformulars, zum Beispiel <b>Automatisch zentrieren <\/b>auf <b>Ja<\/b>, <b>Bildlaufleisten <\/b>auf <b>Keine<\/b>, <b>Datensatzmarkierer <\/b>und <b>Navigationsschaltfl&auml;chen <\/b>auf <b>Nein<\/b>.<\/li>\n<li>Einstellen der Verankerung des Unterformular-Steuerelements, sodass sich seine Gr&ouml;&szlig;e beim Vergr&ouml;&szlig;ern des Hauptformulars ebenfalls &auml;ndert<\/li>\n<li>Speichern des Hauptformulars unter dem gew&uuml;nschten Namen<\/li>\n<\/ul>\n<p>Diese Schritte habe ich in der Vergangenheit hunderte, wenn nicht tausende Male durchgef&uuml;hrt. Also beschloss ich, einen Wizard zu programmieren, der mit diese immer wiederkehrenden Schritte abnimmt und ein Formular wie das aus Bild 1 schnell erstellt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_001.png\" alt=\"Formular mit Unterformular in der Datenblattansicht\" width=\"424,5589\" height=\"423,7424\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular mit Unterformular in der Datenblattansicht<\/span><\/b><\/p>\n<p>Damit ist eine Basis geschaffen, der ich dann die weiteren Steuerelemente hinzuf&uuml;gen kann.<\/p>\n<h2>Funktionsweise des Wizards<\/h2>\n<p>Der Wizard wird einfach &uuml;ber den Eintrag <b>Formular-Assistent <\/b>im Ribbon aufgerufen. Dies zeigt alle verf&uuml;gbaren Assistenten an (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_002.png\" alt=\"Unser Assistent in der Liste der Formular-Assistenten\" width=\"700\" height=\"401,8517\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Unser Assistent in der Liste der Formular-Assistenten<\/span><\/b><\/p>\n<p>Hier w&auml;hlen wir unseren Assistenten aus und selektieren die Datensatzquelle f&uuml;r das zu erstellende Formular. Diese ist bereits voreingestellt, wenn beim Aufrufen des Assistenten schon eine Tabelle oder Abfrage im Navigationsbereich ausgew&auml;hlt war.<\/p>\n<p>Danach erscheint unser selbst programmiertes Formular, mit dem wir weitere Details festlegen k&ouml;nnen (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_003.png\" alt=\"Der Wizard zum Erstellen von Unterformularen in der Datenblattansicht\" width=\"499,5589\" height=\"346,8635\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Der Wizard zum Erstellen von Unterformularen in der Datenblattansicht<\/span><\/b><\/p>\n<p>Dabei handelt es sich um die folgenden Informationen:<\/p>\n<ul>\n<li><b>Anzuzeigende Felder<\/b>: Hier k&ouml;nnen wir die Felder festlegen, die in das Unterformular in der Datenblattansicht &uuml;bernommen werden sollen.<\/li>\n<li><b>Name des Hauptformulars<\/b>: Hier geben wir den Namen des zu erstellenden Hauptformulars ein, f&uuml;r den bereits ein Vorschlag vorgegeben wird.<\/li>\n<li><b>Name des Unterformulars<\/b>: Hier stellen wir den Namen des Unterformulars ein. Auch hier finden wir einen Vorschlag.<\/li>\n<li><b>Vorhandene Formulare &uuml;berschreiben<\/b>: Legt fest, dass eventuell vorhandene Formulare gleichen Namens &uuml;berschrieben werden sollen.<\/li>\n<li>Schaltfl&auml;che <b>Formular erstellen<\/b>: Startet das Erstellen des Haupt- und Unterformulars.<\/li>\n<li>Schaltfl&auml;che <b>Abbrechen<\/b>: Schlie&szlig;t das Formular, ohne neue Formulare zu erstellen.<\/li>\n<\/ul>\n<p>Wenn wir nun auf <b>Formular erstellen<\/b> klicken, arbeitet Access kurz und pr&auml;sentiert anschlie&szlig;end das neue Formular (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_004.png\" alt=\"Das neu erstellte Formular mit Unterformular\" width=\"499,5589\" height=\"234,2822\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das neu erstellte Formular mit Unterformular<\/span><\/b><\/p>\n<p>Starten wir den Assistenten danach erneut f&uuml;r die gleiche Datensatzquelle, zeigt dieser direkt an, dass die automatisch vorgeschlagenen Formularnamen bereits existieren (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_005.png\" alt=\"Hinweis auf bereits vorhandene Formulare\" width=\"499,5589\" height=\"346,8635\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Hinweis auf bereits vorhandene Formulare<\/span><\/b><\/p>\n<p>In diesem Fall k&ouml;nnen wir den Namen entweder anpassen oder wir aktivieren die Option <b>Vorhandene Formulare &uuml;berschreiben<\/b>.<\/p>\n<p>Erst wenn eines von beiden erfolgt ist, wird die Schaltfl&auml;che zum Anlegen der Formulare aktiviert.<\/p>\n<h2>Programmierung des Assistenten<\/h2>\n<p>Damit die Datenbank mit unserer L&ouml;sung als Add-In installiert werden kann, ben&ouml;tigen wir eine Tabelle namens <b>USysRegInfo<\/b>, die wir wie in Bild 6 f&uuml;llen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_006.png\" alt=\"Die Tabelle USysRegInfo\" width=\"649,559\" height=\"255,3492\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Tabelle USysRegInfo<\/span><\/b><\/p>\n<p>Diese enth&auml;lt die Informationen, die beim Installieren in die Registry eingetragen werden.<\/p>\n<p>Wichtig ist der Name der aufzurufenden Funktion beim Starten des Assistenten, hier <b>Autostart_SubformWithDatasheetWizard<\/b>.<\/p>\n<p>Sie hat einen Parameter namens <b>strRecordsource<\/b>, der automatisch mit der Tabelle oder Abfrage gef&uuml;llt wird, die wir im Dialog zur Auswahl des Assistenten ausw&auml;hlen.<\/p>\n<p>Diese Funktion sehen wir in Listing 1. Sie ruft lediglich eine weitere Prozedur namens <b>CreateSubformWithDatasheet <\/b>auf, der sie den Namen der Datensatzquelle &uuml;bergibt.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart_SubformWithDatasheetWizard(<span style=\"color:blue;\">Optional<\/span> strRecordsource<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Variant<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n    <span style=\"color:blue;\">Call<\/span> CreateSubformWithDatasheet(strRecordsource)\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nFehler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> Err.Number & \" \" & Err.Description\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Funktion, die beim Start des Wizards aufgerufen wird<\/span><\/b><\/p>\n<h2>Hauptfunktion des Wizards<\/h2>\n<p>Die Hauptfunktion <b>CreateSubformWithDatasheet <\/b>finden wir in Listing 2. Sie schreibt den Namen des Wizard-Formulars in die Variable <b>strWizForm<\/b> und schlie&szlig;t dieses zun&auml;chst, falls es noch ge&ouml;ffnet ist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>CreateSubformWithDatasheet(strRecordsource<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>strNewForm<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strNewSubform<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>bolOverwriteForms<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strWizForm<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strTempForm<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strFields<span style=\"color:blue;\"> As String<\/span>    \r\n    strWizForm = \"frmUnterformularMitDatenblatt\"\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    DoCmd.Close acForm, strWizForm\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n    DoCmd.OpenForm strWizForm, WindowMode:=acDialog, OpenArgs:=strRecordsource\r\n    <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strWizForm)<span style=\"color:blue;\"> Then<\/span>\r\n        strNewForm = Forms(strWizForm)!txtForm\r\n        strNewSubform = Forms(strWizForm)!txtSubform\r\n        strFields = GetSelectedFields(Forms(strWizForm)!lstFields)\r\n        bolOverwriteForms = Forms(strWizForm)!chkOverwriteForms\r\n        DoCmd.Close acForm, strWizForm\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        <span style=\"color:blue;\">Exit Sub<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    strTempForm = CreateSubform(db, strRecordsource, strFields)\r\n    <span style=\"color:blue;\">If <\/span>RenameForm(strNewSubform, strTempForm, bolOverwriteForms) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n        strTempForm = CreateForm(strNewSubform)\r\n        <span style=\"color:blue;\">If <\/span>RenameForm(strNewForm, strTempForm, bolOverwriteForms) = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n            <span style=\"color:blue;\">MsgBox<\/span> \"Formular ''\" & strNewForm & \"'' konnte nicht erstellt werden.\", vbExclamation + vbOKOnly, _\r\n                \"Fehler bei Erstellung\"\r\n            DoCmd.DeleteObject acForm, strTempForm\r\n            <span style=\"color:blue;\">Exit Sub<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        <span style=\"color:blue;\">MsgBox<\/span> \"Unterformular ''\" & strNewSubform & \"'' konnte nicht erstellt werden.\", vbExclamation + vbOKOnly, _\r\n            \"Fehler bei Erstellung\"\r\n        DoCmd.DeleteObject acForm, strTempForm\r\n        <span style=\"color:blue;\">Exit Sub<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    DoCmd.OpenForm strNewForm\r\n    <span style=\"color:blue;\">Exit Sub<\/span>\r\nFehler:\r\n    Select Case Err.Number\r\n        <span style=\"color:blue;\">Case <\/span>0, 2501\r\n        <span style=\"color:blue;\">Case Else<\/span>\r\n            <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description\r\n    <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Hauptfunktion des Wizards<\/span><\/b><\/p>\n<p>Dann &ouml;ffnet sie das Formular als modalen Dialog und &uuml;bergibt die zu verwendende Datensatzquelle mit dem Parameter <b>OpenArgs<\/b>. Im Formular gibt der Benutzer nun die gew&uuml;nschten Daten ein und macht dieses entweder mit der Schaltfl&auml;che <b>Formular erstellen <\/b>unsichtbar oder schlie&szlig;t es mit der <b>Abbrechen<\/b>-Schaltfl&auml;che.<\/p>\n<p>Deshalb pr&uuml;fen wir im folgenden Schritt mit der Hilfsfunktion <b>IstFormularGeoeffnet<\/b>, ob das Formular ausgeblendet oder geschlossen wurde.<\/p>\n<p>Falls das Formular noch ge&ouml;ffnet, aber unsichtbar ist, liest die Prozedur den Namen des zu erstellenden Formulars in <b>strNewForm <\/b>und den des Unterformulars in <b>strNewSubform <\/b>ein. Au&szlig;erdem liest sie die im Listenfeld <b>lstFields <\/b>ausgew&auml;hlten Felder mit der Funktion <b>GetSelectedFields <\/b>in die Variable <b>strFields <\/b>ein.<\/p>\n<p>Diese Funktion durchl&auml;uft alle selektierten Eintr&auml;ge aus der Eigenschaft <b>ItemsSelected <\/b>und f&uuml;gt den jeweiligen Eintrag zur Variablen <b>strFields <\/b>hinzu. Die Eintr&auml;ge haben jeweils ein vorangestelltes Semikolon. Nach dem Durchlaufen aller Felder wird noch ein abschlie&szlig;endes Semikolon hinzugef&uuml;gt und das Ergebnis zur&uuml;ckgegeben:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetSelectedFields(lst<span style=\"color:blue;\"> As <\/span>ListBox)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>var<span style=\"color:blue;\"> As Variant<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strFields<span style=\"color:blue;\"> As String<\/span>\r\n    For Each var In lst.ItemsSelected\r\n        strFields = strFields & \";\" & lst.ItemData(var)\r\n        i = i + 1\r\n    <span style=\"color:blue;\">Next<\/span> var\r\n    strFields = strFields & \";\"\r\n    GetSelectedFields = strFields\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das Ergebnis lautet beispielsweise wie folgt:<\/p>\n<pre>;KundeID;Firma;Vorname;AnredeID;Aktiv;<\/pre>\n<p>Au&szlig;erdem lesen wir den Wert des Kontrollk&auml;stchens <b>chkOverwriteForms <\/b>in die Variable <b>bolOverwriteForms <\/b>ein. Damit k&ouml;nnen wir das Formular nun endg&uuml;ltig schlie&szlig;en.<\/p>\n<p>Nun erstellen wir mit der Funktion <b>CreateSubForm <\/b>zun&auml;chst das Unterformular und f&uuml;gen diesem die ausgew&auml;hlten Felder als gebundene Steuerelemente mit Beschriftungsfeld hinzu.<\/p>\n<p>Diese Funktion sehen wir uns im Anschluss an.<\/p>\n<h2>Unterformular umbenennen<\/h2>\n<p>Die Funktion liefert den Namen des neu erstellten Unterformulars zur&uuml;ck und wir speichern es in <b>strTempForm<\/b>.<\/p>\n<p>Dann benennen wir diese mit der Funktion <b>RenameForm <\/b>in den durch den Benutzer eingegebenen Namen um.<\/p>\n<p>Diese Funktion nimmt den neuen und den alten Namen entgegen und au&szlig;erdem den <b>Boolean<\/b>-Wert, der angibt, ob bestehende Formulare gel&ouml;scht werden sollen.<\/p>\n<p>Wenn ein bestehendes Formular &uuml;berschrieben werden soll, schlie&szlig;en wir dieses, falls es noch ge&ouml;ffnet ist, und l&ouml;schen es anschlie&szlig;end mit <b>DoCmd.Delete<\/b>.<\/p>\n<p>Anschlie&szlig;end benennen wir das neu erstellte Formular auf den angegebenen Namen um und liefern den Wert <b>True <\/b>zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RenameForm(strNew<span style=\"color:blue;\"> As String<\/span>, strOld<span style=\"color:blue;\"> As <\/span>_\r\n        String, bolOverwriteForms<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n    <span style=\"color:blue;\">If <\/span>bolOverwriteForms = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n        On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n        DoCmd.Close acForm, str<span style=\"color:blue;\">New<\/span>\r\n        <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n        DoCmd.DeleteObject acForm, str<span style=\"color:blue;\">New<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    \r\n    DoCmd.Rename strNew, acForm, strOld\r\n    RenameForm = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nFehler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>War dies nicht erfolgreich, l&ouml;schen wir das angelegte Formular wieder und verlassen die Prozedur.<\/p>\n<h2>Hauptformular anlegen<\/h2>\n<p>War dies erfolgreich, erstellen wir das Hauptformular mit der Funktion <b>CreateForm <\/b>und &uuml;bergeben dieser den Namen des zu erstellenden Formulars.<\/p>\n<p>Auch diese Funktion beschreiben wir im Anschluss.<\/p>\n<p>F&uuml;r das neu erstellte Hauptformular rufen wir wiederum die Funktion <b>RenameForm <\/b>auf und &uuml;bergeben den neuen und den alten Namen, damit das Formular den gew&uuml;nschten Namen erh&auml;lt. Wenn dies fehlschl&auml;gt, gibt die Funktion einen entsprechenden Hinweis auf. Das Formular wird gel&ouml;scht und die Prozedur beendet.<\/p>\n<p>Schlie&szlig;lich &ouml;ffnen wir das neu erstellte Formular.<\/p>\n<p>In der Fehlerbehandlung geben wir keine Meldung f&uuml;r den Fehler mit der Nummer <b>2501 <\/b>aus. Dieser wird ausgel&ouml;st, wenn wir das Formular &ouml;ffnen, aber diesem keine Datensatzquelle &uuml;bergeben wurde.<\/p>\n<p>In diesem Fall wird das &Ouml;ffnen des Formulars bereits im Ereignis <b>Form_Open <\/b>abgebrochen, was die Anweisung <b>DoCmd.OpenForm <\/b>mit dem Fehler <b>2501 <\/b>quittiert. Alle anderen Fehler werden per Meldungsfenster angezeigt.<\/p>\n<h2>Funktion zum Erstellen des Unterformulars<\/h2>\n<p>Die Funktion zum Erstellen des Unterformulars hei&szlig;t <b>CreateSubform <\/b>und nimmt einen Verweis auf die aktuell ge&ouml;ffnete Datenbank, die Datensatzquelle und die Liste der zu erstellenden Felder entgegen (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CreateSubform(db<span style=\"color:blue;\"> As <\/span>DAO.Database, strRecordsource<span style=\"color:blue;\"> As String<\/span>, strFields<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n    <span style=\"color:blue;\">Dim <\/span>sfm<span style=\"color:blue;\"> As <\/span>Form\r\n    <span style=\"color:blue;\">Dim <\/span>strFormTemp<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>Access.TextBox, cbo<span style=\"color:blue;\"> As <\/span>Access.ComboBox, chk<span style=\"color:blue;\"> As <\/span>Access.CheckBox, lbl<span style=\"color:blue;\"> As <\/span>Access.Label\r\n    <span style=\"color:blue;\">Dim <\/span>strField<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strControlName<span style=\"color:blue;\"> As String<\/span>    \r\n    <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM \" & strRecordsource & \" WHERE 1=2\", dbOpenSnapshot)\r\n    <span style=\"color:blue;\">Set<\/span> sfm = Application.CreateForm()\r\n    strFormTemp = sfm.Name\r\n    <span style=\"color:blue;\">With<\/span> sfm\r\n        .RecordSource = strRecordsource\r\n        .DefaultView = 2\r\n        For Each fld In rst.Fields\r\n            strField = fld.Name\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">InStr<\/span>(1, strFields, \";\" & strField & \";\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n                Select Case GetControlType(fld)\r\n                    <span style=\"color:blue;\">Case <\/span>acTextBox\r\n                        <span style=\"color:blue;\">Set<\/span> txt = Application.CreateControl(strFormTemp, acTextBox, acDetail, , strField, 1100, _\r\n                            100 + i * 400, 1000, 400)\r\n                        strControlName = \"txt\" & strField\r\n                        txt.Name = \"txt\" & strControlName\r\n                    <span style=\"color:blue;\">Case <\/span>acComboBox\r\n                        <span style=\"color:blue;\">Set<\/span> cbo = Application.CreateControl(strFormTemp, acComboBox, acDetail, , strField, 1100, _\r\n                            100 + i * 400, 1000, 400)\r\n                        strControlName = \"cbo\" & strField\r\n                        cbo.Name = \"cbo\" & strControlName\r\n                    <span style=\"color:blue;\">Case <\/span>acCheckBox\r\n                        <span style=\"color:blue;\">Set<\/span> chk = Application.CreateControl(strFormTemp, acCheckBox, acDetail, , strField, 1100, _\r\n                            100 + i * 400, 1000, 400)\r\n                        strControlName = \"chk\" & strField\r\n                        chk.Name = \"chk\" & strControlName\r\n                <span style=\"color:blue;\">End Select<\/span>\r\n                <span style=\"color:blue;\">Set<\/span> lbl = Application.CreateControl(sfm.Name, acLabel, acDetail, strControlName, strField, 100, _\r\n                    100 + i * 400, 1000, 400)\r\n                <span style=\"color:blue;\">With<\/span> lbl\r\n                    .Name = \"lbl\" & strField\r\n                End <span style=\"color:blue;\">With<\/span>\r\n            <span style=\"color:blue;\">End If<\/span>\r\n            i = i + 1\r\n        <span style=\"color:blue;\">Next<\/span> fld\r\n    End <span style=\"color:blue;\">With<\/span>\r\n    DoCmd.Close acForm, strFormTemp, acSaveYes\r\n    CreateSubform = strFormTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Erstellen des Unterformulars<\/span><\/b><\/p>\n<p>Sie erstellt ein Recordset auf Basis der &uuml;bergebenen Datensatzquelle.<\/p>\n<p>Dann erstellt sie mit der Methode <b>CreateForm <\/b>ein neues Formular und speichert einen Verweis darauf in der Variablen <b>sfm<\/b>. Au&szlig;erdem schreibt sie den automatisch vergebenen Namen f&uuml;r dieses Formular, zum Beispiel <b>Formular1<\/b>, in die Variable <b>strFormTemp<\/b>.<\/p>\n<p>Sie stellt die Eigenschaft <b>RecordSource <\/b>auf die &uuml;bergebene Datensatzquelle aus <b>strRecordsource <\/b>ein und legt f&uuml;r die Eigenschaft <b>Standardansicht <\/b>(<b>DefaultView<\/b>) den Wert <b>Datenblatt <\/b>fest.<\/p>\n<p>Dann durchl&auml;uft sie die <b>Fields<\/b>-Auflistung des Recordsets und schreibt den Namen des aktuellen Felds in die Variable <b>strField<\/b>.<\/p>\n<p>Dieser Variablen f&uuml;gt sie vorn und hinten ein Semikolon hinzu. Damit k&ouml;nnen wir per <b>InStr<\/b>-Funktion pr&uuml;fen, ob das Feld in der Liste aus <b>strFields <\/b>vorkommt:<\/p>\n<pre>;KundeID;Firma;Vorname;AnredeID;Aktiv;<\/pre>\n<h2>Steuerelementtyp f&uuml;r das Feld ermitteln<\/h2>\n<p>Nur wenn das Feld dort enthalten ist, folgt der Aufruf einer <b>Select Case<\/b>-Bedingung. Diese ermittelt mit <b>GetControlType <\/b>f&uuml;r das Feld aus <b>fld <\/b>den Steuerelementtyp des Feldes. Dieser kann <b>TextBox<\/b>, <b>ComboBox <\/b>oder <b>CheckBox <\/b>lauten. Die Funktion sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetControlType(fld<span style=\"color:blue;\"> As <\/span>DAO.Field)\r\n    <span style=\"color:blue;\">Dim <\/span>prp<span style=\"color:blue;\"> As <\/span>DAO.Property\r\n    <span style=\"color:blue;\">Dim <\/span>lngDisplayControl<span style=\"color:blue;\"> As Long<\/span>\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> prp = fld.Properties(\"DisplayControl\")\r\n    lngDisplayControl = prp.Value\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n    <span style=\"color:blue;\">If <\/span>lngDisplayControl = 0<span style=\"color:blue;\"> Then<\/span>\r\n        lngDisplayControl = 109\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    GetControlType = lngDisplayControl\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Sie pr&uuml;ft, ob das Feld eine Eigenschaft namens <b>DisplayControl <\/b>aufweist. Diese enth&auml;lt f&uuml;r Textfelder den Wert <b>109<\/b>, f&uuml;r Kombinationsfelder den Wert <b>111 <\/b>und f&uuml;r Kontrollk&auml;stchen den Wert <b>106<\/b>.<\/p>\n<h2>Steuerelemente zum Unterformular hinzuf&uuml;gen<\/h2>\n<p>Je nach Steuerelementtyp wird einer der folgenden Case-Zweige angesteuert. Im Falle eines Textfeldes erstellt die Prozedur mit der Funktion <b>CreateControl <\/b>ein Steuerelement des Typs <b>acTextBox<\/b> und &uuml;bergibt weitere Informationen wieden Namen des Feldes, an welches das Steuerelement gebunden werden soll, den Zielbereich (<b>acDetail <\/b>f&uuml;r den Detailbereich) und die Position und die Gr&ouml;&szlig;e.<\/p>\n<p>F&uuml;r die vertikale Position verwenden wir einen Wert, der f&uuml;r jedes neu angelegte Steuerelement ein wenig nach unten verschoben wird. Als Steuerelementname legen wir <b>txt <\/b>plus den Namen des Feldes fest, also etwa <b>txtFirma<\/b>.<\/p>\n<p>F&uuml;r Kombinationsfelder und Kontrollk&auml;stchen werden &auml;hnliche Anweisungen ausgef&uuml;hrt, aber die Ergebnisse werden in Variablen des Typs <b>ComboBox <\/b>beziehungsweise <b>CheckBox <\/b>gespeichert.<\/p>\n<p>Schlie&szlig;lich legen wir f&uuml;r das zuvor angelegte Steuerelement noch ein Bezeichnungsfeld an. Dazu rufen wir ebenfalls <b>CreateControl <\/b>auf, &uuml;bergeben aber als Typ dieses Mal <b>acLabel<\/b>. Au&szlig;erdem legen wir f&uuml;r den Parameter <b>Parent <\/b>den Namen des Steuerelements fest, zu dem das Bezeichnungsfeld geh&ouml;ren soll.<\/p>\n<p>Damit erreichen wir die Bindung, die daf&uuml;r sorgt, dass im Entwurf des Formulars direkt das entsprechende Bezeichnungsfeld markiert wird, wenn wir das jeweilige Steuerelement selektieren.<\/p>\n<p>Danach schlie&szlig;en wir das neu erzeugte Unterformular mit <b>DoCmd.Close<\/b>, wobei wir als dritten Parameter den Wert <b>acSaveYes <\/b>&uuml;bergeben, um das Formular zu speichern. Anschlie&szlig;end geben wir den Namen des Unterformulars als Funktionsergebnis zur&uuml;ck.<\/p>\n<h2>Erstellen des Hauptformulars<\/h2>\n<p>Mit der Funktion <b>CreateForm<\/b> aus Listing 4 erstellen wir das Hauptformular und f&uuml;gen diesem das Unterformular-Steuerelement hinzu, welches das Unterformular anzeigen soll.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CreateForm(strSubform<span style=\"color:blue;\"> As String<\/span>)<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>strFormTemp<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>sfm<span style=\"color:blue;\"> As <\/span>Access.SubForm\r\n    \r\n    <span style=\"color:blue;\">Set<\/span> frm = Application.CreateForm()\r\n    <span style=\"color:blue;\">With<\/span> frm\r\n        strFormTemp = .Name\r\n        .AutoCenter = <span style=\"color:blue;\">True<\/span>\r\n        .NavigationButtons = <span style=\"color:blue;\">False<\/span>\r\n        .RecordSelectors = <span style=\"color:blue;\">False<\/span>\r\n        .ScrollBars = <span style=\"color:blue;\">False<\/span>\r\n        <span style=\"color:blue;\">Set<\/span> sfm = Application.CreateControl(frm.Name, acSubform, acDetail, , , 100, 100, frm.Width - 200, _\r\n            frm.Section(acDetail).Height - 200)\r\n        <span style=\"color:blue;\">With<\/span> sfm\r\n            .SourceObject = strSubform\r\n            .HorizontalAnchor = acHorizontalAnchorBoth\r\n            .VerticalAnchor = acVerticalAnchorBoth\r\n        End <span style=\"color:blue;\">With<\/span>\r\n    End <span style=\"color:blue;\">With<\/span>\r\n    DoCmd.Close acForm, strFormTemp, acSaveYes\r\n    CreateForm = strFormTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Hauptformular anlegen<\/span><\/b><\/p>\n<p>Die Funktion nimmt den Namen des einzuf&uuml;genden Unterformulars entgegen und legt das neue Hauptformular mit <b>CreateForm <\/b>an. Dann speichert sie den beim Anlegen automatisch vergebenen Namen in der Variablen <b>strFormTemp<\/b>.<\/p>\n<p>Anschlie&szlig;end legt sie einige Eigenschaften f&uuml;r das Formular fest:<\/p>\n<ul>\n<li><b>Automatisch zentrieren <\/b>auf den Wert <b>Ja<\/b><\/li>\n<li><b>Navigationsschaltfl&auml;chen <\/b>auf <b>Nein<\/b><\/li>\n<li><b>Datensatzmarkierern <\/b>auf <b>Nein<\/b><\/li>\n<li><b>Bildlaufleisten <\/b>auf <b>Keine<\/b><\/li>\n<\/ul>\n<p>Dann erstellt sie mit <b>CreateControl <\/b>das Unterformular-Steuerelement. Dabei legen wir die Position und die Gr&ouml;&szlig;e so fest, dass es vom linken, oberen, unteren und rechten Rand jeweils 200 Twips Abstand hat. F&uuml;r dieses mit <b>sfm <\/b>referenzierte Unterformular-Steuerelement stellen wir danach noch weitere Eigenschaften ein:<\/p>\n<ul>\n<li><b>Herkunftsobjekt <\/b>auf den Wert aus <b>strSubform<\/b><\/li>\n<li><b>Vertikaler Anker <\/b>auf <b>Beide<\/b><\/li>\n<li><b>Horizontaler Anker <\/b>auf <b>Beide<\/b><\/li>\n<\/ul>\n<p>Durch die letzten beiden Einstellungen sorgen wir daf&uuml;r, dass das Unterformular automatisch analog zum Hauptformular vergr&ouml;&szlig;ert wird. Dann schlie&szlig;en wir das Formular und speichern es gleichzeitig. Au&szlig;erdem geben wir den tempor&auml;ren Formularnamen aus <b>strFormTemp <\/b>als Funktionsergebnis zur&uuml;ck, zum Beispiel <b>Formular2<\/b>.<\/p>\n<h2>Formular zur Eingabe der Formulardaten<\/h2>\n<p>Nun programmieren wir das Formular zur Eingabe der Formulardaten, das in der Entwurfsansicht wie in Bild 7 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_007.png\" alt=\"Formular zur Eingabe der Formulardaten in der Entwurfsansicht\" width=\"599,559\" height=\"453,4734\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Formular zur Eingabe der Formulardaten in der Entwurfsansicht<\/span><\/b><\/p>\n<p>F&uuml;r das Listenfeld <b>lstFields <\/b>stellen wir die Eigenschaft <b>Herkunftsart <\/b>auf <b>Wertliste <\/b>ein, und <b>Mehrfachauswahl <\/b>auf <b>Erweitert<\/b>.<\/p>\n<p>Im Klassenmodul des Formulars deklarieren wir ganz oben die folgenden Variablen, in denen wir speichern, ob die zu erstellenden Formulare bereits vorhanden sind:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>bolFormExists<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Private <\/span>bolSubformExists<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<h2>Ereignisprozedur beim &Ouml;ffnen des Formulars<\/h2>\n<p>Beim &Ouml;ffnen des Formulars wird das Ereignis aus Listing 5 ausgel&ouml;st.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n    <span style=\"color:blue;\">Dim <\/span>strRecordsource<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strForm<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strSubform<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">If <\/span>IsNull(Me.OpenArgs)<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">MsgBox<\/span> \"Es wurde keine Datensatzquelle &uuml;bergeben.\", vbOKOnly + vbExclamation, \"Datensatzquelle fehlt\"\r\n        Cancel = <span style=\"color:blue;\">True<\/span>\r\n        <span style=\"color:blue;\">Exit Sub<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    strRecordsource = Me.OpenArgs\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strRecordsource, \"tbl\") = 1 Or <span style=\"color:blue;\">InStr<\/span>(1, strRecordsource, \"qry\") = 1<span style=\"color:blue;\"> Then<\/span>\r\n        strForm = \"frm\" & <span style=\"color:blue;\">Mid<\/span>(strRecordsource, 4)\r\n        strSubform = \"sfm\" & <span style=\"color:blue;\">Mid<\/span>(strRecordsource, 4)\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    \r\n    <span style=\"color:blue;\">Call<\/span> FillFieldlist(strRecordsource)\r\n    \r\n    Me.txtRecordsource = strRecordsource\r\n    Me.txtForm = strForm\r\n    Me.txtSubform = strSubform\r\n    \r\n    bolFormExists = FormExists(strForm)\r\n    bolSubformExists = FormExists(strSubform)\r\n    \r\n    <span style=\"color:blue;\">Call<\/span> UpdateControls\r\n    \r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Ereignisprozedur beim &Ouml;ffnen des Formulars<\/span><\/b><\/p>\n<p>Hier pr&uuml;fen wir zun&auml;chst, ob der Name der Datensatzquelle mit dem &Ouml;ffnungsparameter &uuml;bergeben wurde. Falls nicht, erscheint eine Meldung und das &Ouml;ffnen des Formulars wird mit <b>Cancel = True <\/b>abgebrochen.<\/p>\n<p>Andernfalls speichern wir die &uuml;bergebene Datensatzquelle in der Variablen <b>strRecordsource<\/b>.<\/p>\n<p>Dann pr&uuml;fen wir, ob die Bezeichnung der Datensatzquelle mit <b>tbl <\/b>oder <b>qry <\/b>beginnt und ersetzen dies f&uuml;r den Namen des zu erstellenden Formulars mit <b>frm <\/b>und f&uuml;r das Unterformular mit <b>sfm<\/b>. Die resultierenden Bezeichnungen speichern wir in den Variablen <b>strForm <\/b>und <b>strSubform<\/b>.<\/p>\n<h2>Listenfeld mit den Feldern f&uuml;llen<\/h2>\n<p>Dann rufen wir die Prozedur <b>FillFieldList <\/b>auf, welche das Listenfeld mit den Feldern der gew&auml;hlten Datensatzquelle f&uuml;llt. Die Funktion erstellt ein Recordset auf Basis der Datensatzquelle und durchl&auml;uft alle enthaltenen Felder in einer <b>For Each<\/b>-Schleife. Dabei f&uuml;gt sie die Namen der Felder als neue Eintr&auml;ge zum Listenfeld <b>lstFields <\/b>hinzu.<\/p>\n<p>In einer <b>For&#8230;Next<\/b>-Schleife markieren wir au&szlig;erdem alle Eintr&auml;ge des Listenfeldes, damit der Benutzer nur noch die nicht ben&ouml;tigten Felder abw&auml;hlen kann:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FillFieldlist(strRecordsource<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>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>i<span style=\"color:blue;\"> As Integer<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM \" _\r\n        & strRecordsource & \" WHERE 1=2\", dbOpenSnapshot)\r\n    For Each fld In rst.Fields\r\n        Me.lstFields.AddItem fld.Name\r\n    <span style=\"color:blue;\">Next<\/span> fld\r\n    For i = 0 To Me.lstFields.ListCount - 1\r\n        Me.lstFields.Selected(i) = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Anschlie&szlig;end f&uuml;llt die <b>Form_Open<\/b>-Prozedur die Textfelder <b>txtRecordsource<\/b>, <b>txtForm <\/b>und <b>txtSubform <\/b>mit den Werten aus den entsprechenden Variablen.<\/p>\n<h2>Pr&uuml;fen, ob die zu erstellenden Formulare bereits vorhanden sind<\/h2>\n<p>Au&szlig;erdem pr&uuml;ft sie mit der Funktion <b>FormExists<\/b>, ob bereits Formulare mit den in <b>strForm <\/b>und <b>strSubform <\/b>angegebenen Namen existieren, und stellt die Variablen <b>bolFormExists <\/b>und <b>bolSubformExists <\/b>entsprechend ein.<\/p>\n<p>Diese Funktion pr&uuml;ft, ob bereits Formulare gleichen Namens in der Tabelle <b>MSysObjects<\/b> der aktuellen Datenbank enthalten sind, und gibt den Wert <b>True <\/b>zur&uuml;ck, wenn dies der Fall ist:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>FormExists(strForm<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    If db.OpenRecordset(\"SELECT * FROM MSysObjects \" _\r\n            & \"WHERE Name = ''\" & strForm _\r\n            & \"'' AND Type = -32768\").RecordCount = 1 Then\r\n        FormExists = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Steuerelemente aktualisieren<\/h2>\n<p>Schlie&szlig;lich ruft sie eine Prozedur namens <b>UpdateControls<\/b> auf, die verschiedene Zust&auml;nde pr&uuml;ft und Steuerelemente ein- und ausblendet beziehungsweise aktiviert oder deaktiviert.<\/p>\n<p>Das Bezeichnungsfeld, das anzeigt, dass das Hauptformular bereits vorhanden ist, wird eingeblendet, wenn <b>bolFormExists <\/b>den Wert <b>True <\/b>hat, Gleiches geschieht f&uuml;r das Bezeichnungsfeld f&uuml;r das Unterformular.<\/p>\n<p>Wenn der Benutzer keinen Eintrag im Listenfeld <b>lstFields <\/b>markiert hat, wird das Bezeichnungsfeld <b>lblFields <\/b>eingeblendet und die Schaltfl&auml;che <b>cmdCreateForm <\/b>deaktiviert. Au&szlig;erdem wird die Prozedur hier verlassen.<\/p>\n<p>Wenn Felder ausgew&auml;hlt sind, pr&uuml;fen wir, ob das Kontrollk&auml;stchen <b>chkOverwriteForms <\/b>den Wert <b>True <\/b>hat. In diesem Fall wird die Schaltfl&auml;che <b>cmdCreateForm <\/b>aktiviert.<\/p>\n<p>Anderenfalls, also wenn <b>chkOverwriteForms <\/b>den Wert <b>False <\/b>hat, pr&uuml;fen wir nochmals die beiden Variablen <b>bolFormExists <\/b>und <b>bolSubformExists<\/b>.<\/p>\n<p>Hat eine der beiden den Wert <b>True<\/b>, soll die Schaltfl&auml;che <b>cmdCreateForm <\/b>deaktiviert werden.<\/p>\n<p>So stellen wir sicher, dass der Benutzer alle notwendigen Meldungen angezeigt bekommt und die Schaltfl&auml;che zum Erstellen des Formulars nur aktiviert ist, wenn dies auch wirklich m&ouml;glich ist:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UpdateControls()\r\n    Me.lblForm.Visible = bolFormExists\r\n    Me.lblSubform.Visible = bolSubformExists\r\n    <span style=\"color:blue;\">If <\/span>Me.lstFields.ItemsSelected.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n        Me.lblListbox.Visible = <span style=\"color:blue;\">True<\/span>\r\n        Me.cmdCreateForm.Enabled = <span style=\"color:blue;\">False<\/span>\r\n        <span style=\"color:blue;\">Exit Sub<\/span>\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        Me.lblListbox.Visible = <span style=\"color:blue;\">False<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">If <\/span>Me.chkOverwriteForms = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n        Me.cmdCreateForm.Enabled = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        If bolFormExists = <span style=\"color:blue;\">True<\/span> _\r\n                Or bolSubformExists = <span style=\"color:blue;\">True<\/span> Then\r\n            Me.cmdCreateForm.Enabled = <span style=\"color:blue;\">False<\/span>\r\n        <span style=\"color:blue;\">Else<\/span>\r\n            Me.cmdCreateForm.Enabled = <span style=\"color:blue;\">True<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Aktualisieren der Formularnamen durch den Benutzer<\/h2>\n<p>Wenn der Benutzer &uuml;ber das Steuerelement <b>txtForm <\/b>den Namen des zu erstellenden Hauptformulars &auml;ndert, pr&uuml;fen wir jeweils, ob bereits ein Formular dieses Namens existiert, und aktualisieren die Steuerelemente mit <b>UpdateControls<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtForm_Change()\r\n    <span style=\"color:blue;\">Dim <\/span>strForm<span style=\"color:blue;\"> As String<\/span>\r\n    \r\n    strForm = Me.txtForm.Text\r\n    bolFormExists = FormExists(strForm)\r\n    \r\n    <span style=\"color:blue;\">Call<\/span> UpdateControls\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Gleiche erledigen wir f&uuml;r das Steuerelement <b>txtSubform<\/b>, das den Namen des Unterformulars anzeigt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSubform_Change()\r\n    <span style=\"color:blue;\">Dim <\/span>strSubform<span style=\"color:blue;\"> As String<\/span>\r\n    \r\n    strSubform = Me.txtSubform.Text\r\n    bolFormExists = FormExists(strSubform)\r\n    \r\n    <span style=\"color:blue;\">Call<\/span> UpdateControls\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auch wenn der Benutzer festlegt, ob bestehende Formulare &uuml;berschrieben werden sollen oder nicht, werden die Steuerelemente aktualisiert: <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>chkOverwriteForms_AfterUpdate()\r\n    <span style=\"color:blue;\">Call<\/span> UpdateControls\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auch das Aus- oder Abw&auml;hlen eines Eintrags in der Liste der Felder f&uuml;hrt zum Aufruf der Prozedur <b>UpdateControls<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstFields_AfterUpdate()\r\n    <span style=\"color:blue;\">Call<\/span> UpdateControls\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Abbrechen der Formularerstellung<\/h2>\n<p>Wenn der Benutzer auf die Schaltfl&auml;che <b>cmdAbbrechen <\/b>klickt, soll das Formular geschlossen werden:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n    DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies f&uuml;hrt wie oben beschrieben dazu, dass die aufrufende Prozedur ebenfalls abgebrochen wird.<\/p>\n<h2>Erstellen der Formulare<\/h2>\n<p>Klickt der Benutzer hingegen auf die Schaltfl&auml;che <b>cmdCreateForm<\/b>, wird das Formular ausgeblendet:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdCreateForm_Click()\r\n    Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dann &uuml;bernimmt die aufrufende Prozedur die im Formular eingestellten Optionen und erstellt die Formulare.<\/p>\n<h2>Datenbankeigenschaften anpassen<\/h2>\n<p>Damit der Assistent korrekt im Add-In-Manager angezeigt wird, nehmen wir einige Einstellungen in den Datenbankeigenschaften vor. Diese &ouml;ffnen wir, indem wir im Ribbon auf <b>Datei <\/b>klicken und dann links auf <b>Informationen <\/b>und rechts auf den Link <b>Datenbankeigenschaften anzeigen und bearbeiten<\/b>.<\/p>\n<p>Hier finden wir nun den Dialog mit den Datenbankeigenschaften (siehe Bild 8). Hier f&uuml;llen wir die Eigenschaften <b>Titel<\/b>, <b>Firma <\/b>und <b>Kommentare<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_008.png\" alt=\"Einstellen der Datenbankeigenschaften\" width=\"499,5589\" height=\"539,7125\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Einstellen der Datenbankeigenschaften<\/span><\/b><\/p>\n<h2>Installieren des Assistenten<\/h2>\n<p>Um den Assistenten zu installieren, starten wir Access im Administratormodus. Dann &ouml;ffnen wir eine beliebige Datenbank und w&auml;hlen im Ribbon den Befehl <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>aus.<\/p>\n<p>Im nun erscheinenden Dialog <b>Add-In-Manager <\/b>klicken wir auf <b>Neues hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen unsere Add-In-Datenbank aus.<\/p>\n<p>Der Assistent erscheint anschlie&szlig;end wie in Bild 9 in der Liste der Add-Ins.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_1595_009.png\" alt=\"Der Assistent im Add-In-Manager\" width=\"499,5589\" height=\"298,5869\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Der Assistent im Add-In-Manager<\/span><\/b><\/p>\n<p>Nach der Installation finden wir den Assistenten wie eingangs beschrieben in der Liste der Formular-Assistenten vor.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir einen Assistenten erstellt, mit dem wir Formulare erstellen k&ouml;nnen, die im Unterformular die Daten einer zuvor ausgew&auml;hlten Datensatzquelle anzeigen.<\/p>\n<p>Diesen Assistenten kann man beliebig erweitern, zum Beispiel um weitere Steuerelemente im Hauptformular &#8211; etwa zum Suchen von Datens&auml;tzen, zum Anzeigen von Datens&auml;tzen in Detailformularen, zum Anlegen neuer Datens&auml;tze oder zum L&ouml;schen bestehender Datens&auml;tze.<\/p>\n<p>Auch kann man das Ger&uuml;st dieses Add-Ins verwenden, um weitere Assistenten hinzuzuf&uuml;gen. Dazu dupliziert man die Eintr&auml;ge der Tabelle <b>USysRegInfo<\/b> und passt zumindest den Namen des Assistenten und der aufzurufenden Funktion entsprechend an. Auf diese Weise k&ouml;nnen wir mehrere Assistenten in einer Add-In-Datenbank anlegen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvUnterformularMitDatenblattWizard.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/853F83A2-F736-4FCC-9430-EDA30AE8ED14\/aiu_1595.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine immer wiederkehrende Aufgabe in meinem Programmieralltag ist das Erstellen von Formularen, die ein Unterformular mit Daten in der Datenblattansicht enthalten. Das umfasst einige Schritte, die ich immer wieder manuell durchgef&uuml;hrt habe. Bis ich die L&ouml;sung f&uuml;r diesen Beitrag programmiert habe. Einen Assistenten, den ich starte, statt im Ribbon den Befehl zum Erstellen eines neuen, leeren Formulars in der Entwurfsansicht aufzurufen. Und der lediglich eine Information ben&ouml;tigt: Welche Tabelle oder Abfrage soll die Daten f&uuml;r das Unterformular bereitstellen? Das Ganze in einem Assistenten verpackt, der in jeder ge&ouml;ffneten Access-Datenbank per Mausklick gestartet werden kann. Nachfolgend finden Sie die Anleitung, wie ich diesen Assistenten erstellt habe und wie er funktioniert.<\/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":[66022026,662026,44000027],"tags":[],"class_list":["post-55001595","post","type-post","status-publish","format-standard","hentry","category-66022026","category-662026","category-Loesungen"],"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>Form und Subform in der Datenblattansicht per Wizard - 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\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Form und Subform in der Datenblattansicht per Wizard\" \/>\n<meta property=\"og:description\" content=\"Eine immer wiederkehrende Aufgabe in meinem Programmieralltag ist das Erstellen von Formularen, die ein Unterformular mit Daten in der Datenblattansicht enthalten. Das umfasst einige Schritte, die ich immer wieder manuell durchgef&uuml;hrt habe. Bis ich die L&ouml;sung f&uuml;r diesen Beitrag programmiert habe. Einen Assistenten, den ich starte, statt im Ribbon den Befehl zum Erstellen eines neuen, leeren Formulars in der Entwurfsansicht aufzurufen. Und der lediglich eine Information ben&ouml;tigt: Welche Tabelle oder Abfrage soll die Daten f&uuml;r das Unterformular bereitstellen? Das Ganze in einem Assistenten verpackt, der in jeder ge&ouml;ffneten Access-Datenbank per Mausklick gestartet werden kann. Nachfolgend finden Sie die Anleitung, wie ich diesen Assistenten erstellt habe und wie er funktioniert.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-05T20:56:47+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/643405e06e684afea841a64d05a6e3ad\" \/>\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=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Form und Subform in der Datenblattansicht per Wizard\",\"datePublished\":\"2026-03-05T20:56:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/\"},\"wordCount\":3145,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/643405e06e684afea841a64d05a6e3ad\",\"articleSection\":[\"2\\\/2026\",\"2026\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/\",\"name\":\"Form und Subform in der Datenblattansicht per Wizard - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/643405e06e684afea841a64d05a6e3ad\",\"datePublished\":\"2026-03-05T20:56:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/643405e06e684afea841a64d05a6e3ad\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/643405e06e684afea841a64d05a6e3ad\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Form und Subform in der Datenblattansicht per Wizard\"}]},{\"@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":"Form und Subform in der Datenblattansicht per Wizard - 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\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/","og_locale":"de_DE","og_type":"article","og_title":"Form und Subform in der Datenblattansicht per Wizard","og_description":"Eine immer wiederkehrende Aufgabe in meinem Programmieralltag ist das Erstellen von Formularen, die ein Unterformular mit Daten in der Datenblattansicht enthalten. Das umfasst einige Schritte, die ich immer wieder manuell durchgef&uuml;hrt habe. Bis ich die L&ouml;sung f&uuml;r diesen Beitrag programmiert habe. Einen Assistenten, den ich starte, statt im Ribbon den Befehl zum Erstellen eines neuen, leeren Formulars in der Entwurfsansicht aufzurufen. Und der lediglich eine Information ben&ouml;tigt: Welche Tabelle oder Abfrage soll die Daten f&uuml;r das Unterformular bereitstellen? Das Ganze in einem Assistenten verpackt, der in jeder ge&ouml;ffneten Access-Datenbank per Mausklick gestartet werden kann. Nachfolgend finden Sie die Anleitung, wie ich diesen Assistenten erstellt habe und wie er funktioniert.","og_url":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/","og_site_name":"Access im Unternehmen","article_published_time":"2026-03-05T20:56:47+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/643405e06e684afea841a64d05a6e3ad","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Form und Subform in der Datenblattansicht per Wizard","datePublished":"2026-03-05T20:56:47+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/"},"wordCount":3145,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/643405e06e684afea841a64d05a6e3ad","articleSection":["2\/2026","2026","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/","url":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/","name":"Form und Subform in der Datenblattansicht per Wizard - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/643405e06e684afea841a64d05a6e3ad","datePublished":"2026-03-05T20:56:47+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/643405e06e684afea841a64d05a6e3ad","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/643405e06e684afea841a64d05a6e3ad"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Form_und_Subform_in_der_Datenblattansicht_per_Wizard\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Form und Subform in der Datenblattansicht per Wizard"}]},{"@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\/55001595","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=55001595"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001595\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}