{"id":55001022,"date":"2016-02-01T00:00:00","date_gmt":"2020-05-22T19:04:30","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1022"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenblattmarkierung_fuellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/","title":{"rendered":"Datenblattmarkierung f&uuml;llen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/8e2dd6f75b634da0bf352bd51ece3927\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In der Datenblattansicht lassen sich ja bereits eine Menge Dinge erledigen &#8211; Daten einf&uuml;gen, l&ouml;schen, bearbeiten, kopieren, ausschneiden &#8230; Sie k&ouml;nnen sogar komplette Bereiche kopieren und in andere Bereiche einf&uuml;gen, sofern diese Bereiche zueinander kompatibel sind, und Access ist hier recht tolerant. Was aber fehlt, ist die Markierung eines Zielbereichs, dessen Felder dann alle mit dem gleichen Wert gef&uuml;llt werden. Wenn Sie also etwa f&uuml;r alle Datens&auml;tze ein Ja\/Nein-Feld anhaken m&ouml;chten, m&uuml;ssen Sie dies immer noch manuell erledigen. Dieser Beitrag zeigt eine passende L&ouml;sung f&uuml;r Datenbl&auml;tter in Formularen und Unterformularen.<\/b><\/p>\n<p>Wenn Sie einen Bereich eines Formulars oder Unterformulars in der Datenblattansicht mit den gleichen Werten f&uuml;llen wollten, waren Sie bislang auf zwei M&ouml;glichkeiten angewiesen:<\/p>\n<ul>\n<li>das Absetzen einer entsprechenden UPDATE-SQL-Aktionsabfrage, was aber den Nachteil hat, dass dies selbst die F&auml;higkeiten von Powerusern mitunter &uuml;berschreitet, oder<\/li>\n<li>das manuelle F&uuml;llen der Felder mit dem gew&uuml;nschten Wert.<\/li>\n<\/ul>\n<p>Letzteres geschieht f&uuml;r eine bessere Effizienz am besten so, dass man eine gewisse Menge Felder mit dem Wert f&uuml;llt (sagen wir zehn untereinander liegende Felder), dann diesen Bereich kopiert und in eine Markierung unter den gef&uuml;llten Feldern mit einer Spalte Breite und zehn Zeilen H&ouml;he wieder einf&uuml;gt. Wenn man viele Felder f&uuml;llen muss, kann man nochmal gr&ouml;&szlig;ere Bereiche markieren und kopieren und dann in entsprechend gr&ouml;&szlig;ere Bereiche einf&uuml;gen.<\/p>\n<p>Der Nachteil: Man m&uuml;sste immer ungef&auml;hr die gew&uuml;nschte Menge Felder ermitteln, damit alle kopierten Werte dort hineinpassen. Der Vorteil: Access ist beim Einf&uuml;gen nicht pingelig, die Gr&ouml;&szlig;e von Quell- und Zielfeldern muss nicht unbedingt &uuml;bereinstimmen. Das hei&szlig;t, wenn Sie beispielsweise zehn Felder in einen Bereich von weniger als zehn Feldern einf&uuml;gen, dann werden nur die markierten Felder gef&uuml;llt.<\/p>\n<p>Wenn der Zielbereich gr&ouml;&szlig;er ist als der Quellbereich, dann werden ebenfalls nur die entsprechend dem kopierten Bereich gef&uuml;llt.<\/p>\n<p>Befriedigend ist das alles nicht: Fehler k&ouml;nnen so leicht auftreten, sei es durch das Auslassen eines zu f&uuml;llenden Feldes oder durch &uuml;berschreiben von Bereichen, die gar nicht ge&auml;ndert werden sollen. Es w&auml;re also am einfach-sten, wenn man etwa die in Bild 1 markierten Felder mit einem Klick etwa aktivieren oder deaktivieren oder mit einem Wert f&uuml;llen k&ouml;nnte.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1022_001.png\" alt=\"Das w&auml;re sch&ouml;n: Die markierten Felder alle mit einem Schlag beispielsweise aus- oder abw&auml;hlen\" width=\"600\" height=\"339,7878\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Das w&auml;re sch&ouml;n: Die markierten Felder alle mit einem Schlag beispielsweise aus- oder abw&auml;hlen<\/span><\/b><\/p>\n<h2>Die L&ouml;sung<\/h2>\n<p>Ein viel besserer Ansatz w&auml;re etwa ein Kontextmen&uuml;-Eintrag, den man f&uuml;r eine Markierung in der Datenblattansicht ausw&auml;hlen kann und der dann eine <b>InputBox <\/b>&ouml;ffnet, der man den einzuf&uuml;genden Wert &uuml;bergibt. Nach Bet&auml;tigen der <b>OK<\/b>-Schaltfl&auml;che soll dieser Wert in alle markierten Zellen eingef&uuml;gt werden. Dabei soll es keine Rolle spielen, wie gro&szlig; die Markierung ist &#8211; es sollen also sowohl mehrere Spalten als auch mehrere Zeilen markierbar sein, auch in Kombination miteinander. Noch sch&ouml;ner w&auml;re es, wenn ein in der Zwischenablage befindlicher Wert gleich als Standardwert in der <b>InputBox <\/b>angezeigt w&uuml;rde.<\/p>\n<p>Dies gilt es nun zu realisieren &#8211; machen wir uns ans Werk!<\/p>\n<h2>Einsatz der fertigen L&ouml;sung<\/h2>\n<p>Die fertige L&ouml;sung wird in Form einer Klasse kommen, die alle notwendigen Funktionen liefert. Die Klasse hei&szlig;t <b>clsDatasheetInsert <\/b>und sollte in dem Hauptformular, welches das in der Datenblattansicht erscheinende Unterformular enth&auml;lt, mit der Objektvariablen <b>objDatasheetInsert<\/b> deklariert werden:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objDatasheetInsert<span style=\"color:blue;\"> As <\/span>clsDatasheetInsert<\/pre>\n<p>In die Prozedur, die durch das Ereignis <b>Beim Laden <\/b>des Hauptformulars ausgel&ouml;st wird, f&uuml;gen wir die folgenden Anweisungen ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objDatasheetInsert = <span style=\"color:blue;\">New<\/span> clsDatasheetInsert\r\n     <span style=\"color:blue;\">With<\/span> objDatasheetInsert\r\n         <span style=\"color:blue;\">Set<\/span> .Form = Me!sfmArtikel.Form\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<p>Die erste Anweisung instanziert das neue Objekt und speichert einen Verweis darauf in der Variablen <b>objData-sheetInsert<\/b>. Die Anweisung innerhalb des <b>With<\/b>-Konstrukts weist der Eigenschaft <b>Form <\/b>des Objekts einen Verweis auf das Unterformular in der Datenblattansicht zu, das mit den Funktionen zum F&uuml;llen mehrerer Felder gleichzeitig versehen werden soll.<\/p>\n<p>Danach k&ouml;nnen Sie dann wie in Bild 2 die Zielfelder markieren, mit der rechten Maustaste das Kontextmen&uuml; aufrufen und dann den Eintrag <b>Wert einf&uuml;gen <\/b>ausw&auml;hlen, um die gew&uuml;nschten Daten in die markierten Felder einzuf&uuml;gen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1022_002.png\" alt=\"Einf&uuml;gen von Werten per Kontextmen&uuml;\" width=\"600\" height=\"392,2078\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einf&uuml;gen von Werten per Kontextmen&uuml;<\/span><\/b><\/p>\n<h2>Kontextmen&uuml;-Eintrag hinzuf&uuml;gen<\/h2>\n<p>F&uuml;r diese Funktion ben&ouml;tigen wir zun&auml;chst einmal einen Kontextmen&uuml;-Eintrag &#8211; und zwar nicht in irgendeinem Kontextmen&uuml;, sondern genau in dem, das beim Rechtsklick auf eines der Felder oder auf mehrere markierte Felder erscheint.<\/p>\n<p>F&uuml;r einen groben &uuml;berblick, um welches Kontextmen&uuml; es sich handeln k&ouml;nnte, schauen wir uns die Liste aller <b>Commandbar<\/b>-Objekte an, die den Typ <b>msoBarTypePopup <\/b>aufweisen. Das erledigt die folgende Prozedur, welche die Namen der Kontextmen&uuml;s im Direktbereich ausgibt (f&uuml;r diese und weitere Prozeduren ben&ouml;tigen Sie einen Verweis auf die Bibliothek <b>Microsoft Office x.0 Object Library <\/b>&#8211; s. Bild 3):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1022_004.png\" alt=\"Verweis auf die Office-Bibliothek\" width=\"425\" height=\"330,5555\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Verweis auf die Office-Bibliothek<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CommandbarsAusgeben()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>Office.CommandBar\r\n     For Each cbr In CommandBars\r\n         <span style=\"color:blue;\">If <\/span>cbr.Type = msoBarTypePopup<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> cbr.Name\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> cbr\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier erscheinen gleich zu Beginn die folgenden beiden Eintr&auml;ge:<\/p>\n<ul>\n<li><b>Form Datasheet<\/b><\/li>\n<li><b>Form Datasheet Cell<\/b><\/li>\n<\/ul>\n<p>Nun m&uuml;ssen wir nur noch herausfinden, welches der beiden Kontextmen&uuml;s beim Anklicken eines Feldes im Datenblatt erscheint. Dazu legen wir einfach in allen betroffenen Kontextmen&uuml;s einen neuen Eintrag an, der den Namen des Kontextmen&uuml;s tr&auml;gt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CommandbarsTesten()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>Office.CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>Office.CommandBarButton\r\n     <span style=\"color:blue;\">Set<\/span> cbr = CommandBars.Item(\"Form Datasheet Cell\")\r\n     <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add(msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n     cbb.Caption = \"Form Datasheet Cell\"\r\n     <span style=\"color:blue;\">Set<\/span> cbr = CommandBars.Item(\"Form Datasheet\")\r\n     <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add(msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n     cbb.Caption = \"Form Datasheet\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die <b>Set cbr &#8230;<\/b>-Anweisung referenziert jeweils eines der betroffenen Kontextmen&uuml;s, die <b>Set cbb &#8230;<\/b>-Anweisung f&uuml;gt ein neues Steuerelement des Typs <b>msoControlButton <\/b>hinzu. &uuml;ber die <b>Caption<\/b>-Eigenschaft legt die Prozedur die Beschriftung des jeweiligen Eintrags fest.<\/p>\n<p>Danach klicken wir einfach mit der rechten Maustaste auf das gew&uuml;nschte Element im Datenblatt und erhalten ganz unten die Antwort auf unsere Frage: Das Kontextmen&uuml; <b>Form Datasheet Cell<\/b> ist unser gesuchtes Objekt (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1022_003.png\" alt=\"Ermitteln des Kontextmen&uuml;s f&uuml;r das Datenblatt\" width=\"425\" height=\"401,4856\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ermitteln des Kontextmen&uuml;s f&uuml;r das Datenblatt<\/span><\/b><\/p>\n<h2>Werte einf&uuml;gen per Klasse<\/h2>\n<p>Weiter oben haben wir ja bereits erl&auml;utert, dass wir die Funktionalit&auml;t zum Einf&uuml;gen von Daten in mehrere Felder gleichzeitig in einer Klasse kapseln m&ouml;chten. Das hat den Vorteil, dass Sie den Code ganz einfach in mehreren Formularen wiederverwenden k&ouml;nnen.<\/p>\n<p>Diese Klasse hei&szlig;t <b>clsDatasheetFill <\/b>und enth&auml;lt eine <b>Property Set<\/b>-Prozedur, die einen Verweis auf das zu unterst&uuml;tzende Formular erwartet. Diesen Verweis speichert die Klasse in der wie folgt im Klassenmodul deklarierten Variablen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>m_Form<span style=\"color:blue;\"> As <\/span>Form<\/pre>\n<p>Die Prozedur selbst finden Sie in Listing 1. Sie tr&auml;gt zuerst den Verweis auf das per Parameter &uuml;bergebene Formular-Objekt in die Variable <b>m_Form <\/b>ein. Dann sorgt sie noch f&uuml;r die Erweiterung des Kontextmen&uuml;s um einen Eintrag mit dem Text <b>Wert einf&uuml;gen<\/b>. Dazu f&uuml;llt sie die Variable <b>cbr <\/b>mit einem Verweis auf das Element <b>Form Datasheet Cell <\/b>der <b>CommandBars<\/b>-Auflistung.<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>Office.CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n     <span style=\"color:blue;\">Set<\/span> cbr = CommandBars.Item(\"Form Datasheet Cell\")\r\n     For i = cbr.Controls.Count To 1 Step -1\r\n         <span style=\"color:blue;\">If <\/span>cbr.Controls.Item(i).Caption = \"Wert einf&uuml;gen\"<span style=\"color:blue;\"> Then<\/span>\r\n             cbr.Controls.Item(i).Delete\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Set<\/span> cbbInsert = cbr.Controls.Add(msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n     cbbInsert.Caption = \"Wert einf&uuml;gen\"\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einrichten des Kontextmen&uuml;s<\/span><\/b><\/p>\n<p>Anschlie&szlig;end durchl&auml;uft sie alle Eintr&auml;ge dieses Kontextmen&uuml;s und pr&uuml;ft diese auf die Beschriftung <b>Wert einf&uuml;gen<\/b>. Sind bereits Eintr&auml;ge mit dieser Beschriftung vorhanden, entfernt die Prozedur diese mit der <b>Delete<\/b>-Methode des jeweiligen Elements. Danach legt sie diesen Eintrag neu an und speichert einen Verweis darauf in der Variablen <b>cbbInsert<\/b>. Die folgende Anweisung stellt nur noch die Beschriftung auf <b>Wert einf&uuml;gen <\/b>ein.<\/p>\n<p>Die Variable <b>cbbInsert <\/b>wurde noch nicht deklariert. Da wir f&uuml;r den neu hinzugef&uuml;gten Eintrag zum Kontextmen&uuml; auch eine Ereignisprozedur hinterlegen m&ouml;chten, die beim Anklicken des Eintrags ausgel&ouml;st wird, ben&ouml;tigen wir noch eine entsprechende, mit dem Schl&uuml;sselwort <b>WithEvents <\/b>ausgestattete Variable.<\/p>\n<p>Auch diese landet wieder im Kopf des Klassenmoduls:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents cbbInsert<span style=\"color:blue;\"> As <\/span>CommandBarButton<\/pre>\n<p>Wie legen Sie nun die ben&ouml;tigte Ereignisprozedur an Dazu w&auml;hlen Sie einfach im Klassenmodul im linken Kombinationsfeld den Eintrag <b>cbbInsert<\/b> aus, der dort nur deshalb erscheint, weil Sie die Objektvariable mit <b>With-Events <\/b>deklariert haben. Nun erscheint im rechten Kombinationsfeld das Standardereignis <b>Click <\/b>(im &uuml;brigen auch das einzige Ereignis dieses Objekts) und der VBA-Editor legt die passende Ereignisprozedur an (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1022_005.png\" alt=\"Anlegen einer Ereignisprozedur, die beim Anklicken eines Kontextmen&uuml;-Eintrags ausgel&ouml;st wird\" width=\"600\" height=\"237,7682\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Anlegen einer Ereignisprozedur, die beim Anklicken eines Kontextmen&uuml;-Eintrags ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Diese Prozedur erg&auml;nzen Sie nun wie in Listing 2. Die Prozedur fragt per Inputbox den einzuf&uuml;genden Inhalt ab. Dabei verwendet sie als Standardwert einen Wert, den die Funktion <b>AusZwischenablage <\/b>liefert.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cbbInsert_Click(ByVal Ctrl<span style=\"color:blue;\"> As <\/span>Office.CommandBarButton, CancelDefault<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strInhalt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolFill<span style=\"color:blue;\"> As Boolean<\/span>\r\n     strInhalt = InputBox(\"Geben Sie den einzuf&uuml;genden Wert an:\", \"Zellen f&uuml;llen\", AusZwischenablage)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strInhalt) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         bolFill = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Felder leeren\", vbYesNo) = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n             bolFill = <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;\">If <\/span>bolFill<span style=\"color:blue;\"> Then<\/span>\r\n         Fill strInhalt\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Ereignisprozedur, die beim Ausw&auml;hlen des Kontextmen&uuml;-Eintrags ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Diese finden Sie im Modul <b>mdlTools<\/b>. Die Funktion gibt den aktuellen Inhalt der Zwischenablage zur&uuml;ck. Auf diese Weise k&ouml;nnte der Benutzer wie gewohnt den einzuf&uuml;genden Text per <b>Strg + C <\/b>oder mit dem Kontextmen&uuml;-Befehl <b>Kopieren <\/b>ermitteln.<\/p>\n<p><!--30percent--><\/p>\n<p>Enth&auml;lt die Variable <b>strInhalt <\/b>nach dem Eintragen des Ergebnisses der <b>InputBox<\/b>-Funktion keine leere Zeichenfolge, stellt die Prozedur die Variable <b>bolFill <\/b>auf den Wert <b>True <\/b>ein. Falls nicht, soll die Prozedur pr&uuml;fen, ob der Benutzer vielleicht einfach nur die <b>Abbrechen<\/b>-Schaltfl&auml;che bet&auml;tigt hat (was ebenfalls eine leere Zeichenkette zur&uuml;ckliefert) oder ob er tats&auml;chlich eine leere Zeichenkette eingegeben hat, um die markierten Felder der Datenblattansicht zu leeren beziehungsweise mit einer leeren Zeichenkette zu f&uuml;llen. W&auml;hlt der Benutzer hier die Antwort <b>Ja <\/b>(<b>vbYes<\/b>), wird <b>bolFill <\/b>ebenfalls auf <b>True <\/b>eingestellt. Hat <b>bolFill<\/b> im Anschluss den Wert <b>True<\/b>, ruft die Prozedur die Routine <b>Fill <\/b>mit dem einzusetzenden Wert aus der Variablen <b>strInhalt <\/b>als Parameter auf.<\/p>\n<h2>F&uuml;llen der markierten Felder<\/h2>\n<p>Nun folgt der interessante Teil der L&ouml;sung. Hier ben&ouml;tigen wir zun&auml;chst einen Ansatz, um die markierten Felder zu f&uuml;llen.<\/p>\n<p>Um die entsprechenden Inhalte zu &auml;ndern, gibt es zwei Wege:<\/p>\n<ul>\n<li>Bearbeiten der Datenherkunft des Formulars in der Datenblattansicht und Aktualisieren des Datenblatts mit den ge&auml;nderten Daten oder<\/li>\n<li>Durchlaufen der markierten Felder und direktes Eintragen der Werte per VBA.<\/li>\n<\/ul>\n<p>F&uuml;r die erste Variante m&uuml;ssten wir jeweils den Namen des Feldes ermitteln sowie den Prim&auml;rschl&uuml;sselwert des Datensatzes mit dem zu &auml;ndernden Feld.<\/p>\n<p>Beides ist mit erh&ouml;htem Aufwand verbunden, da wir zum Beispiel den Namen des Prim&auml;rschl&uuml;sselfeldes ermitteln m&uuml;ssten, um dann mit dem Prim&auml;rschl&uuml;sselwert auf den zu &auml;ndernden Datensatz zuzugreifen.<\/p>\n<p>Die zweite Variante erscheint etwas intuitiver, da sie keinen direkten Zugriff auf die zugrunde liegenden Daten erfordert, sondern &uuml;ber die Benutzeroberfl&auml;che auf die zu &auml;ndernden Felder zugreift.<\/p>\n<p>In beiden F&auml;llen m&uuml;ssen wir die aktuelle Markierung zum Zeitpunkt der Bet&auml;tigung des Kontextmen&uuml;-Eintrags ermitteln. Dies scheint relativ einfach zu sein &#8211; wozu gibt es schlie&szlig;lich die Eigenschaften <b>SelTop<\/b>, <b>SelLeft<\/b>, <b>SelHeight <\/b>und <b>SelWidth <\/b>des <b>Form<\/b>-Objekts<\/p>\n<p>Leider liefern diese Eigenschaften etwas merkw&uuml;rdige Werte, wie folgende Beispiele zeigen:<\/p>\n<ul>\n<li>Erstes Feld von links, erstes von oben: <b>SelLeft <\/b>= 2, <b>SelWidth <\/b>= 0, <b>SelTop <\/b>= 1, <b>SelHeight <\/b>= 0<\/li>\n<li>Linkes Feld, zweites von oben: <b>SelLeft <\/b>= 2, <b>SelWidth <\/b>= 0, <b>SelTop <\/b>= 2, <b>SelHeight <\/b>= 0<\/li>\n<li>Zweites Feld von links, erstes von oben: <b>SelLeft <\/b>= 3, <b>SelWidth <\/b>= 0, <b>SelTop <\/b>= 1, <b>SelHeight <\/b>= 0<\/li>\n<li>Zweites Feld von links, zweites von oben: <b>SelLeft <\/b>= 3, <b>SelWidth <\/b>= 0, <b>SelTop <\/b>= 2, <b>SelHeight <\/b>= 0<\/li>\n<\/ul>\n<p>Der Index von links aus gesehen scheint mit dem Wert <b>2 <\/b>zu beginnen statt mit <b>1<\/b>, die Breite und H&ouml;he der Markierung wird jeweils mit dem Wert <b>0 <\/b>angegeben. Der Rest ist reproduzierbar.<\/p>\n<p>Interessant wird es bei Markierungen mit mehreren Feldern: Hier stimmen die Werte f&uuml;r <b>SelLeft <\/b>und <b>SelTop <\/b>mit denen aus den vorherigen Experimenten &uuml;berein, allerdings liefert eine Markierung, die etwa zwei Spalten und eine Zeile umfasst, f&uuml;r <b>SelWidth <\/b>den Wert <b>2<\/b>. Dies passt nicht exakt zu dem Wert f&uuml;r eine Markierung &uuml;ber eine Spalte, wo <b>SelWidth <\/b>den Wert <b>0 <\/b>annimmt.<\/p>\n<p>Nach einigen weiteren Experimenten wurde klar, woran dies liegt: Wenn Sie beim Markieren eines einzelnen Feldes nur die Einf&uuml;gemarke im Feld platzieren, haben <b>SelWidth <\/b>und <b>SelHeight <\/b>den Wert <b>0<\/b>. Erst, wenn Sie das komplette Feld markiert haben, bekommen <b>SelWidth <\/b>und <b>SelHeight <\/b>den Wert <b>1<\/b>.<\/p>\n<p>Dies ist unter den Standardeinstellungen per Mausklick aber nur zu erreichen, wenn der Mauszeiger beim Anklicken das Plus-Symbol anzeigt &#8211; daher erhielten wir beim Testen immer den Wert <b>0<\/b> (und manchmal zuf&auml;llig und zu unserer Verwirrung den Wert <b>1 <\/b>&#8230;).<\/p>\n<h2>Markierungen ermitteln und durchlaufen<\/h2>\n<p>Die bereits erw&auml;hnte Prozedur <b>Fill <\/b>finden Sie in Listing 3. Die Prozedur erwartet den einzutragenden Wert als Parameter. Sie ermittelt zun&auml;chst die Originalwerte der Eigenschaften <b>SelLeft<\/b>, <b>SelWidth<\/b>, <b>SelTop <\/b>und <b>SelHeight <\/b>der aktuellen Markierung und speichert diese in den Variablen <b>intSelLeftOriginal<\/b>, <b>intSelWidthOriginal<\/b>, <b>intSelTopOriginal <\/b>und <b>intSelHeightOriginal<\/b>. Diese ben&ouml;tigen wir, um die aktuelle Markierung sp&auml;ter wieder herzustellen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Fill(varWert<span style=\"color:blue;\"> As Variant<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intSelLeft<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelTop<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelWidth<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelHeight<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intRow<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intColumn<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelLeftOriginal<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelTopOriginal<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelWidthOriginal<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelHeightOriginal<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">With<\/span> m_Form\r\n         intSelLeftOriginal = .SelLeft\r\n         intSelWidthOriginal = .SelWidth\r\n         intSelTopOriginal = .SelTop\r\n         intSelHeightOriginal = .SelHeight\r\n         <span style=\"color:blue;\">If <\/span>.SelWidth = 0<span style=\"color:blue;\"> Then<\/span>\r\n             intSelWidth = 1\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             intSelWidth = .SelWidth\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         intSel<span style=\"color:blue;\">Left<\/span> = .Sel<span style=\"color:blue;\">Left<\/span> - 1\r\n         <span style=\"color:blue;\">If <\/span>.SelHeight = 0<span style=\"color:blue;\"> Then<\/span>\r\n             intSelHeight = 1\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             intSelHeight = .SelHeight\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         intSelTop = .SelTop\r\n         For intColumn = intSel<span style=\"color:blue;\">Left<\/span> To intSel<span style=\"color:blue;\">Left<\/span> + intSelWidth - 1\r\n             .SelHeight = 0\r\n             .SelWidth = 0\r\n             .Sel<span style=\"color:blue;\">Left<\/span> = intColumn\r\n             .SelWidth = 1\r\n             For intRow = intSelTop To intSelTop + intSelHeight - 1\r\n                 .SelTop = intRow\r\n                 .SelHeight = 1\r\n                 FillValue varWert\r\n             <span style=\"color:blue;\">Next<\/span> intRow\r\n         <span style=\"color:blue;\">Next<\/span> intColumn\r\n         .SelTop = intSelTopOriginal\r\n         .Sel<span style=\"color:blue;\">Left<\/span> = intSelLeftOriginal\r\n         .SelWidth = intSelWidth\r\n         .SelHeight = intSelHeight\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ermitteln, Durchlaufen und Wiederherstellen der Markierung<\/span><\/b><\/p>\n<p>Danach tragen wir die tats&auml;chlichen Abmessungen in die Variablen <b>intSelLeft<\/b>, <b>intSelWidth<\/b>, <b>intSelTop <\/b>und <b>intSelHeight <\/b>ein. Diese weichen dabei unter Umst&auml;nden von den eigentlichen Werten aus den Eigenschaften <b>SelLeft<\/b>, <b>SelWidth<\/b>, <b>SelTop <\/b>und <b>SelHeight <\/b>ab.<\/p>\n<p>So pr&uuml;ft die Prozedur, ob sich nur die Einf&uuml;gemarke in einem Feld befindet (<b>SelWidth = 0 <\/b>und <b>SelHeight = 0<\/b>) oder ob ein oder mehrere Felder tats&auml;chlich markiert sind (<b>SelWidth <\/b>und <b>SelHeight <\/b>ungleich <b>0<\/b>). Enthalten <b>SelWidth<\/b> und <b>SelHeight <\/b>den Wert 0, tr&auml;gt die Prozedur f&uuml;r <b>intSelWidth <\/b>und <b>intSelHeight <\/b>jeweils den Wert <b>1 <\/b>ein. Anderenfalls &uuml;bernimmt sie die vorhandenen Werte der Eigenschaften <b>SelWidth <\/b>und <b>SelHeight<\/b>.<\/p>\n<p>Vom Wert der Eigenschaft <b>SelLeft<\/b>, die ja aus unerfindlichen Gr&uuml;nden immer um eins gr&ouml;&szlig;er ist als der tats&auml;chliche Spaltenindex, subtrahieren wir den Wert <b>1 <\/b>und tragen das Ergebnis in <b>intSelLeft <\/b>ein. <b>SelTop <\/b>ist die einzige Eigenschaft, deren Wert wir unver&auml;ndert in die Variable <b>intSelTop <\/b>&uuml;bernehmen k&ouml;nnen.<\/p>\n<p>Damit starten wir in zwei verschachtelte <b>For&#8230;Next<\/b>-Schleifen. Die erste durchl&auml;uft die Werte von <b>intSelLeft <\/b>(Index der ersten Spalte) bis <b>intSelLeft + intSelWidth -1<\/b> (Index der letzten Spalte) und speichert diese jeweils in der Laufvariablen <b>intColumn<\/b>. Die zweite durchl&auml;uft alle markierten Zeilen, also die Werte von <b>intSelTop <\/b>bis <b>intSelTop + intSelHeight -1<\/b>, in der Variablen <b>intRow<\/b>.<\/p>\n<p>Die beiden Schleifen sollen nacheinander die Felder aller Zeilen und Spalten durchlaufen und dabei den Wert aus dem Parameter <b>varWert <\/b>in das jeweils aktuelle Feld eintragen.<\/p>\n<p>In der ersten Schleife stellen wir zun&auml;chst die Eigenschaften <b>SelHeight <\/b>und <b>SelWidth <\/b>auf <b>0 <\/b>ein. Dies hat den Hintergrund, dass man die Werte dieser Eigenschaften nicht auf einen Wert gr&ouml;&szlig;er als <b>0 <\/b>ver&auml;ndern kann, solange sie einen Wert gr&ouml;&szlig;er als <b>0 <\/b>aufweisen &#8211; wir m&uuml;ssen also quasi die Markierung erst aufl&ouml;sen, bevor wir diese neu setzen k&ouml;nnen. Dann stellt die Prozedur die Eigenschaft <b>SelLeft<\/b> auf den aktuellen Wert von <b>intColumn <\/b>ein und die Breite mit der Eigenschaft <b>SelWidth <\/b>auf <b>1<\/b> (wir k&ouml;nnen ja nur ein Feld auf einmal ver&auml;ndern).<\/p>\n<p>Dann in der inneren <b>For&#8230;Next<\/b>-Schleife mit der Laufvariablen <b>intRow <\/b>stellt die Prozedur den Wert der Eigenschaft <b>SelTop <\/b>auf den Wert aus <b>intRow <\/b>und den Wert der Eigenschaft <b>SelHeight <\/b>auf <b>1 <\/b>ein.<\/p>\n<p>Au&szlig;erdem ruft sie dort die Routine <b>FillValue <\/b>auf und &uuml;bergibt den einzutragenden Wert. Warum hier noch eine eigene Routine Weil es sonst etwas un&uuml;bersichtlich wird, denn wir m&uuml;ssen hier noch die verschiedenen Feldtypen behandeln und gegebenenfalls auf Fehler durch bestehende Restriktionen reagieren.<\/p>\n<p>Schlie&szlig;lich soll die Prozedur noch die beim Aufrufen vorhandene Markierung im Datenblatt wiederherstellen. Dazu stellt sie die Eigenschaften <b>SelTop<\/b>, <b>SelLeft<\/b>, <b>SelWidth <\/b>und <b>SelHeight <\/b>wieder auf die in den Variablen <b>intSelTopOriginal<\/b>, <b>intSelLeftOriginal<\/b>, <b>intSelWidth <\/b>und <b>intSelHeight <\/b>ein.<\/p>\n<h2>Steuerelemente f&uuml;llen<\/h2>\n<p>Das F&uuml;llen der verschiedenen Steuerelementtypen (Textfeld, Kombinationsfeld und Kontrollk&auml;stchen) erledigt die Prozedur <b>FillValues<\/b>, die als Parameter den zu verwendenden Wert erwartet (s. Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>FillValue(varValue<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">Dim <\/span>chk<span style=\"color:blue;\"> As <\/span>CheckBox\r\n     <span style=\"color:blue;\">Dim <\/span>cbo<span style=\"color:blue;\"> As <\/span>ComboBox\r\n     <span style=\"color:blue;\">Dim <\/span>lngError<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFehlermeldung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Screen.ActiveControl\r\n     Select Case ctl.ControlType\r\n         <span style=\"color:blue;\">Case <\/span>acTextBox\r\n             <span style=\"color:blue;\">Set<\/span> txt = ctl\r\n             On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n             txt.Value = varValue\r\n             lngError = Err.Number\r\n             <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">Case <\/span>acComboBox\r\n             <span style=\"color:blue;\">Set<\/span> cbo = ctl\r\n             lngError = ComboBoxFuellen(varValue, cbo)\r\n         <span style=\"color:blue;\">Case <\/span>acCheckBox\r\n             <span style=\"color:blue;\">Set<\/span> chk = ctl\r\n             On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n             chk.Value = varValue\r\n             lngError = Err.Number\r\n             <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> ctl.ControlType\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">If <\/span>lngError = 0<span style=\"color:blue;\"> Then<\/span>\r\n         FillValue = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngError = -1<span style=\"color:blue;\"> Then<\/span>\r\n             strFehlermeldung = AccessError(lngError)\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strFehlermeldung = \"Kein passender Wert im Kombifeld vorhanden.\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Der Wert ''\" & varValue & \"'' konnte nicht in das Feld ''\" & ctl.Name & \"'' eingetragen werden.\" _\r\n             & <span style=\"color:blue;\">vbCrLf<\/span> & \"Fehlermeldung: \" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"''\" & strFehlermeldung & \"''\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Die Verarbeitung wurde abgebrochen.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: F&uuml;llen des Wertes in die einzelnen Steuerelemente<\/span><\/b><\/p>\n<p>Das zu f&uuml;llende Steuerelement wurde ja durch die Prozedur <b>Fill <\/b>bereits markiert. Es wird nun &uuml;ber die Funktion <b>Screen.ActiveControl <\/b>ermittelt und mit der Variablen <b>ctl <\/b>referenziert. Je nach dem Steuerelementtyp steuert die Prozedur nun einen der drei Zweige einer <b>Select Case<\/b>-Bedingung an &#8211; je einen f&uuml;r die Werte <b>acTextBox<\/b>, <b>acComboBox <\/b>und <b>acCheckBox <\/b>der Eigenschaft <b>ControlType <\/b>des Objekts aus der Variablen <b>ctl<\/b>.<\/p>\n<p>Im Fall eines Textfeldes ist der Fall einfach: Wir weisen das Steuerelement der Variablen <b>txt <\/b>mit dem Datentyp <b>Textbox <\/b>zu und f&uuml;llen dessen Eigenschaft <b>Value <\/b>mit dem &uuml;bergebenen Wert.<\/p>\n<p>Allerdings kann es hier zu einem Fehler kommen, wenn eine eventuell f&uuml;r das Textfeld festgelegte Restriktion verletzt wird. Dies ist beispielsweise der Fall, wenn das Feld keine leere Zeichenkette aufnehmen darf, die Variable <b>varValue <\/b>jedoch eine solche enth&auml;lt.<\/p>\n<p>In diesem Fall werden durch die Anweisung <b>txt.Value = varValue <\/b>gleich zwei Fehler ausgel&ouml;st: Der erste ist der Fehler der Benutzeroberfl&auml;che, hier des Formulars, der wie in Bild 6 auftaucht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1022_006.png\" alt=\"Fehler beim Versuch, eine leere Zeichenkette in ein Feld mit einer entsprechenden Restriktion einzutragen\" width=\"600\" height=\"285,6259\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Fehler beim Versuch, eine leere Zeichenkette in ein Feld mit einer entsprechenden Restriktion einzutragen<\/span><\/b><\/p>\n<p>Wie wir diesen unterbinden, zeigen wir gleich im Anschluss. Zun&auml;chst noch zum zweiten Fehler &#8211; dieser ist ein Laufzeitfehler, der in der oben genannten Zeile auftritt (beim Verletzen etwa einer Restriktion, die keine leeren Zeichenketten erlaubt, etwa der Fehler mit der Nummer <b>2113 <\/b>und dem gleichen Fehlertext wie in der Abbildung ersichtlich).<\/p>\n<p>Diesen k&ouml;nnen wir, wie unter VBA &uuml;blich, durch Voranstellen der Anweisung <b>On Error Resume Next <\/b>unterbinden und anschlie&szlig;end auswerten &#8211; in diesem Fall, indem wir die Fehlernummer einfach in der Variablen <b>lngError <\/b>speichern.<\/p>\n<p>Um den in der Benutzeroberfl&auml;che angezeigten Fehler zu unterbinden, m&uuml;ssen wir f&uuml;r das betroffene Formular in der Datenblattansicht eine Ereignisprozedur anlegen, die durch das Ereignis <b>Bei Fehler <\/b>ausgel&ouml;st wird. Diese implementieren wir nat&uuml;rlich auch in der Klasse <b>clsDatasheetFill<\/b>. Dazu &auml;ndern wir zun&auml;chst die Deklaration der Variable f&uuml;r das <b>Form<\/b>-Objekt, indem wir das Schl&uuml;sselwort <b>WithEvents <\/b>erg&auml;nzen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents m_Form<span style=\"color:blue;\"> As <\/span>Form<\/pre>\n<p>Au&szlig;erdem f&uuml;gen wir der <b>Property Set<\/b>-Prozedur <b>Form <\/b>die nachfolgend fett gedruckte Zeile hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n     m_Form.OnError = \"[Event Procedure]\"\r\n     ...\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Fehlt noch die Implementierung der Ereignisprozedur, die wie folgt aussieht und ebenfalls in die Klasse <b>clsData-sheetFill <\/b>geh&ouml;rt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>,  Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>2113, 3315\r\n             Response = acDataErrContinue\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Prozedur pr&uuml;ft die Fehlernummer und unterbindet die Ausgabe der Fehlermeldung, sofern eine der in der <b>Select Case<\/b>-Anweisung aufgef&uuml;hrten Fehlernummern auftritt.<\/p>\n<h2>Weitere Steuerelemente<\/h2>\n<p>Damit ist das Einf&uuml;gen von Werten in ein Textfeld abgeschlossen. Bei Kombinationsfeldern sieht das erheblich komplizierter aus. Der Hintergrund ist, dass ein Kombinationsfeld ja meist nur die Daten einer verkn&uuml;pften Datei anzeigt und nicht die im dahinter stehenden Feld enthaltenen Daten (also den Inhalt des entsprechenden Fremdschl&uuml;sselfeldes). Das hei&szlig;t also, dass das blinde Einf&uuml;gen eines Textes, also beispielsweise des Kategorienamens <b>Alkoholfreie Getr&auml;nke <\/b>f&uuml;r das Feld <b>KategorieID <\/b>der Tabelle <b>tblArtikel<\/b>, zu einem Fehler f&uuml;hrt. Das Feld <b>KategorieID <\/b>nimmt n&auml;mlich nur Zahlenwerte entgegen, und hier auch nur solche, die bereits in der verkn&uuml;pften Tabelle <b>tblKategorien <\/b>als Prim&auml;rschl&uuml;sselwert verwendet werden. Wir m&uuml;ssen also eigentlich den einzuf&uuml;genden Wert heranziehen, in der Lookup-Tabelle nachschlagen, ob der Wert &uuml;berhaupt enthalten ist, und in diesem Fall den passenden Prim&auml;rschl&uuml;sselwert ermitteln.<\/p>\n<p>Diesen Teil haben wir in eine weitere Funktion namens <b>ComboBoxFuellen<\/b> ausgelagert. Bevor wir uns diese anschauen, werfen wir noch einen schnellen Blick darauf, wie die Prozedur <b>FillValue <\/b>endet. Diese erledigt noch das F&uuml;llen von Kontrollk&auml;stchen, wobei hier darauf zu achten ist, dass man einen der beiden Werte <b>0 <\/b>oder <b>-1 <\/b>eingibt (und nicht etwa Texte wie <b>Wahr <\/b>oder <b>Falsch <\/b>&#8211; auch dies lie&szlig;e sich verarbeiten, aber das haben wir ausgelassen). Die Fehlerbehandlung beim Kontrollk&auml;stchen sieht genauso aus wie beim Textfeld. Wenn <b>lngError <\/b>nach dem F&uuml;llen des jeweiligen Steuerelements den Wert <b>0 <\/b>enth&auml;lt, ist kein Fehler aufgetreten und die Funktion <b>FillValue <\/b>liefert den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<p>Anderenfalls pr&uuml;ft die Prozedur noch, ob  <b>lngError <\/b>den Wert <b>-1 <\/b>aufweist, was nur dann der Fall ist, wenn es sich bei dem Zielsteuerelement um ein Kombinationsfeld handelt und der einzuf&uuml;gende Wert dort nicht gefunden werden konnte. In diesem Fall erscheint die Meldung <b>Kein passender Wert im Kombifeld vorhanden<\/b>. Bei allen anderen Feldern wird die angezeigte Fehlermeldung entsprechend der Fehlernummer mit der Funktion <b>AccessError <\/b>ermittelt und in der Variablen <b>strFehlermeldung <\/b>gespeichert. Eine anschlie&szlig;ende <b>Msg-Box <\/b>zeigt einen allgemeinen Hinweistext und die gefundene Fehlermeldung an, die Verarbeitung wird an dieser Stelle abgebrochen.<\/p>\n<h2>Werte in Kombinationsfelder einf&uuml;gen<\/h2>\n<p>Die Funktion <b>ComboBoxFuellen <\/b>aus Listing 5 erledigt das Eintragen eines Wertes in ein Kombinationsfeld, das als Nachschlagefeld f&uuml;r Werte aus Lookup-Tabellen dient.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ComboBoxFuellen(varValue<span style=\"color:blue;\"> As Variant<\/span>, cbo<span style=\"color:blue;\"> As <\/span>ComboBox)<span style=\"color:blue;\"> As Long<\/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>strComboAnzeigefeld<span style=\"color:blue;\"> As String<\/span>, strComboPKFeld<span style=\"color:blue;\"> As String<\/span>, strComboTabelle<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSpaltenbreiten()<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>intStart<span style=\"color:blue;\"> As Integer<\/span>, intEnde<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngValue<span style=\"color:blue;\"> As Long<\/span>, lngError<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(cbo.RowSource, dbOpenDynaset)\r\n     strSpaltenbreiten = <span style=\"color:blue;\">Split<\/span>(cbo.ColumnWidths, \";\")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strSpaltenbreiten) To <span style=\"color:blue;\">UBound<\/span>(strSpaltenbreiten)\r\n         Select Case strSpaltenbreiten(i)\r\n             <span style=\"color:blue;\">Case <\/span>\"\", \"0\"\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     strComboAnzeigefeld = rst.Fields(i).Name\r\n     strComboPKFeld = rst.Fields(cbo.BoundColumn - 1).Name\r\n     strComboTabelle = rst.Fields(i).SourceTable\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     lngValue = Nz(DLookup(strComboPKFeld, strComboTabelle, strComboAnzeigefeld & \" = ''\" & varValue & \"''\"), 0)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngValue = 0<span style=\"color:blue;\"> Then<\/span>\r\n         cbo.Value = lngValue\r\n         lngError = Err.Number\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lngError = -1\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ComboBoxFuellen = lngError\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: F&uuml;llen von Kombinationsfeldern<\/span><\/b><\/p>\n<p>Es erwartet den einzuf&uuml;genden Wert und einen Verweis auf das zu f&uuml;llende Kombinationsfeld als Parameter. Wir ben&ouml;tigen hier ein <b>Database<\/b>-Objekt und ein <b>Recordset<\/b>-Objekt, da wir auf die Felder der als Datensatzherkunft des Kombinationsfelds verwendeten Tabelle zugreifen m&uuml;ssen. Das <b>Recordset<\/b>-Objekt f&uuml;llen wir mit den Datens&auml;tzen der Datensatzherkunft, die wir aus der Eigenschaft <b>RowSource <\/b>des Kombinationsfelds einlesen. Hier ermitteln wir zun&auml;chst die Spalte des Kombinationsfeldes, welche das angezeigte Feld der Datensatzherkunft enth&auml;lt.<\/p>\n<p>Dazu f&uuml;llen wir den Wert der Eigenschaft <b>Spaltenbreiten <\/b>(<b>ColumnWidths<\/b>) als Array in die entsprechend deklarierte Variable <b>strSpaltenbreiten<\/b>. Dies durchlaufen wir so lange, bis der Inhalt nicht mehr leer oder <b>0<\/b> ist (im Eigenschaftsfenster wird beispielsweise oft der Wert <b>0cm <\/b>angezeigt, was bedeutet, dass die erste Spalte mit der Breite <b>0 <\/b>erscheint und die folgenden den restlichen Platz beanspruchen).<\/p>\n<p>Die Spalte nach den Spalten mit der Breite <b>0 <\/b>oder einer leeren Zeichenkette ist die erste sichtbare Spalte. Da wir die Elemente des Array <b>strSpaltenbreiten <\/b>so lange in einer <b>For&#8230;Next<\/b>-Schleife durchlaufen, bis wir alle nicht sichtbaren Spalten abgearbeitet haben, entspricht die Laufvariable <b>i <\/b>der Schleife der Position des sichtbaren Feldes in der Datensatzherkunft.<\/p>\n<p>Die wiederum haben wir ja bereits mit dem Recordset <b>rst <\/b>erfasst, sodass wir &uuml;ber <b>rst.Fields(i).Name <\/b>den Namen des angezeigten Feldes der Datensatzherkunft ermitteln und in der Variablen <b>strComboAnzeigefeld <\/b>speichern k&ouml;nnen.<\/p>\n<p>Beim Prim&auml;rschl&uuml;sselfeld der Datensatzherkunft des Kombinationsfeldes sieht es &auml;hnlich aus: Hier ben&ouml;tigen wir allerdings die Eigenschaft <b>Gebundene Spalte <\/b>(<b>BoundColumn<\/b>) des Kombinationsfeldes, um den Feldnamen der gebundenen Spalte (die zumeist dem Prim&auml;rschl&uuml;sselfeld der verkn&uuml;pften Tabelle entspricht) zu ermitteln und in der Variablen <b>strComboPKFeld <\/b>zu speichern.<\/p>\n<p>Nun fehlt noch die in der Datensatzherkunft verwendete Tabelle (wir gehen an dieser Stelle davon aus, dass es sich dabei tats&auml;chlich um eine einzelne Tabelle und nicht etwa um mehrere verkn&uuml;pfte Tabellen handelt).<\/p>\n<p>Diese ermitteln wir einfach aus der Eigenschaft <b>SourceTable <\/b>des  Feld-Objekts des angezeigten Feldes (<b>rst.Fields(i).SourceTable<\/b>).<\/p>\n<p>Damit k&ouml;nnen eine Lookup-Funktion f&uuml;llen, um den Wert des Prim&auml;rschl&uuml;sselfeldes f&uuml;r den Datensatz der als Datensatzherkunft verwendeten Tabelle zu ermitteln, dessen zur Anzeige genutztes Feld unserem einzuf&uuml;genden Inhalt entspricht. Das Ergebnis speichern wir in der Variablen <b>lngValue<\/b>.<\/p>\n<p>Enth&auml;lt diese Variable anschlie&szlig;end nicht den Wert <b>0<\/b>, was bedeuten w&uuml;rde, dass kein passender Datensatz gefunden wurde, f&uuml;llt die Funktion das Kombinationsfeld mit dem gefundenen Prim&auml;rschl&uuml;sselwert.<\/p>\n<p>Anderenfalls geschieht nichts weiter und die als R&uuml;ckgabewert verwendete Variablen <b>lngError <\/b>wird mit dem Wert <b>-1 <\/b>gef&uuml;llt. Dies wertet die aufrufende Prozedur wie oben beschrieben in Form einer Fehlermeldung aus &#8211; mit den Hinweis, dass der einzuf&uuml;gende Wert nicht als Wert des Kombinationsfeldes zur Verf&uuml;gung steht.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In der vorliegenden Form lassen sich zumindest einspaltige Bereiche sehr einfach f&uuml;llen. Dabei geben Sie f&uuml;r Textfelder ganz einfach den einzuf&uuml;genden Text an, der dann in die markierten Bereiche geschrieben wird. Bei Kontrollk&auml;stchen m&uuml;ssen Sie einen der Werte <b>-1 <\/b>(f&uuml;r <b>True<\/b>) oder <b>0 <\/b>(f&uuml;r <b>False<\/b>) angeben. Definitionsgem&auml;&szlig; k&ouml;nnen Sie f&uuml;r <b>True <\/b>auch beliebige andere ganzzahlige Werte verwenden.<\/p>\n<p>F&uuml;r Kombinationsfelder k&ouml;nnen Sie einfach einen der verf&uuml;gbaren Werte als neuen Wert angeben. Dies funktioniert allerdings nur f&uuml;r Kombinationsfelder, die als Nachschlagefelder auf die Werte aus Lookup-Tabellen genutzt werden. F&uuml;r den Zugriff auf Eintr&auml;ge aus Wertlisten oder andere Elemente ist die L&ouml;sung nicht zugeschnitten. Dies k&ouml;nnten Sie jedoch in der Funktion <b>ComboBoxFuellen <\/b>erg&auml;nzen.<\/p>\n<p>Sie m&uuml;ssten dort nur pr&uuml;fen, welchen Typ die Datensatzherkunft des Kombinationsfeldes hat, und mit einer <b>Select Case<\/b>-Bedingung auf die verschiedenen Werte eingehen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DatenblattImGriff.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{F8C9D68F-30EF-42D7-BD45-B3D89D20FF09}\/aiu_1022.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der Datenblattansicht lassen sich ja bereits eine Menge Dinge erledigen &#8211; Daten einf&uuml;gen, l&ouml;schen, bearbeiten, kopieren, ausschneiden &#8230; Sie k&ouml;nnen sogar komplette Bereiche kopieren und in andere Bereiche einf&uuml;gen, sofern diese Bereiche zueinander kompatibel sind, und Access ist hier recht tolerant. Was aber fehlt, ist die Markierung eines Zielbereichs, dessen Felder dann alle mit dem gleichen Wert gef&uuml;llt werden. Wenn Sie also etwa f&uuml;r alle Datens&auml;tze ein Ja\/Nein-Feld anhaken m&ouml;chten, m&uuml;ssen Sie dies immer noch manuell erledigen. Dieser Beitrag zeigt eine passende L&ouml;sung f&uuml;r Datenbl&auml;tter in Formularen und Unterformularen.<\/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":[66012016,662016,44000023],"tags":[],"class_list":["post-55001022","post","type-post","status-publish","format-standard","hentry","category-66012016","category-662016","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Datenblattmarkierung f&uuml;llen - 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\/Datenblattmarkierung_fuellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenblattmarkierung f&uuml;llen\" \/>\n<meta property=\"og:description\" content=\"In der Datenblattansicht lassen sich ja bereits eine Menge Dinge erledigen - Daten einf&uuml;gen, l&ouml;schen, bearbeiten, kopieren, ausschneiden ... Sie k&ouml;nnen sogar komplette Bereiche kopieren und in andere Bereiche einf&uuml;gen, sofern diese Bereiche zueinander kompatibel sind, und Access ist hier recht tolerant. Was aber fehlt, ist die Markierung eines Zielbereichs, dessen Felder dann alle mit dem gleichen Wert gef&uuml;llt werden. Wenn Sie also etwa f&uuml;r alle Datens&auml;tze ein Ja\/Nein-Feld anhaken m&ouml;chten, m&uuml;ssen Sie dies immer noch manuell erledigen. Dieser Beitrag zeigt eine passende L&ouml;sung f&uuml;r Datenbl&auml;tter in Formularen und Unterformularen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:04:30+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/8e2dd6f75b634da0bf352bd51ece3927\" \/>\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=\"24\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenblattmarkierung f&uuml;llen\",\"datePublished\":\"2020-05-22T19:04:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/\"},\"wordCount\":4161,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8e2dd6f75b634da0bf352bd51ece3927\",\"articleSection\":[\"1\\\/2016\",\"2016\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/\",\"name\":\"Datenblattmarkierung f&uuml;llen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8e2dd6f75b634da0bf352bd51ece3927\",\"datePublished\":\"2020-05-22T19:04:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8e2dd6f75b634da0bf352bd51ece3927\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8e2dd6f75b634da0bf352bd51ece3927\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattmarkierung_fuellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenblattmarkierung f&uuml;llen\"}]},{\"@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":"Datenblattmarkierung f&uuml;llen - 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\/Datenblattmarkierung_fuellen\/","og_locale":"de_DE","og_type":"article","og_title":"Datenblattmarkierung f&uuml;llen","og_description":"In der Datenblattansicht lassen sich ja bereits eine Menge Dinge erledigen - Daten einf&uuml;gen, l&ouml;schen, bearbeiten, kopieren, ausschneiden ... Sie k&ouml;nnen sogar komplette Bereiche kopieren und in andere Bereiche einf&uuml;gen, sofern diese Bereiche zueinander kompatibel sind, und Access ist hier recht tolerant. Was aber fehlt, ist die Markierung eines Zielbereichs, dessen Felder dann alle mit dem gleichen Wert gef&uuml;llt werden. Wenn Sie also etwa f&uuml;r alle Datens&auml;tze ein Ja\/Nein-Feld anhaken m&ouml;chten, m&uuml;ssen Sie dies immer noch manuell erledigen. Dieser Beitrag zeigt eine passende L&ouml;sung f&uuml;r Datenbl&auml;tter in Formularen und Unterformularen.","og_url":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:04:30+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/8e2dd6f75b634da0bf352bd51ece3927","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"24\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenblattmarkierung f&uuml;llen","datePublished":"2020-05-22T19:04:30+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/"},"wordCount":4161,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/8e2dd6f75b634da0bf352bd51ece3927","articleSection":["1\/2016","2016","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/","url":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/","name":"Datenblattmarkierung f&uuml;llen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/8e2dd6f75b634da0bf352bd51ece3927","datePublished":"2020-05-22T19:04:30+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/8e2dd6f75b634da0bf352bd51ece3927","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/8e2dd6f75b634da0bf352bd51ece3927"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenblattmarkierung_fuellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenblattmarkierung f&uuml;llen"}]},{"@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\/55001022","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=55001022"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001022\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}