{"id":55001199,"date":"2019-08-01T00:00:00","date_gmt":"2020-05-13T20:55:49","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1199"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Button_vom_Formular_ins_Ribbon","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/","title":{"rendered":"Button vom Formular ins Ribbon"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/7f94bbcd7e2143dd8785fa5c77ffec97\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Formulare sind oft v&ouml;llig &uuml;berfrachtet mit Steuerelementen zur Anzeige und Auswahl von Daten und Schaltfl&auml;chen. Das l&auml;sst sich zumindest teilweise &auml;ndern, indem Sie einige Elemente aus dem Formular in ein Ribbon auslagern, das dann beim Erscheinen des Formulars eingeblendet wird. Bei einfachen Schaltfl&auml;chen ist das noch recht einfach, aber sobald die Steuer-elemente etwa abh&auml;ngig von den angezeigten Daten ein- oder ausgeblendet werden sollen, wird es interessant. In diesem Beitrag schauen wir uns an, wie das gelingt. <\/b><\/p>\n<p>Konkret nehmen wir uns das Beispiel aus dem Beitrag <b>Datenblatt: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern<\/b> (<b>www.access-im-unternehmen.de\/1198<\/b>) vor. Hier finden wir in einem Formular ein Unterformular in der Datenblattansicht vor (siehe Bild 1). Dieses enth&auml;lt vier Schaltfl&auml;chen, mit denen Sie die Reihenfolge der Eintr&auml;ge des Datenblatts &uuml;ber die Werte des Feldes <b>ReihenfolgeID <\/b>manipulieren k&ouml;nnen. Im Falle dieses Beispiels enth&auml;lt das Datenblatt nicht so viele Felder, dass diese nicht auf das Formular passen w&uuml;rde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_001.png\" alt=\"Ausgangsformular\" width=\"549,6265\" height=\"300,1728\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ausgangsformular<\/span><\/b><\/p>\n<p>Wenn dies allerdings der Fall w&auml;re, w&uuml;rde man sich die Schaltfl&auml;chen an einer anderen Position w&uuml;nschen. Am Besten, damit diese gar nicht mehr im Weg sind, direkt im Ribbon. Und genau das ist Thema des vorliegenden Artikels: Wir wollen zeigen, wie Sie die Schaltfl&auml;chen aus einem Formular in das Ribbon &uuml;bertragen und dabei alle vorgegebenen Funktionen beibehalten.<\/p>\n<p>In unserem Fall betrifft das vor allem das Aktivieren und Deaktivieren der Schaltfl&auml;chen in Abh&auml;ngigkeit der angezeigten Daten. Das hei&szlig;t, dass die Schaltfl&auml;chen zum Verschieben der Elemente nach oben nur aktiviert sein sollen, wenn die Elemente auch nach oben verschoben werden k&ouml;nnen. Das gleiche gilt f&uuml;r die Schaltfl&auml;chen zum Verschieben nach unten &#8211; diese sollen nur aktiviert werden, wenn die Elemente auch nach unten verschoben werden k&ouml;nnen. Au&szlig;erdem sollen die Schaltfl&auml;chen nat&uuml;rlich die im Klassenmodul des Formulars gespeicherten Ereignisprozeduren aufrufen.<\/p>\n<p>Eine weitere Anforderung ist, dass das Ribbon nur in Zusammenhang mit der Anzeige dieses Formulars angezeigt werden soll. Um dieses zu &ouml;ffnen, f&uuml;gen wir der Anwendung noch ein Start-Ribbon hinzu, das beim Start angezeigt wird und das &Ouml;ffnen des Formulars <b>frmMehrfachreihenfolgeDatenblatt <\/b>erlaubt. Wir k&ouml;nnten theoretisch auch direkt das Unterformular in der Datenblattansicht &ouml;ffnen, aber das w&uuml;rde bedeuten, dass wir den kompletten Code des Hauptformulars in das Klassenmodul des Unterformulars &uuml;bertragen und anpassen m&uuml;ssten. Diesen Schritt wollen wir erst einmal nicht gehen. Daher maximieren wir einfach das Unterformular innerhalb des Hauptformulars und sorgen daf&uuml;r, dass das Hauptformular mit dem Unterformular beim Anklicken des entsprechenden Ribbon-Eintrags angezeigt wird. Das Ribbon-Tab f&uuml;r das Formular <b>frmMehrfachreihenfolgeDatenblatt<\/b> soll dann rechts neben dem Startribbon erscheinen.<\/p>\n<h2>Start-Ribbon erstellen<\/h2>\n<p>Um das erste Ribbon zu erstellen, f&uuml;gen wir zun&auml;chst eine neue Tabelle namens <b>USysRibbons <\/b>zur Datenbank hinzu. Dieser Tabelle f&uuml;gen Sie die drei folgenden Felder hinzu (siehe Bild 2):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_003.png\" alt=\"Entwurf der Tabelle USysRibbons\" width=\"549,6265\" height=\"433,163\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle USysRibbons<\/span><\/b><\/p>\n<ul>\n<li><b>ID<\/b>: Autowertfeld mit Prim&auml;rschl&uuml;sselindex<\/li>\n<li><b>RibbonName<\/b>: Textfeld\/Kurzer Text<\/li>\n<li><b>RibbonXML<\/b>: Memofeld\/Langer Text<\/li>\n<\/ul>\n<h2>USysRibbons wieder einblenden<\/h2>\n<p>Wenn Sie nicht die Anzeige von Systemobjekten und ausblendeten Objekten deaktiviert haben, verschwindet die Tabelle allerdings direkt nach dem Speichern aus dem Navigationsbereich.<\/p>\n<p>Um diese wieder sichtbar zu machen, klicken Sie mit der rechten Maustaste auf die Titelzeile des Navigationsbereichs und w&auml;hlen aus dem Kontextmen&uuml; den Eintrag <b>Navigationsoptionen&#8230; <\/b>aus.<\/p>\n<p>Im nun erscheinenden Dialog <b>Navigationsoptionen <\/b>aktivieren Sie die beiden Optionen <b>Ausgeblendete Objekte anzeigen <\/b>und <b>System-Objekte anzeigen <\/b>(siehe Bild 3). Danach erscheint die Tabelle <b>USysRibbons <\/b>wieder im Navigationsbereich.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_002.png\" alt=\"Die Navigationsoptionen von Access\" width=\"649,559\" height=\"454,3909\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die Navigationsoptionen von Access<\/span><\/b><\/p>\n<h2>Ribbon-Definition f&uuml;r das Start-Ribbon<\/h2>\n<p>Danach f&uuml;gen wir dem Feld <b>RibbonName<\/b> der Tabelle den Wert <b>Main <\/b>und dem Feld <b>RibbonXML <\/b>den XML-Code aus Listing 1 hinzu.<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"&gt;\r\n   &lt;ribbon&gt;\r\n     &lt;tabs&gt;\r\n       &lt;tab id=\"tabBeispiele\" label=\"Beispiele\"&gt;\r\n         &lt;group id=\"grpFormulare\" label=\"Formulare\"&gt;\r\n           &lt;button imageMso=\"AccessFormDatasheet\" label=\"Mehrfachreihenfolge \r\n             Datenblatt\" id=\"btnMehrfachreihenfolgeDatenblatt\" onAction=\"onAction\" \r\n             size=\"large\"\/&gt;\r\n         &lt;\/group&gt;\r\n       &lt;\/tab&gt;\r\n     &lt;\/tabs&gt;\r\n   &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: XML-Code f&uuml;r das Start-Ribbon<\/span><\/b><\/p>\n<p>Hier definieren wir die ineinander verschachtelten Elemente <b>customUI<\/b>, <b>ribbon<\/b>, <b>tabs<\/b>, <b>tab<\/b>, <b>group <\/b>und schlie&szlig;lich <b>button<\/b>. Das <b>button<\/b>-Element erh&auml;lt schlie&szlig;lich &uuml;ber das Attribut <b>imageMso <\/b>den Namen eines eingebauten Icons, eine Beschriftung, eine ID, den Wert <b>large <\/b>f&uuml;r das Attribut <b>size <\/b>und den Wert <b>onAction <\/b>f&uuml;r das Attribut <b>onAction<\/b>. Das bedeutet, dass wir an irgendeiner Stelle &#8211; in diesem Fall in einem Standardmodul &#8211; eine Prozedur namens <b>onAction<\/b> bereitstellen m&uuml;ssen, die bestimmten syntaktischen Anforderungen gen&uuml;gt. Die Tabelle sieht danach wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_004.png\" alt=\"Ribbon-Definition f&uuml;r das Start-Ribbon\" width=\"649,559\" height=\"340,6777\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ribbon-Definition f&uuml;r das Start-Ribbon<\/span><\/b><\/p>\n<h2>Code f&uuml;r die Schaltfl&auml;che zum &Ouml;ffnen des Formulars<\/h2>\n<p>Die oben genannte Prozedur <b>onAction <\/b>erstellen wir schlie&szlig;lich so:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     DoCmd.OpenForm \"frmMehrfachreihenfolgeDatenblatt\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur &ouml;ffnet also dann das gew&uuml;nschte Formular.<\/p>\n<h2>Ribbonfehler anzeigen<\/h2>\n<p>Damit die Benutzeroberfl&auml;che Fehler beim Verwenden der benutzerdefinierten Ribbons anzeigt, m&uuml;ssen wir noch eine Access-Option aktivieren. Dazu &ouml;ffnen Sie &uuml;ber den Eintrag <b>Datei|Optionen <\/b>zun&auml;chst den Optionen-Dialog von Access. Hier finden Sie im Bereich <b>Client-ein-stel-lun-gen|Allgemein <\/b>die Option <b>Fehler von Be-nut-zer-ober-fl&auml;chen-Add-Ins anzeigen<\/b>. Diese aktivieren Sie und schlie&szlig;en den Dialog mit der Schaltfl&auml;che <b>OK<\/b> (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_005.png\" alt=\"Ribbon-Option zum Anzeigen von Ribbon-Fehlern\" width=\"649,559\" height=\"337,0352\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ribbon-Option zum Anzeigen von Ribbon-Fehlern<\/span><\/b><\/p>\n<h2>Abschlie&szlig;ende Schritte<\/h2>\n<p>Nun m&uuml;ssen wir nur noch drei Schritte erledigen: <\/p>\n<ul>\n<li>Die Anwendung schlie&szlig;en und wieder &ouml;ffnen.<\/li>\n<li>Die Option <b>Name des Men&uuml;bands <\/b>auf die durch das Schlie&szlig;en und &Ouml;ffnen nun verf&uuml;gbaren Eintrag <b>Main <\/b>einstellen (siehe Bild 6).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_006.png\" alt=\"Start-Ribbon f&uuml;r die Anwendung einstellen\" width=\"649,559\" height=\"337,0352\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Start-Ribbon f&uuml;r die Anwendung einstellen<\/span><\/b><\/p>\n<li>Die Anwendung erneut schlie&szlig;en und wieder &ouml;ffnen, um das Ribbon nun anzuzeigen.<\/li>\n<\/ul>\n<p>Nun erscheint das Ribbon wie in Bild 7. Hier klicken Sie auf den Tab namens <b>Beispiele <\/b>und erhalten die Schaltfl&auml;che zum &Ouml;ffnen des Formulars.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_007.png\" alt=\"Das Start-Ribbon \" width=\"649,559\" height=\"160,0237\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Das Start-Ribbon <\/span><\/b><\/p>\n<h2>Schaltfl&auml;chen ins Ribbon<\/h2>\n<p>Um die Funktionen der vier Schaltfl&auml;chen nun &uuml;ber das Ribbon ausf&uuml;hren zu k&ouml;nnen, legen wir zun&auml;chst ein neues Ribbon mit einem eigenen Tab f&uuml;r das Formular <b>frmMehrfachreihenfolgeDatenblatt <\/b>an.<\/p>\n<p>Der XML-Code f&uuml;r dieses Ribbon sieht zun&auml;chst wie in Listing 2 aus und bildet das Grundger&uuml;st, das wir gleich noch ausbauen. Erstmal m&ouml;chten wir &uuml;berhaupt ein Ribbon mit dem Formular einblenden. Diesen XML-Code f&uuml;gen Sie in einem zweiten Datensatz in die Tabelle <b>USysRibbons <\/b>ein, und zwar mit dem Eintrag <b>Reihenfolge <\/b>im Feld <b>RibbonName<\/b>.<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"&gt;\r\n   &lt;ribbon&gt;\r\n     &lt;tabs&gt;\r\n       &lt;tab id=\"tabReihenfolge\" label=\"Reihenfolge\"&gt;\r\n         &lt;group id=\"grpReihenfolgeAendern\" label=\"Reihenfolge &auml;ndern\"&gt;\r\n           &lt;button imageMso=\"ShapeUpArrow\" label=\"Ganz nach oben\" id=\"btnTop\" size=\"large\"\/&gt;\r\n           &lt;button id=\"btnUp\" imageMso=\"ShapeUpArrow\" label=\"Nach oben\" size=\"large\"\/&gt;\r\n           &lt;button id=\"btnDown\" imageMso=\"ShapeDownArrow\" label=\"Nach unten\" size=\"large\"\/&gt;\r\n           &lt;button id=\"btnBottom\" imageMso=\"ShapeDownArrow\" label=\"Ganz nach unten\" size=\"large\"\/&gt;\r\n         &lt;\/group&gt;\r\n       &lt;\/tab&gt;\r\n     &lt;\/tabs&gt;\r\n   &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: XML-Code f&uuml;r das Ribbon zum Formular<\/span><\/b><\/p>\n<p>Damit dies gelingt, stellen wir die Eigenschaft <b>Name des Men&uuml;-bands <\/b>des Hauptformulars auf den Namen des neu erstellten Ribbons ein &#8211; allerdings erst, nachdem wir nach dem Einf&uuml;gen des neuen Eintrags zur Tabelle <b>USysRibbons <\/b>die Anwendung geschlossen und wieder ge&ouml;ffnet haben (siehe Bild 8). Nur dadurch werden neu hinzugef&uuml;gte Ribbon-Namen auch in den Auswahlfeldern der jeweiligen Eigenschaften sichtbar.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_008.png\" alt=\"Men&uuml;band festlegen \" width=\"599,593\" height=\"314,8304\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Men&uuml;band festlegen <\/span><\/b><\/p>\n<h2>Ribbon f&uuml;r das Unterformular<\/h2>\n<p>Wenn wir das Formular nun &uuml;ber den Ribbon-Befehl des Start-Ribbons &ouml;ffnen, erscheint zwar das Formular, aber das <b>Tab<\/b>-Element aus dem zugeordneten Ribbon wird nicht angezeigt (siehe Bild 9). Warum das Ganz einfach: Die Schaltfl&auml;chen sind zu Beginn deaktiviert, damit bleibt das Unterformular das einzige Steuer-element, das den Fokus erhalten kann. Und das Unterformular hat genau wie das Formular eine eigene Eigenschaft namens <b>Name des Men&uuml;bands<\/b>. Wir haben nun zwei M&ouml;glichkeiten:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_009.png\" alt=\"Kein neues Ribbon f&uuml;r das Formular\" width=\"599,593\" height=\"344,1449\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Kein neues Ribbon f&uuml;r das Formular<\/span><\/b><\/p>\n<ul>\n<li>Wir stellen diese Eigenschaft einfach auf das gleiche Ribbon ein wie die f&uuml;r das Hauptformular.<\/li>\n<li>Wir f&uuml;gen eine Ereignisprozedur f&uuml;r das Hauptformular hinzu, dass dem Unterformular das Ribbon des Hauptformulars zuweist.<\/li>\n<\/ul>\n<p>Wir entscheiden uns f&uuml;r die zweite Variante, da wir dann gegebenenfalls nur das Ribbon f&uuml;r das Hauptformular &auml;ndern m&uuml;ssen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!sfm.Form.RibbonName = Me.RibbonName\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit erhalten wir nun beim &Ouml;ffnen des Formulars <b>frmMehrfachreihenfolgeDatenblatt<\/b> zwar das neue Ribbon-Tab, allerdings wird dieses nicht aktiviert (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_010.png\" alt=\"Das Reihenfolge-Ribbon wird nicht aktiviert.\" width=\"649,559\" height=\"124,4988\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Das Reihenfolge-Ribbon wird nicht aktiviert.<\/span><\/b><\/p>\n<p>Dazu gibt es wiederum drei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir aktivieren das Ribbon-Tab per VBA-Code.<\/li>\n<li>Wir definieren das Ribbon-Tab als kontextsensitives Ribbon-Tab.<\/li>\n<li>Wir stellen die Eigenschaft <b>startFromScratch <\/b>des <b>ribbon<\/b>-Elements auf <b>true <\/b>ein. Damit werden alle &uuml;brigen Elemente ausgeblendet.<\/li>\n<\/ul>\n<p>Wir schauen uns alle drei Varianten an.<\/p>\n<h2>Ribbon-Tab per VBA-Code aktivieren<\/h2>\n<p>F&uuml;r diesen Fall ben&ouml;tigen wir zun&auml;chst einen Verweis auf die Bibliothek <b>Microsoft Office 14.0 Object Library<\/b>, wobei wir diesen &uuml;ber den <b>Verweise<\/b>-Dialog hinzuf&uuml;gen.<\/p>\n<p>Diesen &ouml;ffnen Sie &uuml;ber den VBA-Editor mit dem Men&uuml;befehl <b>Extras|Verweise<\/b>. Dort f&uuml;gen Sie dann den genannten Eintrag hinzu (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_011.png\" alt=\"Verweis auf die Office-Bibliothek\" width=\"424,7115\" height=\"334,8159\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Verweis auf die Office-Bibliothek<\/span><\/b><\/p>\n<p>Nun f&uuml;gen wir dem Ribbon-Element <b>customUI <\/b>das Attribut <b>onLoad <\/b>hinzu:<\/p>\n<pre>&lt;customUI     xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" onLoad=\"onLoad_Reihenfolge\"&gt;<\/pre>\n<p>Die hier angegebene Ereignisprozedur <b>onLoad_Reihenfolge <\/b>hinterlegen wir wieder im Modul <b>mdlRibbons<\/b>. Die Prozedur weist lediglich der Variablen <b>objRibbon_Reihenfolge <\/b>einen Verweis auf das per Parameter mitgelieferte Objekt <b>IRibbonUI <\/b>zu:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onLoad_Reihenfolge(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon_Reihenfolge = ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Diese Variable m&uuml;ssen wir nun noch deklarieren, was wir im gleichen Modul erledigen:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>objRibbon_Reihenfolge<span style=\"color:blue;\"> As <\/span>IRibbonUI<\/pre>\n<p>Nun bietet dieses Objekt verschiedene Methoden an, darunter auch die <b>ActivateTab<\/b>-Methode, die den Namen des zu aktivierenden <b>Tab<\/b>-Elements entgegennimmt. Wann und wie aber wollen wir diese Methode aufrufen Eigentlich sollte dies gleich beim &Ouml;ffnen des Formulars geschehen, also etwa in der Ereignisprozedur f&uuml;r eine der Ereigniseigenschaften <b>Beim &Ouml;ffnen <\/b>oder <b>Beim Laden<\/b>.<\/p>\n<p>Wenn wir aber etwa f&uuml;r die Ereignisprozedur <b>Form_Load <\/b>die folgende Anweisung anlegen, gelingt das nicht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     objRibbon_Reihenfolge.ActivateTab \"tabReihenfolge\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir erhalten dann n&auml;mlich die Fehlermeldung aus Bild 12, der dadurch ausgel&ouml;st wird, dass die Objektvariable noch nicht mit dem Verweis auf das <b>customUI<\/b>-Objekte gef&uuml;llt wurde. Das versuchen wir zu umgehen, indem wir das Aktivieren des <b>Tab<\/b>-Elements ein wenig verz&ouml;gern. Dazu stellen wir die Eigenschaft <b>Zeitgeberintervall <\/b>des Hauptformulars auf den Wert <b>500 <\/b>ein (f&uuml;r 500 Millisekunden) und f&uuml;r die Ereigniseigenschaft <b>Bei Zeitgeber <\/b>hinterlegen wir die folgende Ereignisprozedur:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_012.png\" alt=\"Fehler beim Versuch, die ActiveTab-Methode zu nutzen\" width=\"424,7115\" height=\"241,078\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Fehler beim Versuch, die ActiveTab-Methode zu nutzen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     objRibbon_Reihenfolge.ActivateTab \"tabReihenfolge\"\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Allerdings erhalten wir hier den gleichen Fehler. Woran liegt das Wir k&ouml;nnten annehmen, dass die Prozedur <b>onLoad_Reihenfolge<\/b> erst ausgef&uuml;hrt wird, wenn das Ribbon-Tab aus dieser Ribbon-Definition angezeigt wird. Allerdings scheint auch dies nicht der Fall zu sein. Wir k&ouml;nnen ja zwischendurch immer pr&uuml;fen, ob <b>objRibbon_Reihenfolge <\/b>einen Wert hat &#8211; und zwar mit der folgenden VBA-Anweisung, abgesetzt im Direktbereich des VBA-Editors:<\/p>\n<pre>  objRibbon_Reihenfolge Is Nothing<\/pre>\n<p>Dies liefert aber aktuell immer den Wert <b>True<\/b>, <b>objRibbon_Reihenfolge <\/b>ist also leer. Die L&ouml;sung f&uuml;r dieses Problem war: Wir haben das Formular mehrfach aufgerufen und bereits zuvor daf&uuml;r gesorgt, dass <b>On_Load <\/b>aufgerufen wurde. Damit war <b>objRibbon_Reihenfolge <\/b>gef&uuml;llt. Allerdings haben wir anschlie&szlig;end vermutlich durch einen Laufzeitfehler daf&uuml;r gesorgt, dass die Variable wieder geleert wurde. Da <b>On_Load <\/b>aber bereits ausgef&uuml;hrt war, wurde sie nicht erneut gef&uuml;llt &#8230; Es gilt also zu beachten: Entweder Sie verhindern Laufzeitfehler durch entsprechend stabile Programmierung mit Fehlerbehandlungen, oder Sie m&uuml;ssen zwischendurch die Anwendung einmal neu laden, damit alle Ribbons et cetera wieder korrekt geladen werden k&ouml;nnen.<\/p>\n<p>Nach einem Neustart der Anwendung erhalten wir jedoch das gew&uuml;nschte Ribbon (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_013.png\" alt=\"Das Formular mit den gew&uuml;nschten Ribbon-Schaltfl&auml;chen\" width=\"599,593\" height=\"385,7354\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Das Formular mit den gew&uuml;nschten Ribbon-Schaltfl&auml;chen<\/span><\/b><\/p>\n<p>Noch eine Optimierung ist es, die Eigenschaft <b>Zeitgeberintervall <\/b>gar nicht erst &uuml;ber das Eigenschaftenblatt festzulegen, sondern den Wert per VBA in der Ereignisprozedur <b>Beim Laden<\/b> f&uuml;r die Eigenschaft <b>TimerInterval <\/b>festzulegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     ...\r\n     Me.TimerInterval = 500\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Anderenfalls kann es w&auml;hrend der Entwicklung passieren, dass <b>TimerInterval <\/b>per Code auf <b>0 <\/b>eingestellt wird und andere &Auml;nderungen das Speichern des Formulars erfordern. Dann speichert Access auch den neuen Wert f&uuml;r <b>TimerInterval<\/b>, was dazu f&uuml;hrt, dass das <b>Bei Zeitgeber<\/b>-Ereignis beim n&auml;chsten &Ouml;ffnen des Formulars nicht mehr aufgerufen wird.<\/p>\n<h2>Ribbon-Tab als kontextabh&auml;ngiges Tab<\/h2>\n<p>Dieser Ansatz ist also eher umst&auml;ndlich. Also schauen wir uns die zweite Idee an. Dazu kopieren wir das Haupt- und das Unterformular und h&auml;ngen jeweils das Suffix <b>Context <\/b>hinten an den Objektnamen an. Die Eigenschaft <b>Herkunftsobjekt <\/b>des Formulars <b>frmMehrfachreihenfolgeDatenblattContext <\/b>stellen wir dann entsprechend auf <b>sfmMehrfachreihenfolgeDatenblattContext <\/b>ein.<\/p>\n<p>Dann legen wir einen weiteren Datensatz in der Tabelle <b>USysRibbons <\/b>an, diesmal mit dem Wert <b>ReihenfolgeKontext <\/b>im Feld <b>RibbonName <\/b>und mit dem Code aus Listing 3 im Feld <b>RibbonXML<\/b>. Neu ist in dieser Version, dass wir unterhalb des Ribbon-Elements nicht das <b>tabs<\/b>-, sondern das <b>contextualTabs<\/b>-Element einf&uuml;gen. Dieses nimmt dann ein <b>tabSet<\/b>-Element auf mit dem Wert <b>TabSetFormReportExtensibility <\/b>f&uuml;r das Attribut <b>idMso<\/b>. Das ist wichtig, sonst funktioniert der kontextuelle Tab nicht.<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"&gt;\r\n   &lt;ribbon&gt;\r\n     &lt;contextualTabs&gt;\r\n       &lt;tab<span style=\"color:blue;\">Set<\/span> idMso=\"TabSetFormReportExtensibility\"&gt;\r\n         &lt;tab id=\"tabReihenfolge\" label=\"Reihenfolge\"&gt;\r\n           &lt;group id=\"grpReihenfolgeAendern\" label=\"Reihenfolge &auml;ndern\"&gt;\r\n             &lt;button id=\"btnTop\" imageMso=\"ShapeUpArrow\" label=\"Ganz nach oben\" size=\"large\"\/&gt;\r\n             &lt;button size=\"large\" id=\"btnUp\" imageMso=\"ShapeUpArrow\" label=\"Nach oben\"\/&gt;\r\n             &lt;button id=\"btnDown\" imageMso=\"ShapeDownArrow\" label=\"Nach unten\" size=\"large\"\/&gt;\r\n             &lt;button id=\"btnBottom\" imageMso=\"ShapeDownArrow\" label=\"Ganz nach unten\" size=\"large\"\/&gt;\r\n           &lt;\/group&gt;\r\n         &lt;\/tab&gt;\r\n       &lt;\/tabSet&gt;\r\n     &lt;\/contextualTabs&gt;\r\n   &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: XML-Code f&uuml;r das Ribbon zum Formular mit contextualTabs<\/span><\/b><\/p>\n<p>Darunter finden wir dann wieder ein herk&ouml;mmliches <b>tab<\/b>-Element, dass die gleichen Steuer-elemente enth&auml;lt wie das aus dem vorherigen Beispiel. Nachdem Sie diesen Datensatz zur Tabelle <b>USysRibbons <\/b>hinzugef&uuml;gt haben, k&ouml;nnen Sie die Anwendung schlie&szlig;en und neu starten und danach den Namen des neuen Ribbons in der Eigenschaft <b>Name des Men&uuml;bands <\/b>eintragen. F&uuml;r das neue Formular f&uuml;gen wir ein neues Element zum Start-Ribbon hinzu:<\/p>\n<pre>&lt;button id=\"btnContext\" imageMso=\"AccessFormDatasheet\" label=\"Mehrfachreihenfolge Datenblatt Context\" onAction=\"onAction\" size=\"large\"\/&gt;<\/pre>\n<p>Da wir nun zwei Schaltfl&auml;chen haben, welche die Prozedur <b>onAction <\/b>aufrufen, m&uuml;ssen wir dort eine Unterscheidung nach dem Namen der ausl&ouml;senden Schaltfl&auml;che vornehmen:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     Select Case control.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnMehrfachreihenfolgeDatenblatt\"\r\n             DoCmd.OpenForm _\r\n                 \"frmMehrfachreihenfolgeDatenblatt\"\r\n         <span style=\"color:blue;\">Case <\/span>\"btnContext\"\r\n             DoCmd.OpenForm _\r\n                 \"frmMehrfachreihenfolgeDatenblattContext\"\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> control.Id\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir das Formular nun &ouml;ffnen, erscheint direkt auch das kontextuelle <b>tab<\/b>-Element namens <b>Reihenfolge <\/b>(siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_014.png\" alt=\"Das kontextuelle tab-Element wird automatisch mit dem Formular aktiviert.\" width=\"599,593\" height=\"481,2393\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Das kontextuelle tab-Element wird automatisch mit dem Formular aktiviert.<\/span><\/b><\/p>\n<p>Allerdings haben wir die Feststellung gemacht, dass nach dem Schlie&szlig;en und erneutem &Ouml;ffnen des Formulars &uuml;ber das Start-Ribbon nicht mehr automatisch das Formular-Tab aktiviert wird. Also ist m&ouml;glicherweise doch die erste Variante die sicherere &#8211; auch wenn sie etwa mehr Aufwand erfordert. F&uuml;r die folgenden Schritte arbeiten wir daher mit dem Formular <b>frmMehrfachreihenfolgeDatenblatt <\/b>und dem entsprechenden Unterformular weiter.<\/p>\n<h2>Tab mit startFromScratch exklusiv anzeigen<\/h2>\n<p>Die dritte M&ouml;glichkeit, die am zuverl&auml;ssigsten arbeiten d&uuml;rfte, ist das Einstellen des Attributs <b>startFromScratch <\/b>des <b>ribbon<\/b>-Elements auf den Wert <b>true<\/b>. Damit zeigt Access dann nur noch die in der aktuellen Ribbon-Definition festgelegten Elemente an &#8211; mit Ausnahme einiger eingebauter Elemente im <b>Datei<\/b>-Bereich. Der Nachteil hier: Sie k&ouml;nnen dann auch nur auf Elemente des Ribbons zugreifen, die mit dem aktuellen Formular eingeblendet werden.<\/p>\n<h2>Unterformular vergr&ouml;&szlig;ern<\/h2>\n<p>Nun k&uuml;mmern wir uns um das Unterformular-Steuerelement, das wir auf die Gr&ouml;&szlig;e des Hauptformulars vergr&ouml;&szlig;ern &#8211; wir lassen lediglich einen kleinen Streifen f&uuml;r die Schaltfl&auml;chen, die wir zur Kontrolle noch im Formular lassen. Au&szlig;erdem stellen wir die Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>jeweils auf den Wert <b>Beide <\/b>ein.<\/p>\n<p>Damit f&uuml;llt das Datenblatt beim Maximieren ann&auml;hernd den kompletten Platz im Access-Fenster aus.<\/p>\n<h2>Schaltfl&auml;chen mit Funktion versehen<\/h2>\n<p>Als Erstes wollen wir nun die bisher &uuml;ber die Schaltfl&auml;chen des Formulars gesteuerten Ereignisprozeduren &uuml;ber die Schaltfl&auml;chen des Ribbons ausl&ouml;sen. M&uuml;ssen wir dazu die Inhalte der Ereignisprozeduren in die Prozedur <b>onAction <\/b>&uuml;bertragen oder diese gegebenenfalls in Prozeduren ausgliedern, die dann von <b>onAction <\/b>aus aufgerufen werden<\/p>\n<p>Nein, das ist nicht n&ouml;tig, aber ein paar &Auml;nderungen m&uuml;ssen wir schon vornehmen. Die erste ist, dass wir die Ereignisprozedur in eine &ouml;ffentliche Funktion umwandeln, die dann so aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>cmdTop_Click()\r\n     ...\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Da Sie den Typ der Prozedur nun ge&auml;ndert haben, kann Access beim &Ouml;ffnen des Formulars allerdings nicht mehr die urspr&uuml;ngliche <b>Sub<\/b>-Prozedur finden. Jedoch ist in der Ereigniseigenschaft <b>Beim Klicken <\/b>der Schaltfl&auml;che <b>cmdTop <\/b>noch immer der Wert <b>[Ereignisprozedur] <\/b>eingetragen. Diesen Wert m&uuml;ssen Sie dort entfernen, damit das Formular einwandfrei funktioniert (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_015.png\" alt=\"Diese Eigenschaft muss geleert werden.\" width=\"499,6607\" height=\"299,7964\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Diese Eigenschaft muss geleert werden.<\/span><\/b><\/p>\n<p>Und sp&auml;ter haben wir dann festgestellt, dass es auch mit Namen von Prozeduren, die eigentlich f&uuml;r die Ereignisprozeduren vorgesehen sind, Probleme geben kann. Also benennen wir die <b>Function<\/b>-Prozedur gleich in <b>btnTop_Click <\/b>um. <b>btn <\/b>ist das Pr&auml;fix f&uuml;r die <b>button<\/b>-Elemente im Ribbon, <b>cmd <\/b>das f&uuml;r die <b>CommandButton<\/b>-Steuerelemente unter Access:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>btnTop_Click()\r\n     ...\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die von <b>Sub<\/b> in <b>Function <\/b>ge&auml;nderte Prozedur k&ouml;nnen wir dann &uuml;ber das Attribut <b>onAction <\/b>des jeweiligen <b>button<\/b>-Elements der Ribbon-Definition angeben. Allerdings d&uuml;rfen wir in diesem Fall nicht einfach nur den Funktionsnamen angeben, sondern m&uuml;ssen noch ein Gleichheitszeichen voranstellen und ein Klammernpaar hinten anf&uuml;gen, also <b>=btnTop_Click()<\/b>:<\/p>\n<pre>&lt;button imageMso=\"ShapeUpArrow\" label=\"Ganz nach oben\" id=\"btnTop\" onAction=\"=btnTop_Click()\" size=\"large\"\/&gt;<\/pre>\n<h2>Fehler beim Aufruf<\/h2>\n<p>Nach dem Markieren eines Datensatzes im Formular <b>frmMehrfachreihenfolgeDatenblatt<\/b> und dem Anklicken der Ribbon-Schaltfl&auml;che <b>btnTop <\/b>erhalten wir allerdings die Fehlermeldung aus Bild 16. Da der Fehler durch eine per Ribbon-Schaltfl&auml;che aufgerufene Prozedur ausgel&ouml;st wurde, greift die herk&ouml;mmliche Fehlerbehandlung nicht. Also m&uuml;ssen wir uns per Debugging zur fehlerhaften Zeile durchhangeln.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_016.png\" alt=\"Fehlermeldung beim Aufruf per Ribbon\" width=\"499,6607\" height=\"272,2032\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Fehlermeldung beim Aufruf per Ribbon<\/span><\/b><\/p>\n<p>Ohne ins Detail gehen zu wollen: Der Fehler wurde ausgel&ouml;st, weil die Ereignisprozedur <b>Beim Verlassen <\/b>des Unterformular-Steuerelements nicht aufgerufen und dadurch ein Array nicht gef&uuml;llt wurde.<\/p>\n<p>Die wichtige Information hieraus ist: Wenn ein Unterformular den Fokus hat und Sie bet&auml;tigen ein anderes Steuer-element im Hauptformular, verliert das Unterformular den Fokus und das Ereignis <b>Beim Verlassen <\/b>wird ausgel&ouml;st. Wenn Sie hingegen bei aktiviertem Unterformular einen Ribbon-Befehl bet&auml;tigen, beh&auml;lt das Unterformular den Fokus. Das ist insofern wichtig, weil <b>Beim Verlassen <\/b>in diesem Fall nicht ausgel&ouml;st wird. Wenn wie hier Daten f&uuml;r die gew&uuml;nschte Aktion in dieser Ereignisprozedur vorbereitet werden, m&uuml;ssen Sie einen anderen Weg dazu finden. In diesem Fall k&ouml;nnen wir den Aufruf der Ereignisprozedur <b>sfm_Exit <\/b>allerdings einfach vorn in die durch den Ribbon-Befehl aufgerufene Funktion eintragen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>btnTop_Click()\r\n     sfm_Exit <span style=\"color:blue;\">False<\/span>\r\n     ...\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Vorher haben wir dazu das Ereignis <b>Beim Verlassen <\/b>des Unterformular-Steuerelements genutzt, weil wir nur zu diesem Zeitpunkt noch auf die Markierung der Datens&auml;tze im Unterformular zugreifen konnten. Wenn die Schaltfl&auml;che <b>cmdTop <\/b>erst den Fokus hatte, waren die Datens&auml;tze im Unterformular bereits nicht mehr markiert.<\/p>\n<p>Damit k&ouml;nnen wir nun auch den ersten Eintrag im Datenblatt markieren und diesen mit einem Klick auf die Ribbon-Schaltfl&auml;che <b>btnTop <\/b>an die erste Position verschieben.<\/p>\n<h2>Weitere Schaltfl&auml;chen<\/h2>\n<p>Auf die gleiche Weise gestalten wir nun die &uuml;brigen Ereignisprozeduren <b>cmdUp_Click<\/b>, <b>cmdDown_Click <\/b>und <b>cmdBottom_Click <\/b>um:<\/p>\n<ul>\n<li>Umwandeln von <b>Sub <\/b>in <b>Function<\/b><\/li>\n<li>Ersetzen des Pr&auml;fix <b>cmd <\/b>durch <b>btn<\/b><\/li>\n<li>Hinzuf&uuml;gen des Aufrufs von <b>sfm_Exit <\/b>mit dem Parameter <b>False<\/b><\/li>\n<\/ul>\n<p>Damit haben wie die Funktionen der Schaltfl&auml;chen des Formulars bereits auf die im Ribbon &uuml;bertragen. Jetzt kommt der spannende Teil &#8211; das Aktivieren und Deaktivieren der Schaltfl&auml;chen in Abh&auml;ngigkeit der markierten Eintr&auml;ge.<\/p>\n<h2>Ribbon-Schaltfl&auml;chen aktivieren und deaktivieren<\/h2>\n<p>Wie wir wissen, gibt es keine direkt zugreifbaren Eigenschaften f&uuml;r Ribbons &#8211; genau, wie es keine Ereignisse gibt. Allerdings gibt es die Callback-Attribute. Das sind die Attribute, deren Name mit <b>get&#8230; <\/b>beginnt. Darunter befindet sich auch eines namens <b>getEnabled<\/b>. Dieses wollen wir nun nutzen, um die Schaltfl&auml;chen in Abh&auml;ngigkeit der markierten Datens&auml;tze im Unterformular zu aktivieren oder zu deaktivieren.<\/p>\n<p>Dazu ben&ouml;tigen wir in jedem Fall die Objektvariable, die wir weiter oben unter <b>Ribbon-Tab per VBA-Code aktivieren <\/b>deklariert und gef&uuml;llt haben:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>objRibbon_Reihenfolge<span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n<span style=\"color:blue;\">Sub <\/span>onLoad_Reihenfolge(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon_Reihenfolge = ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dann f&uuml;gen wir jeweils das Attribut <b>getEnabled <\/b>mit dem Wert <b>getEnabled <\/b>zu den vier <b>button<\/b>-Elementen hinzu:<\/p>\n<pre>&lt;button imageMso=\"ShapeUpArrow\" label=\"Ganz nach oben\" id=\"btnTop\" onAction=\"=btnTop_Click()\" size=\"large\" getEnabled=\"getEnabled\"\/&gt;\r\n&lt;button id=\"btnUp\" imageMso=\"ShapeUpArrow\" label=\"Nach oben\" onAction=\"=btnUp_Click()\" size=\"large\" getEnabled=\"getEnabled\"\/&gt;\r\n&lt;button id=\"btnDown\" imageMso=\"ShapeDownArrow\" label=\"Nach unten\" onAction=\"=btnDown_Click()\" size=\"large\" getEnabled=\"getEnabled\"\/&gt;\r\n&lt;button id=\"btnBottom\" imageMso=\"ShapeDownArrow\" label=\"Ganz nach unten\" onAction=\"=btnBottom_Click()\" size=\"large\" getEnabled=\"getEnabled\"\/&gt;<\/pre>\n<p>Beim ersten Ausprobieren des ge&auml;nderten Ribbons nach Schlie&szlig;en und &Ouml;ffnen der Anwendung erhalten wir vier Mal die Fehlermeldung aus Bild 17. Wir m&uuml;ssen also erst zumindest eine leere Prozedur dieses Namens anlegen. Diese sieht wie folgt aus und landet im Modul <b>mdlRibbons<\/b>:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_018.png\" alt=\"Die Prozedur getEnabled fehlt noch.\" width=\"649,559\" height=\"125,1538\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Die Prozedur getEnabled fehlt noch.<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getEnabled(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, ByRef enabled)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir die Anwendung nun schlie&szlig;en und erneut laden und dann das Formular <b>frmMehrfachreihenfolgeDatenblatt <\/b>&ouml;ffnen, erscheint das Ribbon wie in Bild 18.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_017.png\" alt=\"Die button-Elemente sind deaktiviert.\" width=\"499,6607\" height=\"398,8888\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Die button-Elemente sind deaktiviert.<\/span><\/b><\/p>\n<p>Die vier <b>button<\/b>-Elemente sind deaktiviert, was logisch ist: Wir haben f&uuml;r alle das Attribut <b>getEnabled <\/b>auf die Callback-Funktion <b>getEnabled <\/b>eingestellt und diese gibt den Standardwert <b>False <\/b>f&uuml;r den zweiten Parameter <b>enabled <\/b>zur&uuml;ck. Nun m&uuml;ssen wir diese Prozedur noch so ausstatten, dass sie je nach den markierten Datens&auml;tzen entsprechende Werte f&uuml;r <b>enabled <\/b>zur&uuml;ckliefert. Leider ist es nicht m&ouml;glich, diese Callback-Prozedur direkt im Klassenmodul des Formulars unterzubringen. Sie muss in einem Standardmodul verf&uuml;gbar sein.<\/p>\n<p>Hier m&uuml;ssten wir die Prozedur <b>ActivateControls<\/b>, die bisher das Aktivieren und Deaktivieren der Steuer-elemente im Formular &uuml;bernommen hat, in die Prozedur <b>getEnabled <\/b>&uuml;bertragen und umprogrammieren.<\/p>\n<p>Da diese jedoch viele Referenzen zum Unterformular hat, &auml;ndern wir den Plan: Wir speichern die Zust&auml;nde der Schaltfl&auml;chen einfach in <b>Boolean<\/b>-Variablen und stellen in <b>getEnabled <\/b>den <b>enabled<\/b>-Parameter je nach Fall auf den entsprechenden <b>Boolean<\/b>-Wert ein. Die <b>Boolean<\/b>-Variablen deklarieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>bolBtnTopEnabled<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Public <\/span>bolBtnUpEnabled<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Public <\/span>bolBtnDownEnabled<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Public <\/span>bolBtnBottomEnabled<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>In der Prozedur <b>getEnabled <\/b>unterscheiden wir dann wieder in einer <b>Select Case<\/b>-Bedingung nach dem Namen des ausl&ouml;senden Steuerelements des Ribbons.<\/p>\n<p>Je nach Element weisen wir dann den Wert der entsprechenden <b>Boolean<\/b>-Variablen zu:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getEnabled(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, ByRef enabled)\r\n     Select Case control.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnTop\"\r\n             enabled = bolBtnTopEnabled\r\n         <span style=\"color:blue;\">Case <\/span>\"btnUp\"\r\n             enabled = bolBtnUpEnabled\r\n         <span style=\"color:blue;\">Case <\/span>\"btnDown\"\r\n             enabled = bolBtnDownEnabled\r\n         <span style=\"color:blue;\">Case <\/span>\"btnBottom\"\r\n             enabled = bolBtnBottomEnabled\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schlie&szlig;lich kommen wir zur Anpassung der Prozedur ActivateControls, die von verschiedenen Stellen bei der Aktualisierung der Markierung der Datens&auml;tze aufgerufen wird:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ActivateControls()\r\n     <span style=\"color:blue;\">Dim <\/span>bolErster<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolLetzter<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAnzahl<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Hier ersetzen wir zun&auml;chst die Zuweisung, die zuvor direkt an die <b>Enabled<\/b>-Eigenschaft der Formularschaltfl&auml;chen ging, durch das Einstellen der vier <b>Boolean<\/b>-Variablen auf den Wert <b>True<\/b>. Alle Schaltfl&auml;chen sollen also standardm&auml;&szlig;ig aktiviert sein:<\/p>\n<pre>     bolBtnBottomEnabled = <span style=\"color:blue;\">True<\/span>\r\n     bolBtnDownEnabled = <span style=\"color:blue;\">True<\/span>\r\n     bolBtnTopEnabled = <span style=\"color:blue;\">True<\/span>\r\n     bolBtnUpEnabled = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Danach ermitteln wir verschiedene <b>Boolean<\/b>-Werte (Details hierzu finden Sie im Beitrag <b>Datenblatt: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern <\/b>(<b>www.access-im-unternehmen.de\/1198<\/b>):<\/p>\n<pre>     lngAnzahl = m_SubForm.Recordset.RecordCount\r\n     <span style=\"color:blue;\">If <\/span>m_SubForm.SelTop = 1<span style=\"color:blue;\"> Then<\/span>\r\n         bolErster = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>m_SubForm.AllowAdditions = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         If m_SubForm.SelTop + m_SubForm.SelHeight - 1 _\r\n                 &gt;= lngAnzahl Then\r\n             bolLetzter = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         If m_SubForm.SelTop + m_SubForm.SelHeight - 1 _\r\n                 = lngAnzahl Then\r\n             bolLetzter = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Von den Einstellungen abh&auml;ngig rufen wir dort wie gehabt die Prozeduren <b>DisableUp <\/b>und <b>DisableDown <\/b>auf (siehe weiter unten):<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span>m_SubForm.SelHeight = 0<span style=\"color:blue;\"> Then<\/span>\r\n         DisableUp\r\n         DisableDown\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolErster<span style=\"color:blue;\"> Then<\/span>\r\n             DisableUp\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolLetzter<span style=\"color:blue;\"> Then<\/span>\r\n             DisableDown\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Schlie&szlig;lich folgt ein wichtiger Schritt. Wir rufen n&auml;mlich die Methode <b>Invalidate <\/b>des <b>IRibbonUI<\/b>-Elements <b>objRibbon_Reihenfolge <\/b>auf:<\/p>\n<pre>     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     objRibbon_Reihenfolge.Invalidate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Aber warum deaktivieren wir vorher mit <b>On Error Resume Next <\/b>die Fehlerbehandlung Weil <b>objRibbon_Reihenfolge <\/b>beim ersten Aufruf von <b>ActivateControls <\/b>schlicht noch nicht gef&uuml;llt ist. Und da die vier Ribbon-Schaltfl&auml;chen standardm&auml;&szlig;ig ja ohnehin deaktiviert sein sollen, ist das in diesem Zusammenhang kein Problem. Auf diese Weise l&ouml;sen wir beim ersten Durchlauf keinen Fehler aus.<\/p>\n<p>Die beiden Prozeduren <b>DisableUp <\/b>und <b>DisableDown <\/b>stellen dann ebenfalls nicht mehr die <b>Enabled<\/b>-Eigenschaften der vier Schaltfl&auml;chen ein, sondern legen den Wert der vier <b>Boolean<\/b>-Variablen je nach markierten Datens&auml;tzen fest:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DisableUp()\r\n     bolBtnUpEnabled = <span style=\"color:blue;\">False<\/span>\r\n     bolBtnTopEnabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>DisableDown()\r\n     bolBtnDownEnabled = <span style=\"color:blue;\">False<\/span>\r\n     bolBtnBottomEnabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis sieht dann etwa wie in Bild 19 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1199_019.png\" alt=\"Ist der oberste Eintrag markiert, werden die ersten beiden Ribbon-Button deaktiviert.\" width=\"499,6607\" height=\"393,5236\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Ist der oberste Eintrag markiert, werden die ersten beiden Ribbon-Button deaktiviert.<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Das Verschieben der Schaltfl&auml;chen aus einem Formular in das Ribbon kann recht aufwendig werden.<\/p>\n<p>In diesem Beitrag haben wir gezeigt, wie das f&uuml;r Schaltfl&auml;chen gelingt, die abh&auml;ngig von anderen Parametern aktiviert oder deaktiviert werden m&uuml;ssen und dabei einige Hindernisse aus dem Weg ger&auml;umt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ButtonVomFormularInsRibbon.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/37D0554C-695C-4427-8C36-369CDD15F930\/aiu_1199.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Formulare sind oft v&ouml;llig &uuml;berfrachtet mit Steuerelementen zur Anzeige und Auswahl von Daten und Schaltfl&auml;chen. Das l&auml;sst sich zumindest teilweise &auml;ndern, indem Sie einige Elemente aus dem Formular in ein Ribbon auslagern, das dann beim Erscheinen des Formulars eingeblendet wird. Bei einfachen Schaltfl&auml;chen ist das noch recht einfach, aber sobald die Steuer-elemente etwa abh&auml;ngig von den angezeigten Daten ein- oder ausgeblendet werden sollen, wird es interessant. In diesem Beitrag schauen wir uns an, wie das gelingt. <\/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":[662019,66042019,44000023],"tags":[],"class_list":["post-55001199","post","type-post","status-publish","format-standard","hentry","category-662019","category-66042019","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Button vom Formular ins Ribbon - 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\/Button_vom_Formular_ins_Ribbon\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Button vom Formular ins Ribbon\" \/>\n<meta property=\"og:description\" content=\"Formulare sind oft v&ouml;llig &uuml;berfrachtet mit Steuerelementen zur Anzeige und Auswahl von Daten und Schaltfl&auml;chen. Das l&auml;sst sich zumindest teilweise &auml;ndern, indem Sie einige Elemente aus dem Formular in ein Ribbon auslagern, das dann beim Erscheinen des Formulars eingeblendet wird. Bei einfachen Schaltfl&auml;chen ist das noch recht einfach, aber sobald die Steuer-elemente etwa abh&auml;ngig von den angezeigten Daten ein- oder ausgeblendet werden sollen, wird es interessant. In diesem Beitrag schauen wir uns an, wie das gelingt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T20:55:49+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/7f94bbcd7e2143dd8785fa5c77ffec97\" \/>\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=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Button vom Formular ins Ribbon\",\"datePublished\":\"2020-05-13T20:55:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/\"},\"wordCount\":3856,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/7f94bbcd7e2143dd8785fa5c77ffec97\",\"articleSection\":[\"2019\",\"4\\\/2019\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/\",\"name\":\"Button vom Formular ins Ribbon - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/7f94bbcd7e2143dd8785fa5c77ffec97\",\"datePublished\":\"2020-05-13T20:55:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/7f94bbcd7e2143dd8785fa5c77ffec97\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/7f94bbcd7e2143dd8785fa5c77ffec97\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Button_vom_Formular_ins_Ribbon\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Button vom Formular ins Ribbon\"}]},{\"@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":"Button vom Formular ins Ribbon - 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\/Button_vom_Formular_ins_Ribbon\/","og_locale":"de_DE","og_type":"article","og_title":"Button vom Formular ins Ribbon","og_description":"Formulare sind oft v&ouml;llig &uuml;berfrachtet mit Steuerelementen zur Anzeige und Auswahl von Daten und Schaltfl&auml;chen. Das l&auml;sst sich zumindest teilweise &auml;ndern, indem Sie einige Elemente aus dem Formular in ein Ribbon auslagern, das dann beim Erscheinen des Formulars eingeblendet wird. Bei einfachen Schaltfl&auml;chen ist das noch recht einfach, aber sobald die Steuer-elemente etwa abh&auml;ngig von den angezeigten Daten ein- oder ausgeblendet werden sollen, wird es interessant. In diesem Beitrag schauen wir uns an, wie das gelingt.","og_url":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T20:55:49+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/7f94bbcd7e2143dd8785fa5c77ffec97","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Button vom Formular ins Ribbon","datePublished":"2020-05-13T20:55:49+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/"},"wordCount":3856,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/7f94bbcd7e2143dd8785fa5c77ffec97","articleSection":["2019","4\/2019","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/","url":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/","name":"Button vom Formular ins Ribbon - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/7f94bbcd7e2143dd8785fa5c77ffec97","datePublished":"2020-05-13T20:55:49+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/7f94bbcd7e2143dd8785fa5c77ffec97","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/7f94bbcd7e2143dd8785fa5c77ffec97"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Button_vom_Formular_ins_Ribbon\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Button vom Formular ins Ribbon"}]},{"@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\/55001199","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=55001199"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001199\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}