{"id":55000542,"date":"2021-10-01T00:00:00","date_gmt":"2021-10-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/542"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ribbon_anpassen_Teil_1","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html","title":{"rendered":"Ribbon anpassen, Teil 1"},"content":{"rendered":"<p class='introduction'>Das Ribbon, in der deutschen Version von Office auch Men&uuml;band genannt, ist die Men&uuml;leiste f&uuml;r Office-Anwendungen und somit auch f&uuml;r Access. Sie k&ouml;nnen die Befehle im Ribbon jedoch nicht nur w&auml;hrend der Entwicklung von Access-Anwendungen nutzen, sondern dieses f&uuml;r eigene Anwendungen so anpassen, dass der Benutzer die Funktionen dieser Anwendung dar&uuml;ber aufrufen kann. Dabei k&ouml;nnen Sie die eingebauten Elemente sogar weitgehend ausblenden, sodass man Ihrer Anwendung nur noch an wenigen Stellen ansieht, dass es sich &uuml;berhaupt um eine Access-Anwendung handelt. Diese Artikelreihe liefert alle Informationen, die Sie f&uuml;r die Arbeit mit dem Ribbon und f&uuml;r seine Anpassung und Programmierung ben&ouml;tigen. Dabei lernen Sie auch alle Steuerelemente und ihre Eigenschaften kennen.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>2105_RibbonAnpassen.accdb<\/b>.<\/p>\n<h2>Ribbon im Kontext der Access-Benutzeroberfl&auml;che<\/h2>\n<p>Das Ribbon ist nur ein Element der Benutzeroberfl&auml;che, die wir in diesem Artikel beschreiben. Die weiteren Elemente sind:<\/p>\n<ul>\n<li>der Backstage-Bereich (das ist der Bereich, der erscheint, wenn Sie in Access ab Version 2010 auf den Ribbonreiter <b>Datei <\/b>klicken)<\/li>\n<li>die Schnellzugriffsleiste (Quick Access Toolbar, QAT), welche immer sichtbare Schaltfl&auml;che anzeigt und in der Regel &uuml;ber dem eigentlichen Ribbon positioniert ist<\/li>\n<li>die Kontextmen&uuml;s (<b>contextMenus<\/b>), die zum Ausf&uuml;hren von Befehlen dienen, die per Klick mit der rechten Maustaste erscheinen und<\/li>\n<li>die Commands. Das sind nicht sichtbare Elemente, mit denen Sie die Funktion vorhandener, eingebauter Elemente durch benutzerdefinierte Funktionen ersetzen oder erweitern k&ouml;nnen.<\/li>\n<\/ul>\n<h2>Aufbau des Ribbons<\/h2>\n<p>Wir schauen uns zun&auml;chst die Elemente des Ribbons an, die wir auf den ersten Blick sehen (siehe Bild 1). Ganz oben sehen wir die Quick Access Toolbar beispielsweise mit den Schaltfl&auml;chen zum Speichern, Wiederholen oder R&uuml;ckg&auml;ngig machen von Schritten.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_001.png\" alt=\"Elemente des Ribbons\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Elemente des Ribbons<\/p>\n<p>Der Bereich darunter bis zum Arbeitsbereich von Access ist das Ribbon beziehungsweise das Men&uuml;band. Die Hauptelemente im Ribbon sind die <b>tab<\/b>-Elemente.<\/p>\n<p>Neben diesen gibt es noch sogenannte Contextual Tabs. Diese werden nur im Kontext mit bestimmten Elementen der Benutzeroberfl&auml;che eingeblendet, beispielsweise mit der Datenblattansicht von Tabellen, Abfragen oder Formularen.<\/p>\n<p>In der Hierarchie unterhalb der <b>tab<\/b>-Elemente sind die <b>group<\/b>-Elemente angeordnet. Jedes <b>tab<\/b>-Element kann ein oder mehrere <b>group<\/b>-Elemente enthalten, die jeweils nur mit dem &uuml;bergeordneten Tab angezeigt werden. Die <b>group<\/b>-Elemente wiederum enthalten die eigentlichen Steuerelemente &#8211; siehe weiter unten. Au&szlig;erdem finden wir im Ribbon rechts neben den Beschriftungen einiger <b>group<\/b>-Elemente noch sogenannte <b>dialogBoxLauncher<\/b>, mit denen Sie Dialoge mit weiteren Optionen zu den Gruppen &ouml;ffnen k&ouml;nnen.<\/p>\n<h2>Der Bereich Datei\/Backstage<\/h2>\n<p>Wenn Sie auf den Tab-Reiter <b>Datei <\/b>klicken, erscheint kein entsprechendes <b>Tab<\/b>-Element, sondern ein komplett anderer Bereich.<\/p>\n<p>Dieser hei&szlig;t <b>Backstage<\/b>-Bereich und enth&auml;lt einige Schaltfl&auml;chen und Steuerelemente f&uuml;r allgemeine Funktionen von Access, zum Beispiel zum &Ouml;ffnen und Schlie&szlig;en von Datenbanken, Drucken oder Anzeigen der Access-Optionen (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_002.png\" alt=\"Der Backstabe-Bereich\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Der Backstabe-Bereich<\/p>\n<p>Die Schaltfl&auml;chen hier k&ouml;nnen Sie zum &Ouml;ffnen der dahintersteckenden Bereiche nutzen. Manche rufen auch einfach Funktionen auf, ohne einen eigenen Bereich anzuzeigen.<\/p>\n<h2>Steuern des Ribbons<\/h2>\n<p>Das Ribbon steuert man gew&ouml;hnlich durch Anklicken von Tabs oder Steuerelementen mit der Maus. Sie k&ouml;nnen aber auch Tastenkombinationen nutzen.<\/p>\n<p>Bet&auml;tigen Sie die <b>Alt<\/b>-Taste, erscheinen die in Bild 3 sichtbaren Buchstaben im Ribbon, mit denen Sie die einzelnen Tabs oder Befehle der Schnellzugriffsleiste aufrufen k&ouml;nnen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_003.png\" alt=\"Aktivieren von Ribbonbefehlen per Alt-Taste\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Aktivieren von Ribbonbefehlen per Alt-Taste<\/p>\n<p>Bet&auml;tigen Sie dann die Taste mit dem jeweiligen Buchstaben, um einen Befehl direkt auszuf&uuml;hren oder das entsprechende <b>tab<\/b>-Element zu aktivieren und die Tastenkombinationen f&uuml;r die dortigen Befehle anzuzeigen.<\/p>\n<h2>M&ouml;gliche Anpassungen des Ribbons<\/h2>\n<p>Es gibt zwei M&ouml;glichkeiten, wie man das Ribbon anpassen kann:<\/p>\n<ul>\n<li>Anpassung mit Bordmitteln<\/li>\n<li>Anpassung mit XML<\/li>\n<\/ul>\n<h2>Anpassungen des Ribbons mit Bordmitteln<\/h2>\n<p>Die Anpassung mit Bordmitteln bezieht sich immer auf die aktuelle Access-Installation, also nicht etwa auf die aktuelle Datenbankdatei.<\/p>\n<p>Daf&uuml;r ist eine XML-Anpassung n&ouml;tig. Die Anpassung mit Bordmitteln erfolgt &uuml;ber zwei Bereiche des Dialogs <b>Access-Optionen<\/b>, und zwar:<\/p>\n<ul>\n<li><b>Men&uuml;band anpassen<\/b><\/li>\n<li><b>Symbolleiste f&uuml;r den Schnellzugriff<\/b><\/li>\n<\/ul>\n<p>Unter Men&uuml;band anpassen finden Sie zwei Listen (siehe Bild 4). Die linke zeigt alle Befehle an, die &uuml;berhaupt f&uuml;r das Ribbon zur Verf&uuml;gung stehen. Diese k&ouml;nnen Sie nach verschiedenen Kriterien &uuml;ber das Kombinationsfeld <b>Befehle ausw&auml;hlen <\/b>filtern.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_004.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_004.png\" alt=\"Bereich des Optionen-Dialogs zum Anpassen des Men&uuml;bands\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Bereich des Optionen-Dialogs zum Anpassen des Men&uuml;bands<\/p>\n<p>Rechts sehen Sie den Bereich Men&uuml;band anpassen, der die nach einem Eintrag des oberen Kombinationsfeldes gefilterten Registerkarten anzeigt.<\/p>\n<p>Sie k&ouml;nnen jeden Befehl zu jedem Bereich des Ribbons hinzuf&uuml;gen, allerdings nur in einer eigenen, benutzerdefinierten Gruppe. Sie nutzen also zuerst die Schaltfl&auml;che <b>Neue Gruppe<\/b>, um eine neue Gruppe hinzuzuf&uuml;gen, und kopieren dann die Befehle per Drag-and-Drop dort hinein.<\/p>\n<p>Sie k&ouml;nnen auch eine komplett neue Registerkarte hinzuf&uuml;gen (Schaltfl&auml;che <b>Neue Registerkarte<\/b>) oder benutzerdefinierte Elemente &uuml;ber die Schaltfl&auml;che <b>Umbenennen&#8230; <\/b>umbenennen. Diese benutzerdefinierten Eintr&auml;ge k&ouml;nnen Sie mit einem Klick auf die Schaltfl&auml;che <b>Zur&uuml;cksetzen <\/b>wieder verwerfen. Oder Sie exportieren diese mit einem Klick auf die Schaltfl&auml;che <b>Importieren\/Exportieren<\/b>. So k&ouml;nnen Sie die &Auml;nderungen in eine Datei exportieren und diese dar&uuml;ber wieder in eine andere Access-Installation importieren.<\/p>\n<h2>Anpassen der Schnellzugriffsleiste<\/h2>\n<p>Die Schnellzugriffsleiste passen Sie auf &auml;hnliche Weise an, und zwar im Bereich <b>Symbolleiste f&uuml;r den Schnellzugriff <\/b>in den Access-Optionen (siehe Bild 5). Der linke Bereich sieht genauso aus wie im zuvor beschriebenen Dialog, der rechte ist etwas einfacher gehalten. Hier k&ouml;nnen Sie nur einfach Eintr&auml;ge zur Schnellzugriffsleiste hinzuf&uuml;gen, diese hat keine weiteren Hierarchien wie Tabs oder Gruppen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_005.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_005.png\" alt=\"Bereich des Optionen-Dialogs zum Anpassen der Schnellzugriffsleiste\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 5: Bereich des Optionen-Dialogs zum Anpassen der Schnellzugriffsleiste<\/p>\n<h2>Anpassungen des Ribbons f&uuml;r die aktuelle Datenbankdatei<\/h2>\n<p>Die zweite M&ouml;glichkeit der Anpassung des Ribbons bezieht sich nicht auf die Access-In-stallation, sondern auf die aktuell geladene Access-Datenbank.<\/p>\n<p>Auf diese Weise k&ouml;nnen Sie einer von Ihnen programmierten Datenbank eine Art Men&uuml;leiste hinzuf&uuml;gen, mit der Sie oder andere Benutzer mit Schaltfl&auml;chen die Funktionen der Datenbank starten oder Elemente wie Formulare oder Berichte aufrufen k&ouml;nnen. Mit weiteren Steuerelementen wie Men&uuml;s, Splitbuttons oder dem Gallery-Steuerelement k&ouml;nnen Sie die Schaltfl&auml;chen weiter verschachteln.<\/p>\n<p>Oder Sie nutzen Steuerelemente wie <b>comboBox <\/b>oder <b>dropDown <\/b>zur Auswahl von Werten, <b>editBox <\/b>zur Anzeige oder Eingabe von Texten oder auch Umschaltfl&auml;chen oder Kontrollk&auml;stchen f&uuml;r das Anzeigen oder Einstellen von Optionen. Die Anpassungen lassen sich im Wesentlichen f&uuml;r zwei Bereiche definieren:<\/p>\n<ul>\n<li>die Hauptanwendung<\/li>\n<li>einzelne Formulare und Berichte<\/li>\n<\/ul>\n<p>Sie k&ouml;nnen also eine Ribbondefinition festlegen, die gleich beim Start als Anwendungsribbon angezeigt wird.<\/p>\n<p>Diese Einstellung nehmen Sie in den Access-Optionen im Bereich <b>Aktuelle Datenbank <\/b>vor (siehe Bild 6). <\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_006.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_006.png\" alt=\"Option zum Ausw&auml;hlen des Men&uuml;bands f&uuml;r eine Anwendung\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 6: Option zum Ausw&auml;hlen des Men&uuml;bands f&uuml;r eine Anwendung<\/p>\n<p>Au&szlig;erdem k&ouml;nnen Sie weitere Ribbondefinitionen hinterlegen, die Sie einzelnen Formularen oder Berichten zuweisen. Die entsprechenden Ribbons erscheinen dann, sobald das entsprechende Formular oder der Bericht ge&ouml;ffnet werden oder anderweitig den Fokus erhalten.<\/p>\n<p>Diese Einstellung nehmen Sie f&uuml;r die Eigenschaft <b>Name des Men&uuml;bands <\/b>im Bereich <b>Andere <\/b>des Formularentwurfs vor (siehe Bild 7). Auch hier sehen wir noch keinen Wert, da wir noch keine Ribbondefinition zur Anwendung hinzugef&uuml;gt haben.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_007.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_007.png\" alt=\"Option zum Ausw&auml;hlen des Men&uuml;bands f&uuml;r ein Formular\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 7: Option zum Ausw&auml;hlen des Men&uuml;bands f&uuml;r ein Formular<\/p>\n<p>Die gleiche Eigenschaft finden Sie auch f&uuml;r Berichte vor.<\/p>\n<h2>Einfache Ribbondefinition erstellen<\/h2>\n<p>Damit wir uns in der Praxis ansehen k&ouml;nnen, wie wir ein Ribbon erstellen und dieses auch als Anwendungsribbon oder als Formular- oder Berichtsribbon anzeigen k&ouml;nnen, m&uuml;ssen wir eine entsprechende Definition erstellen. Diese formulieren wir im XML-Format.<\/p>\n<p>Genau wie wir oben festgestellt haben, dass das Ribbon nur ein Teil der m&ouml;glichen Anpassungen der Benutzeroberfl&auml;che ist, sieht es auch in der XML-Definition aus. Das Basiselement lautet n&auml;mlich <b>customUI<\/b> und wird wie folgt angelegt:<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\/&gt;<\/pre>\n<p>Diesem f&uuml;gen wir als Erstes ein <b>ribbon<\/b>-Element hinzu, weil wir das eigentliche Ribbon anpassen m&ouml;chten:<\/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;\/customUI&gt;<\/pre>\n<p>Der n&auml;chste Schritt ist ein <b>tab<\/b>-Element, das allerdings &#8211; im Ribbon nicht sichtbar &#8211; ein umschlie&szlig;endes <b>tabs<\/b>-Element ben&ouml;tigt. Dieses fasst alle <b>tab<\/b>-Elemente ein.<\/p>\n<p>Ein <b>tab<\/b>-Element muss zumindest das Attribut <b>id <\/b>aufweisen und sollte auch eine Beschriftung enthalten, hier durch das <b>label<\/b>-Attribut realisiert:<\/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=\"tab\" label=\"Beispieltab\"\/&gt;\r\n     &lt;\/tabs&gt;\r\n   &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p>Das reicht als Grundstein aus, um die Anpassung vorzunehmen. Dazu sind jedoch noch weitere Schritte n&ouml;tig.<\/p>\n<h2>Tabelle zum Speichern von Ribbondefinitionen<\/h2>\n<p>Wir ben&ouml;tigen n&auml;mlich eine Tabelle, in der wir alle Ribbondefinitionen f&uuml;r die Anwendung speichern. Diese enth&auml;lt die folgenden Felder:<\/p>\n<ul>\n<li><b>ID<\/b>: Prim&auml;rschl&uuml;sselfeld der Tabelle<\/li>\n<li><b>RibbonName<\/b>: Bezeichnung, die in den Auswahlfeldern zum Festlegen der Men&uuml;b&auml;nder in den Access-Optionen und den Eigenschaften von Formularen und Berichten angezeigt werden soll<\/li>\n<li><b>RibbonXML<\/b>: Definition des Ribbons im XML-Format<\/li>\n<\/ul>\n<p>Der Entwurf der Tabelle wird in Bild 8 abgebildet.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_008.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_008.png\" alt=\"Entwurf der Tabelle zum Speichern der Ribbondefinitionen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 8: Entwurf der Tabelle zum Speichern der Ribbondefinitionen<\/p>\n<p>Diese Tabelle muss zwingend <b>USysRibbons <\/b>hei&szlig;en. Wenn wir in die Datenblattansicht wechseln, k&ouml;nnen wir den soeben entwickelten XML-Code f&uuml;r die Ribbondefinition wie in Bild 9 als ersten Datensatz in die Tabelle einf&uuml;gen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_009.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_009.png\" alt=\"Eine erste Ribbondefinition in der Tabelle USysRibbons\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 9: Eine erste Ribbondefinition in der Tabelle USysRibbons<\/p>\n<p>Wenn wir nun allerdings versuchen, dieses Ribbon in den Access-Optionen oder als Eigenschaft eines Formulars oder Berichts auszuw&auml;hlen, gelingt dies noch nicht auf Anhieb.<\/p>\n<p>Dazu ist noch ein wichtiger Schritt notwendig: Wir m&uuml;ssen die Anwendung neu starten und somit die Inhalte der Tabelle <b>USysRibbons <\/b>einlesen, damit diese in den Auswahlfeldern mit den verf&uuml;gbaren Ribbondefinitionen erscheinen.<\/p>\n<h2>USysRibbons ist eine Systemtabelle<\/h2>\n<p>Unter Umst&auml;nden haben Sie die Tabelle <b>USysRibbons <\/b>nun gespeichert und geschlossen und wundern sich, dass diese gar nicht im Navigationsbereich erscheint. Das ist der Fall, weil <b>USysRibbons <\/b>mit <b>USys&#8230; <\/b>beginnt, was benutzerdefinierten Systemtabellen vorbehalten ist. Diese werden von Access standardm&auml;&szlig;ig nicht angezeigt. Wenn Sie diese bearbeiten wollen, k&ouml;nnen Sie die Systemtabellen &uuml;ber eine Option einblenden. Dazu klicken Sie mit der rechten Maustaste auf den Titel des Navigationsbereichs und w&auml;hlen den Kontextmen&uuml;-Eintrag <b>Navigationsoptionen&#8230; <\/b>aus.<\/p>\n<p>Es erscheint der Dialog aus Bild 10, in dem Sie die Option <b>Systemobjekte anzeigen <\/b>aktivieren.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_010.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_010.png\" alt=\"Einblenden der Systemtabellen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 10: Einblenden der Systemtabellen<\/p>\n<p>Direkt danach erscheint auch die Tabelle <b>USysRibbons <\/b>im Navigationsbereich, wo Sie diese per Doppelklick zur weiteren Bearbeitung &ouml;ffnen k&ouml;nnen.<\/p>\n<p>Wenn Sie die Systemtabellen nicht einblenden m&ouml;chten, k&ouml;nnen Sie die Tabelle <b>USysRibbons <\/b>&uuml;brigens auch mit dem folgenden Befehl &uuml;ber den Direktbereich des VBA-Editors &ouml;ffnen (anzuzeigen mit <b>Strg + G<\/b>):<\/p>\n<pre>DoCmd.OpenTable               \"USysRibbons\"<\/pre>\n<h2>Anwendungsribbon einstellen<\/h2>\n<p>Nun wollen wir allerdings erstmals unser Ribbon als Anwendungsribbon einstellen. Also schlie&szlig;en wir die Datenbank und &ouml;ffnen diese erneut, was am schnellsten &uuml;ber den Befehl <b>Datei|Informationen|Datenbank komprimieren und reparieren <\/b>gelingt.<\/p>\n<p>Danach &ouml;ffnen wir die Access-Optionen und wechseln dort zum Bereich <b>Aktuelle Datenbank<\/b>. Unter <b>Men&uuml;band- und Symbolleistenoptionen <\/b>finden wir die Option <b>Name des Men&uuml;bands<\/b>, wo wir nun die Definition mit dem Namen aus dem Feld <b>RibbonName <\/b>der Tabelle <b>USysRibbons <\/b>ausw&auml;hlen k&ouml;nnen (siehe Bild 11).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_011.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_011.png\" alt=\"Ausw&auml;hlen des benutzerdefinierten Ribbons als Anwendungsribbon\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 11: Ausw&auml;hlen des benutzerdefinierten Ribbons als Anwendungsribbon<\/p>\n<p>Damit unsere Anpassung angezeigt wird, ben&ouml;tigen wir allerdings noch einen weiteren Neustart der Datenbankdatei. Danach finden wir die Anpassung wie in Bild 12 im Ribbon vor.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_012.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_012.png\" alt=\"Das neue tab-Element im Ribbon\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 12: Das neue tab-Element im Ribbon<\/p>\n<p>Das sieht recht unscheinbar aus, und wenn wir den neuen Registerreiter anklicken, erscheint das leere Ribbontab aus Bild 13.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_013.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_013.png\" alt=\"Das neue tab-Element enth&auml;lt noch keine Gruppen oder Steuerelemente.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 13: Das neue tab-Element enth&auml;lt noch keine Gruppen oder Steuerelemente.<\/p>\n<p>Das war allerdings erst der Anfang und wir wollen nun Gruppen und Steuerelemente anf&uuml;gen.<\/p>\n<h2>tab-Element f&uuml;llen<\/h2>\n<p>Als Erstes f&uuml;gen wir dazu ein <b>group<\/b>-Element hinzu. Spannenderweise werden zwar die <b>tab<\/b>-Elemente in ein <b>tabs<\/b>-Element eingefasst, aber die <b>group<\/b>-Elemente nicht in ein <b>groups<\/b>-Element.<\/p>\n<p>Das liegt vermutlich daran, dass es neben dem <b>tabs<\/b>-Element noch ein weiteres &uuml;bergeordnetes Element f&uuml;r <b>tab<\/b>-Elemente namens <b>contextualTabs <\/b>gibt. Dazu kommen wir sp&auml;ter.<\/p>\n<h2>group-Element hinzuf&uuml;gen<\/h2>\n<p>Das <b>group<\/b>-Element muss wie alle anderen ein <b>id<\/b>-Attribut mit einem f&uuml;r diese Ribbondefinition eindeutigen Wert enthalten.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir eine Beschriftung, die wir wiederum im Attribut <b>label <\/b>hinterlegen:<\/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=\"tab\" label=\"Beispieltab\"&gt;\r\n         &lt;group id=\"grp\" label=\"Beispielgruppe\"\/&gt;\r\n       &lt;\/tab&gt;\r\n     &lt;\/tabs&gt;\r\n   &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<h2>button-Element hinzuf&uuml;gen<\/h2>\n<p>Im <b>group<\/b>-Element legen wir auch direkt ein <b>button<\/b>-Element an, damit wir bei der n&auml;chsten &Auml;nderung ein Steuerelement in der Gruppe des neuen <b>tab<\/b>-Elements sehen. Das <b>button<\/b>-Element innerhalb des <b>group<\/b>-Elements erh&auml;lt ebenfalls die beiden Attribute <b>id <\/b>und <b>label<\/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=\"tab\" label=\"Beispieltab\"&gt;\r\n         &lt;group id=\"grp\" label=\"Beispielgruppe\"&gt;\r\n           &lt;button label=\"Beispielbutton\" id=\"btn\"\/&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>Nachdem Sie die Ribbondefinition in der Tabelle <b>USysRibbons <\/b>wie oben angepasst haben und die Datenbank erneut schlie&szlig;en und wieder &ouml;ffnen, finden wir das Ribbon wie in Bild 14 vor.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_014.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_014.png\" alt=\"Ribbondefinition mit einer Schaltfl&auml;che\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 14: Ribbondefinition mit einer Schaltfl&auml;che<\/p>\n<h2>Ereignis beim Anklicken der Schaltfl&auml;che<\/h2>\n<p>Auch wenn die Schaltfl&auml;che noch ein Icon vertragen k&ouml;nnte, wollen wir zun&auml;chst eine Funktion daf&uuml;r hinterlegen. Dazu sind einige weitere Schritte n&ouml;tig.<\/p>\n<p>Als Erstes m&uuml;ssen wir in der Ribbondefinition hinterlegen, dass &uuml;berhaupt eine Aktion beim Anklicken des <b>button<\/b>-Elements ausgel&ouml;st werden soll.<\/p>\n<p>Dazu f&uuml;gen wir das Attribut <b>onAction <\/b>hinzu und legen als Wert den Namen einer VBA-Routine fest, die beim Anklicken der Schaltfl&auml;che ausgel&ouml;st werden soll, zum Beispiel ebenfalls <b>onAction<\/b>. Der Code nur f&uuml;r das <b>button<\/b>-Element lautet nun:<\/p>\n<pre>&lt;button label=\"Beispielbutton\" id=\"btn\" onAction=\"onAction\"\/&gt;<\/pre>\n<h2>VBA-Prozedur f&uuml;r das Callback-Attribut<\/h2>\n<p>Nun ben&ouml;tigen wir eine entsprechende Prozedur in einem Modul des VBA-Projekts der Datenbankdatei, die beim Anklicken des <b>button<\/b>-Elements ausgel&ouml;st wird. Diese hat eine spezielle Signatur, die wir zwingend verwenden m&uuml;ssen &#8211; anderenfalls wird die Routine nicht gefunden. Die Routinen f&uuml;r das Ribbon wollen wir in einem eigenen Modul namens <b>mdlRibbon<\/b> ablegen. Die Prozedur sieht ohne weitere Anweisungen zun&auml;chst wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(control<span style=\"color:blue;\"><span style=\"color:blue;\"> As <\/span><\/span>IRibbonControl)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Fehlender Office-Verweis f&uuml;r Ribbon-Funktionen<\/h2>\n<p>Wenn Sie die Anwendung nun kompilieren, erhalten Sie allerdings einen Fehler wie in Bild 15. Der einzige benutzerdefinierte Typ, der hier infrage kommt, hei&szlig;t <b>IRibbonControl<\/b>. Warum ist dieser nicht definiert Weil die Elemente zur Programmierung des Ribbons nicht in den Bibliotheken enthalten sind, die standardm&auml;&szlig;ig in einem VBA-Projekt referenziert werden, sondern in einer Bibliothek, die allen Office-Anwendungen zur Verf&uuml;gung steht. Das ist logisch, denn auch das Ribbon basiert ja in allen Office-Anwendungen auf der gleichen Technik.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_015.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_015.png\" alt=\"Fehler beim Kompilieren der Anwendung\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 15: Fehler beim Kompilieren der Anwendung<\/p>\n<p>Der fehlende Verweis hei&szlig;t <b>Microsoft Office x.0 Object Library <\/b>und Sie k&ouml;nnen ihn &uuml;ber den <b>Verweise<\/b>-Dialog hinzuf&uuml;gen.<\/p>\n<p>Dazu w&auml;hlen Sie im VBA-Editor den Men&uuml;eintrag <b>Extras|Verweise <\/b>aus. Hier f&uuml;gen Sie den fehlenden Verweis wie in Bild 16 hinzu. Danach l&auml;sst sich die Funktion erfolgreich kompilieren.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_017.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_017.png\" alt=\"Hinzuf&uuml;gen des fehlenden Office-Verweises\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 16: Hinzuf&uuml;gen des fehlenden Office-Verweises<\/p>\n<h2>Anzeige von Ribbonfehlern aktivieren<\/h2>\n<p>Bevor wir die Schaltfl&auml;che ausprobieren, wollen wir uns noch um eine weitere Sache k&uuml;mmern. Die Office-Anwendungen k&ouml;nnen eine Meldung ausgeben, wenn eine benutzerdefinierte Ribbondefinition Fehler erzeugt.<\/p>\n<p>Dies m&uuml;ssen Sie jedoch zun&auml;chst noch aktivieren. Dazu bem&uuml;hen wir wiederum die Access-Optionen, wo Sie im Bereich <b>Clienteinstellungen <\/b>unter <b>Allgemein <\/b>die Option <b>Fehler von Benutzeroberfl&auml;chen-Add-Ins anzeigen <\/b>finden und aktivieren (siehe Bild 17).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_018.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_018.png\" alt=\"Aktivieren der Fehleranzeige f&uuml;r Ribbons\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 17: Aktivieren der Fehleranzeige f&uuml;r Ribbons<\/p>\n<p>Danach zeigt Access beispielsweise eine Fehlermeldung an, wenn die Ribbondefinition fehlerhaft ist &#8211; also wenn beispielsweise das schlie&szlig;ende Element zu einem Element fehlt oder ein Pflichtattribut nicht enthalten ist.<\/p>\n<h2>Test der Ribbon-Schaltfl&auml;che<\/h2>\n<p>Bevor wir die Schaltfl&auml;che ausprobieren, f&uuml;gen wir der Prozedur <b>onAction <\/b>noch eine <b>MsgBox<\/b>-Anweisung hinzu:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(control<span style=\"color:blue;\"><span style=\"color:blue;\"> As <\/span><\/span>IRibbonControl)\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Aufruf von Steuerelement '\" & control.Id & \"'\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier setzen wir eine Meldung zusammen, welche die Eigenschaft <b>id <\/b>des &uuml;bergebenen Parameters <b>control <\/b>verwendet. Wie Bild 18 zeigt, liefert dies genau den Namen, den wir f&uuml;r das Attribut <b>id <\/b>des <b>button<\/b>-Elements festgelegt haben.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_019.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_019.png\" alt=\"Meldung per button-Steuerelement\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 18: Meldung per button-Steuerelement<\/p>\n<p>Das liefert uns die M&ouml;glichkeit, alle Ereignisse, die durch <b>button<\/b>-Elemente ausgel&ouml;st werden, in einer einzigen <b>onAction<\/b>-Prozedur zu verarbeiten. Wir m&uuml;ssen in dieser lediglich den Wert des Parameters <b>control.id <\/b>pr&uuml;fen und beispielsweise in einer <b>Select Case<\/b>-Bedingung die entsprechenden Anweisungen aufrufen.<\/p>\n<h2>Bilder f&uuml;r Schaltfl&auml;chen<\/h2>\n<p>Wenn Sie eine optisch ansprechende Benutzeroberfl&auml;che verwenden wollen, k&ouml;nnen Sie beispielsweise f&uuml;r die <b>button<\/b>-Elemente des Ribbons Icons anzeigen. Das ist allerdings nicht trivial, denn wir ben&ouml;tigen eine Menge weiteren Code daf&uuml;r. Au&szlig;erdem m&uuml;ssen wir eine weitere Tabelle nutzen, die allerdings normalerweise schon in Ihrer Datenbank vorhanden ist. Um ein Bild anzuzeigen, sind die folgenden Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Hinzuf&uuml;gen des Bildes zu der Tabelle <b>MSysResources<\/b> und Merken des Wertes in der Spalte <b>Name<\/b><\/li>\n<li>Hinzuf&uuml;gen des Bildnamen als Wert des Attributs <b>image <\/b>des <b>button<\/b>-Elements<\/li>\n<li>Hinzuf&uuml;gen des Wertes <b>loadImages <\/b>zum Attribut <b>loadImages <\/b>des Elements <b>customUI<\/b><\/li>\n<li>Anlegen eines Moduls namens <b>mdlRibbonImages <\/b>mit speziellen Bildfunktionen<\/li>\n<li>Hinzuf&uuml;gen einer Prozedur namens <b>LoadImages <\/b>zum Modul <b>mdlRibbons<\/b><\/li>\n<\/ul>\n<h2>Bild zur Tabelle MSysResources hinzuf&uuml;gen<\/h2>\n<p>Die Tabelle <b>MSysResources <\/b>sehen wir erst, wenn wir nicht nur die Option <b>Systemobjekte anzeigen <\/b>aktiviert haben, sondern auch die Option <b>Ausgeblendete Objekte anzeigen<\/b>.<\/p>\n<p>Diese finden wir an der gleichen Stelle wie die zuvor erw&auml;hnte Option. Anschlie&szlig;end k&ouml;nnen wir die Tabelle <b>MSysResources <\/b>&uuml;ber den Navigationsbereich &ouml;ffnen und dann mit einem Doppelklick auf das @-Symbol eines neuen Datensatzes ein Bild hinzuf&uuml;gen &#8211; optimalerweise eines mit der Dateiendung <b>.png<\/b>. Die Auswahl erledigen wir mit dem nun erscheinenden Dialog <b>Attachments<\/b> (siehe Bild 19). Hier klicken Sie auf die Schaltfl&auml;che <b>Add&#8230; <\/b>und w&auml;hlen im n&auml;chsten Dialog die einzuf&uuml;gende Bilddatei aus.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_020.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_020.png\" alt=\"Hinzuf&uuml;gen einer Bilddatei\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 19: Hinzuf&uuml;gen einer Bilddatei<\/p>\n<h2>Gr&ouml;&szlig;e des Bildes<\/h2>\n<p>Hier taucht nun die Frage auf, welche Gr&ouml;&szlig;e die als Icon eines Ribbonelements zu verwendenden Bilddateien haben sollen. Es gibt zwei darstellbare Bildgr&ouml;&szlig;en: 16&#215;16 f&uuml;r normale und 32&#215;32 f&uuml;r gro&szlig;e Schaltfl&auml;chen und Steuerelemente.<\/p>\n<p>Am besten f&uuml;gen Sie immer Bilder mit der Gr&ouml;&szlig;e 32&#215;32 hinzu, denn die sehen auch bei kleinen Steuerelementen, die Bilder im Format 16&#215;16 anzeigen, gut aus, w&auml;hrend Bilder mit der Gr&ouml;&szlig;e 16&#215;16 bei Verwendung in Steuerelementen mit gro&szlig;en Bildern pixelig aussehen.<\/p>\n<h2>Nach der Auswahl des Bildes<\/h2>\n<p>Im Dialog <b>Choose File <\/b>w&auml;hlen Sie wie in Bild 20 die gew&uuml;nschte Bilddatei aus.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_021.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_021.png\" alt=\"Ausw&auml;hlen der Bilddatei\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 20: Ausw&auml;hlen der Bilddatei<\/p>\n<p>Danach erscheint die Bilddatei zun&auml;chst im Dialog <b>Attachments <\/b>(siehe Bild 21).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_022.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_022.png\" alt=\"Die Bilddatei ist im Attachment-Feld gelandet.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 21: Die Bilddatei ist im Attachment-Feld gelandet.<\/p>\n<p>Schlie&szlig;en wir den Dialog, finden wir f&uuml;r das <b>@-<\/b>Symbol in Klammern die Zahl <b>1 <\/b>vor. Nun k&ouml;nnen wir noch die &uuml;brigen Felder mit den ben&ouml;tigten Werten f&uuml;llen. Als Namen legen wir in diesem Fall beispielsweise <b>banana <\/b>fest, f&uuml;r das Feld <b>Extension <\/b>den Wert <b>png <\/b>und f&uuml;r <b>Type <\/b>den Wert <b>img<\/b>.<\/p>\n<h2>Bilder per Formularansicht hinzuf&uuml;gen<\/h2>\n<p>Sie k&ouml;nnen die Bilder auch noch auf eine etwas einfachere Weise zur Tabelle <b>MSysResources <\/b>hinzuf&uuml;gen. Dazu verwenden Sie die Entwurfsansicht von Formularen. Hier klicken Sie im Ribbon auf den Eintrag <b>Entwurf|Steuerelemente|Bild einf&uuml;gen|Durchsuchen&#8230; <\/b>(siehe Bild 22).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_077.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_077.png\" alt=\"&Ouml;ffnen des Dialogs zum Ausw&auml;hlen einer Bilddatei\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 22: &Ouml;ffnen des Dialogs zum Ausw&auml;hlen einer Bilddatei<\/p>\n<p>Im nun erscheinenden <b>Grafik einf&uuml;gen<\/b>-Dialog w&auml;hlen Sie die gew&uuml;nschte Bilddatei aus. Danach verwandelt der Mauszeiger sich in ein Symbol zum Einf&uuml;gen eines Bildes, wenn Sie damit &uuml;ber den Formularentwurf fahren.<\/p>\n<p>Wir wollen das Bild aber nicht in das Formular einf&uuml;gen, sondern in die Tabelle <b>MSysResources<\/b>. Aber keine Sorge: Das ist l&auml;ngst geschehen! Sie k&ouml;nnen den Vorgang mit der <b>Esc<\/b>-Taste abbrechen.<\/p>\n<p>Klicken Sie danach erneut auf den Ribboneintrag von eben, zeigt dieser das hinzugef&uuml;gte Icon im Aufklappmen&uuml; an (siehe Bild 23).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_078.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_078.png\" alt=\"Das hinzugef&uuml;gte Icon erscheint in der Auswahlliste f&uuml;r den Formularentwurf.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 23: Das hinzugef&uuml;gte Icon erscheint in der Auswahlliste f&uuml;r den Formularentwurf.<\/p>\n<p>Und diese Liste bezieht ihre Bilder eben aus der Tabelle <b>USysResources<\/b>, wo Sie anschlie&szlig;end ebenfalls einen Eintrag f&uuml;r dieses Bild vorfinden (siehe Bild 24).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_079.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_079.png\" alt=\"Das neue Bild in der Tabelle MSysResources\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 24: Das neue Bild in der Tabelle MSysResources<\/p>\n<h2>Ribbon-definition f&uuml;r die Anzeige des Bildes anpassen<\/h2>\n<p>Nun f&uuml;gen wir dem Steuerelement, welches das Bild anzeigen soll, das Attribut <b>image <\/b>hinzu und stellen dieses auf den Wert des Feldes <b>Name <\/b>f&uuml;r den gew&uuml;nschten Datensatz der Tabelle <b>MSysResources <\/b>&#8211; in diesem Fall <b>banana<\/b>:<\/p>\n<pre>&lt;button image=\"banana\" label=\"Beispielbutton\" id=\"btn\" onAction=\"onAction\"\/&gt;<\/pre>\n<p>Au&szlig;erdem wollen wir ein Callback-Attribut namens <b>loadImage <\/b>zu diesem Element hinzuf&uuml;gen, mit dem wir die Prozedur angeben, die das f&uuml;r <b>image <\/b>angegebene Bild in das Ribbon laden soll.<\/p>\n<p>Danach sieht das Element wie folgt aus:<\/p>\n<pre>&lt;button image=\"banana\" label=\"Beispielbutton\" id=\"btn\" onAction=\"onAction\" loadImage=\"loadImage\"\/&gt;<\/pre>\n<p>Dies ist die erste von zwei M&ouml;glichkeiten, die andere sehen wir uns gleich im Anschluss an.<\/p>\n<h2>Modul mit Bildfunktionen hinzuf&uuml;gen<\/h2>\n<p>F&uuml;r das eigentliche Auslesen der Bilddatei aus dem Anlagefeld ben&ouml;tigen wir einige API-Funktionen, die wir hier nicht im Detail beschreiben k&ouml;nnen. Sie finden diese jedoch in der Beispieldatenbank unter dem Namen <b>mdlRibbonImages<\/b>.<\/p>\n<h2>Prozedur loadImage erstellen<\/h2>\n<p>Die Prozedur <b>loadImage<\/b> sieht wie in Listing 1 aus. Sie erwartet mit dem Parameter <b>control <\/b>nicht etwa wie beispielsweise <b>onAction <\/b>einen Verweis auf das Steuerelement, f&uuml;r das diese Prozedur aufgerufen wird, sondern den Wert der Eigenschaft <b>image <\/b>&#8211; hier also der Wert <b>banana<\/b>. Der zweite Parameter gibt das Bild mit dem Datentyp <b>StdPicture <\/b>an das aufrufende Ribbon zur&uuml;ck.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>loadImage(imageId, ByRef image)\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     lngID = Nz(DLookup(\"ID\", \"MSysResources\", \"Name = '\" & control & \"'\"), 0)\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 3078<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Tabelle 'MSysResources' mit den Images f&uuml;r die Anzeige im Ribbon fehlt.\", vbOKOnly + vbExclamation, _\r\n             \"Tabelle MSysResources fehlt\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Das Image '\" & control & \"' ist nicht in der Tabelle MSysResources vorhanden. \" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"F&uuml;gen Sie dieses hinzu, indem Sie im Formularentwurf die Funktion zum Einf&uuml;gen von Bildern nutzen,\" _\r\n             & \"ohne das Bild zum Formular selbst hinzuzuf&uuml;gen.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> image = PicFromSharedResource_Ribbon(CStr(control))\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: Die Prozedur loadImage<\/p>\n<p>Jetzt k&ouml;nnte ein Fragezeichen auftauchen: Warum legen wir <b>image <\/b>im jeweiligen Steuerelement fest und <b>loadImage <\/b>im Element <b>CustomUI<\/b> Das ist eine Ausnahme im Vergleich zu einigen anderen Callback-Attributen, die wir sp&auml;ter noch kennenlernen werden. Die Prozedur <b>loadImage <\/b>wird n&auml;mlich beim Laden der Ribbondefinition f&uuml;r jedes Steuerelement mit dem Attribut <b>image <\/b>einmal aufgerufen. Deshalb wird dann auch f&uuml;r <b>control<\/b> der Wert des Attributs <b>image <\/b>des jeweiligen Steuerelement &uuml;bergeben und nicht der Verweis auf das <b>customUI<\/b>-Element.<\/p>\n<p>Die Prozedur, die wir f&uuml;r das Attribut <b>load-Image <\/b>hinterlegt haben, pr&uuml;ft erst einmal, ob die Tabelle <b>MSysResources<\/b> &uuml;berhaupt einen Datensatz enth&auml;lt, der im Feld <b>Name <\/b>den Wert aus dem Parameter <b>control <\/b>enth&auml;lt. Falls dies einen Fehler <b>3078 <\/b>ausl&ouml;st, ist die Tabelle <b>MSysResources <\/b>gar nicht vorhanden. In diesem Fall liefert die Prozedur eine entsprechende Fehlermeldung.<\/p>\n<p>Anderenfalls kann es sein, dass das gesuchte Bild nicht gefunden wurde. Auch in diesem Fall liefert die Prozedur eine Meldung. Ist das Bild jedoch vorhanden, was in der Regel der Fall sein sollte, ruft sie die Funktion <b>PicFromSharedResource_Ribbon <\/b>auf und &uuml;bergibt den Namen des einzulesenden Bildes. Dieses wird dann als Objekt des Typs <b>StdPicture <\/b>zur&uuml;ckgeliefert und im Ribbon angezeigt (siehe Bild 25).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_542_023.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_542_023.png\" alt=\"Das Bild einer Ribbonschaltfl&auml;che\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 25: Das Bild einer Ribbonschaltfl&auml;che<\/p>\n<h2><b>Alternative getImage<\/b><\/h2>\n<p>Weiter oben haben wir das Attribut <b>loadImage <\/b>des Elements <b>customUI <\/b>in Kombination mit dem Element <b>image <\/b>des jeweiligen Steuerelements zum Laden eines Bildes genutzt. Es gibt auch noch das Callbackattribut <b>getImage<\/b>. Dieses hinterlegen Sie f&uuml;r das Steuerelement, f&uuml;r das Sie ein Bild laden wollen. Die Callback-Signatur dieser Prozedur sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getImage(control<span style=\"color:blue;\"><span style=\"color:blue;\"> As <\/span><\/span>IRibbonControl, ByRef image)\r\n     \r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Im Gegensatz zu <b>loadImage <\/b>wird der Parameter <b>control <\/b>hier nicht als Variant &uuml;bergeben, sondern wieder als Element des Typs <b>IRibbonControl<\/b>. Der zweite Parameter erwartet das anzuzeigende Bild als <b>StdPicture<\/b>. Das hei&szlig;t also, dass wir hier nicht den Wert des Attributs <b>image <\/b>erhalten. Also haben wir in dieser Prozedur keine Information dar&uuml;ber, welches Bild geladen werden soll. Wir k&ouml;nnten das schematisch wie folgt regeln:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getImage(control<span style=\"color:blue;\"><span style=\"color:blue;\"> As <\/span><\/span>IRibbonControl, ByRef image)\r\n     Select Case control.id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnBeispielbutton\"\r\n             <span style=\"color:blue;\">Set<\/span> image =                  PicFromSharedResource_Ribbon(\"banana\")\r\n         <span style=\"color:blue;\">Case <\/span>...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir w&uuml;rden also pr&uuml;fen, welchen Namen das Steuerelement hat und dann das zu verwendende Bild, hier wieder <b>banana<\/b>, fest im Code verankern. Das hat aber den Nachteil, dass wir zum &Auml;ndern des Bildes nicht mehr die Ribbondefinition, sondern den Code anpassen m&uuml;ssten &#8211; was keine gute Idee ist.<\/p>\n<h2>Speichern des Bildes im tag-Attribut<\/h2>\n<p>Also nutzen wir ein noch nicht verwendetes Attribut eines Steuerelements, n&auml;mlich <b>tag<\/b>. Den Wert des <b>tag<\/b>-Attributs k&ouml;nnen wir ebenfalls &uuml;ber die Eigenschaften des <b>IRibbonControl<\/b>-Elements auslesen. Daraus k&ouml;nnen wir dann aus der oben verwendeten <b>loadImage<\/b>-Prozedur eine <b>getImage<\/b>-Prozedur ableiten (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getImage(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, ByRef image)\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(control.Tag) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es wurde kein Bildname f&uuml;r das Attribut 'tag' im Element '\" & control.id & \"' hinterlegt.\", vbOKOnly + vbExclamation\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     lngID = Nz(DLookup(\"ID\", \"MSysResources\", \"Name = '\" & control.Tag & \"'\"), 0)\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 3078<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Tabelle 'MSysResources' mit den Images f&uuml;r die Anzeige im Ribbon fehlt.\", vbOKOnly + vbExclamation, _\r\n             \"Tabelle MSysResources fehlt\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Das Image '\" & control & \"' ist nicht in der Tabelle MSysResources vorhanden. \" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"F&uuml;gen Sie dieses hinzu, indem Sie im Formularentwurf die Funktion zum Einf&uuml;gen von Bildern nutzen,\" _\r\n             & \"ohne das Bild zum Formular selbst hinzuzuf&uuml;gen.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> image = PicFromSharedResource_Ribbon(CStr(control.Tag))\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 2: Die Prozedur getImage<\/p>\n<p>Diese wertet zun&auml;chst den Inhalt der <b>Tag<\/b>-Eigenschaft  des mit <b>control <\/b>&uuml;bergebenen <b>IRibbonControl<\/b>-Elements aus. Dieses f&uuml;llen wir f&uuml;r dieses Element wie folgt &#8211; der Name des Images wird also im <b>tag<\/b>-Attribut gespeichert:<\/p>\n<pre>&lt;button label=\"Beispielbutton1\" id=\"btn1\" onAction=\"onAction\" getImage=\"getImage\" tag=\"close\"\/&gt;<\/pre>\n<p>Ist die Eigenschaft <b>Tag <\/b>leer, liefert die Prozedur eine entsprechende Meldung. Der Rest funktioniert wie in der Prozedur <b>LoadImage<\/b>, die wir weiter oben beschrieben haben.<\/p>\n<h2>Unterschied zwischen loadImage und getImage<\/h2>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000542\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000542?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000542\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Ribbon, in der deutschen Version von Office auch Men&uuml;band genannt, ist die Men&uuml;leiste f&uuml;r Office-Anwendungen und somit auch f&uuml;r Access. Sie k&ouml;nnen die Befehle im Ribbon jedoch nicht nur w&auml;hrend der Entwicklung von Access-Anwendungen nutzen, sondern dieses f&uuml;r eigene Anwendungen so anpassen, dass der Benutzer die Funktionen dieser Anwendung dar&uuml;ber aufrufen kann. Dabei k&ouml;nnen Sie die eingebauten Elemente sogar weitgehend ausblenden, sodass man Ihrer Anwendung nur noch an wenigen Stellen ansieht, dass es sich &uuml;berhaupt um eine Access-Anwendung handelt. Diese Artikelreihe liefert alle Informationen, die Sie f&uuml;r die Arbeit mit dem Ribbon und f&uuml;r seine Anpassung und Programmierung ben&ouml;tigen. Dabei lernen Sie auch alle Steuerelemente und ihre Eigenschaften kennen.<\/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":[662021,66052021,44000005],"tags":[],"class_list":["post-55000542","post","type-post","status-publish","format-standard","hentry","category-662021","category-66052021","category-AccessBenutzeroberflaeche"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ribbon anpassen, Teil 1 - Access [basics]<\/title>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ribbon anpassen, Teil 1 - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Das Ribbon, in der deutschen Version von Office auch Men&uuml;band genannt, ist die Men&uuml;leiste f&uuml;r Office-Anwendungen und somit auch f&uuml;r Access. Sie k&ouml;nnen die Befehle im Ribbon jedoch nicht nur w&auml;hrend der Entwicklung von Access-Anwendungen nutzen, sondern dieses f&uuml;r eigene Anwendungen so anpassen, dass der Benutzer die Funktionen dieser Anwendung dar&uuml;ber aufrufen kann. Dabei k&ouml;nnen Sie die eingebauten Elemente sogar weitgehend ausblenden, sodass man Ihrer Anwendung nur noch an wenigen Stellen ansieht, dass es sich &uuml;berhaupt um eine Access-Anwendung handelt. Diese Artikelreihe liefert alle Informationen, die Sie f&uuml;r die Arbeit mit dem Ribbon und f&uuml;r seine Anpassung und Programmierung ben&ouml;tigen. Dabei lernen Sie auch alle Steuerelemente und ihre Eigenschaften kennen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-01T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/pic_542_001.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"63\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_542_001.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html\",\"name\":\"Ribbon anpassen, Teil 1 - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html#primaryimage\"},\"datePublished\":\"2021-10-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Ribbon_anpassen_Teil_1.html\",\"name\":\"Ribbon anpassen, Teil 1\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000542"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000542\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000542"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000542"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}