{"id":55001069,"date":"2017-02-01T00:00:00","date_gmt":"2020-05-14T13:40:47","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1069"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ribbonklassen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/","title":{"rendered":"Ribbonklassen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/e4d231a242dc42f5915b5b3f3bd7c94a\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Das Ribbon l&auml;sst sich normalerweise nur definieren, indem Sie den XML-Code zur Beschreibung des Ribbons festlegen, in einer bestimmten Tabelle speichern und die dortigen Eintr&auml;ge dann als Anwendungsribbon nutzen oder bestimmten Formularen oder Berichten zuweisen. Mit hier vorgestellten Klassen k&ouml;nnen Sie das Ribbon von nun an ganz einfach per VBA zusammenstellen und etwa Formularen oder Berichten zuweisen.<\/b><\/p>\n<p>Wie funktioniert das nun &#8211; ein Ribbon anzuzeigen, ohne die Tabelle <b>USysRibbons<\/b> mit Ribbon-Definitionen zu f&uuml;llen beziehungsweise g&auml;nzlich ohne statisch definierte Ribbons Grunds&auml;tzlich ist das ganz einfach: Sie ben&ouml;tigen lediglich einige Objekte aus der Beispieldatenbank zu diesem Beitrag, die Sie &uuml;ber die Importieren-Funktion in die Datenbank importieren, die Sie mit Ribbons ausstatten m&ouml;chten.<\/p>\n<p>Dabei handelt es sich um die folgenden Objekte:<\/p>\n<ul>\n<li><b>clsStartRibbon<\/b>: Klasse, in der Sie das Hauptribbon einer Anwendung definieren<\/li>\n<li><b>Ribbons<\/b>: Klasse, mit der Sie die Ribbons einer Anwendung verwalten<\/li>\n<li><b>clsRibbon<\/b>: Klasse, die die Eigenschaften und Ereignisse des <b>Ribbon<\/b>-Elements bereitstellt<\/li>\n<li><b>clsTabs<\/b>: Klasse, welche die Tabs verwaltet<\/li>\n<li><b>clsTab<\/b>: Klasse, welche die Eigenschaften des <b>Tab<\/b>-Elements bereitstellt<\/li>\n<li><b>clsGroups<\/b>: Klasse, welche die Gruppen eines <b>Tab<\/b>-Elements verwaltet<\/li>\n<li><b>clsGroup<\/b>: Klasse, welche die Eigenschaften und Ereignisse des <b>Group<\/b>-Elements bereitstellt<\/li>\n<li><b>clsControls<\/b>: Klasse, welche die Steuerelemente innerhalb einer Gruppe verwaltet<\/li>\n<li><b>clsButton<\/b>: Klasse, welche die Funktionen des <b>Button<\/b>-Elements kapselt<\/li>\n<li><b>clsSeparator<\/b>: Klasse, welche die Eigenschaften eines Separator-Elements kapselt<\/li>\n<li><b>mdlRibbons<\/b>: Stellt einige globale Variablen bereit sowie die Funktionen zur Anzeige von Bilddateien<\/li>\n<li><b>mdlRibbonEnums<\/b>: Modul, das einige Enumerationen enth&auml;lt<\/li>\n<li><b>mdlTools<\/b>: Enth&auml;lt einige allgemeine Funktionen wie etwa zum Ermitteln von GUIDs oder zum Erstellen von formatierten XML-Dokumenten<\/li>\n<li><b>mdlZwischenablage<\/b>: Enth&auml;lt Funktionen, um Daten in die Zwischenablage zu kopieren und von dort abzufragen<\/li>\n<\/ul>\n<p>Au&szlig;erdem sind noch drei Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Sie f&uuml;gen den Verweisen der Anwendung den Eintrag <b>Microsoft Office x.0 Object Library <\/b>hinzu (s. Bild 1).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_002.png\" alt=\"Verweis auf die Office-Bibliothek\" width=\"424,7115\" height=\"334,8159\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verweis auf die Office-Bibliothek<\/span><\/b><\/p>\n<li>Sie tragen f&uuml;r die Eigenschaft <b>Name des Men&uuml;-bands<\/b> in den Access-Optionen den Wert <b>Main <\/b>ein (s. Bild 2).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_004.png\" alt=\"Option, um das Anwendungsribbon einzustellen\" width=\"649,559\" height=\"343,4749\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Option, um das Anwendungsribbon einzustellen<\/span><\/b><\/p>\n<li>Sie aktivieren die Option <b>Fehler von Benutzeroberfl&auml;chen-Add-Ins anzeigen<\/b> in den Access-Optionen (s. Bild 3).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_015.png\" alt=\"Aktivieren der Anzeige von Ribbon-Fehlern\" width=\"649,559\" height=\"376,0604\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Aktivieren der Anzeige von Ribbon-Fehlern<\/span><\/b><\/p>\n<\/ul>\n<h2>Ribbons anzeigen<\/h2>\n<p>Zum Anzeigen von Ribbons gibt es auf herk&ouml;mmlichem Wege zwei M&ouml;glichkeiten: Entweder Sie tragen den Namen der gew&uuml;nschten Ribbon-Definition, die Sie in der Tabelle <b>USysRibbons <\/b>gespeichert haben, f&uuml;r die oben genannte Eigenschaft in den Access-Optionen ein &#8211; dann wird das entsprechende Ribbon gleich beim Anwendungsstart angezeigt. Oder Sie m&ouml;chten, dass das Ribbon mit einem Formular oder Bericht eingeblendet wird.<\/p>\n<p>Dann tragen Sie den Namen des Ribbons f&uuml;r die entsprechende Eigenschaft des Formulars oder Berichts ein.<\/p>\n<p>Wir verwenden in der hier vorgestellten L&ouml;sung zwar keine Tabelle namens <b>USysRibbons <\/b>zum Speichern von Ribbon-Definitionen, aber wir k&ouml;nnen dennoch beide Methoden zum Anzeigen von Ribbons nutzen. F&uuml;r die erste Methode ist die obige Angabe des Standardribbons n&ouml;tig, beispielsweise &uuml;ber den Namen <b>Main<\/b>.<\/p>\n<p>Au&szlig;erdem brauchen Sie ein <b>AutoExec<\/b>-Makro, das daf&uuml;r sorgt, dass das Ribbon auch direkt beim &ouml;ffnen der Anwendung angezeigt wird.<\/p>\n<p>Dieses Makro definieren Sie wie in Bild 4. Der einzige Makrobefehl lautet <b>Ausf&uuml;hrenCode <\/b>und ruft die Funktion <b>RibbonLaden <\/b>auf. Diese Funktion ist im Modul <b>mdlRibbons <\/b>definiert und sieht wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_005.png\" alt=\"AutoExec-Makro, das ein Ribbon einblenden soll\" width=\"424,7115\" height=\"234,925\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: AutoExec-Makro, das ein Ribbon einblenden soll<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RibbonLaden()\r\n     Startribbon.CreateRibbon\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Hier wird also die Methode <b>CreateRibbon <\/b>eines Objekts namens <b>Startribbon <\/b>aufgerufen. Wie Sie weiter oben sehen, haben wir die entsprechende Klasse <b>Startribbon <\/b>bereits in der Beispieldatenbank vorbereitet. Aber wie k&ouml;nnen wir die Methode <b>CreateRibbon <\/b>dieser Klasse nutzen, ohne dass wir diese instanzieren Das ist kein Problem: Wie m&uuml;ssen die Klasse nur einmal in eine Textdatei exportieren und dann einige Eigenschaften, die im VBA-Editor nicht sichtbar sind, anpassen. In Bild 5 haben wird dies f&uuml;r die Klasse <b>Ribbons <\/b>durchgef&uuml;hrt, die ebenfalls ohne Instanzierung genutzt werden soll.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_001.png\" alt=\"Anpassen der Klasse Ribbons, damit diese nicht instanziert werden muss\" width=\"424,7115\" height=\"152,1694\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Anpassen der Klasse Ribbons, damit diese nicht instanziert werden muss<\/span><\/b><\/p>\n<p>Nun wollen wir in der Klasse <b>StartRibbon <\/b>eine Methode namens <b>CreateRibbon <\/b>anlegen, mit der wir ein Ribbon namens <b>Main <\/b>definieren, das dann beim &ouml;ffnen der Anwendung gleich angezeigt werden soll.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CreateRibbon()\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In dieser deklarieren wir nun zun&auml;chst ein Objekt des Typs <b>clsRibbon<\/b>, das unsere Ribbon-Deklaration aufnimmt.<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objRibbon<span style=\"color:blue;\"> As <\/span>clsRibbon<\/pre>\n<p>Wir wollen als Erstes lediglich ein leeres <b>Tab<\/b>-Element hinzuf&uuml;gen, um zu zeigen, dass die Klassen auch wirklich ihr Werk verrichten. Dazu deklarieren wir auch noch ein Element des Typs <b>clsTab<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objTab<span style=\"color:blue;\"> As <\/span>clsTab<\/pre>\n<p>Das <b>clsRibbon<\/b>-Element f&uuml;llen wir dann mit einem Objekt, das die <b>Add<\/b>-Methode der <b>Ribbons<\/b>-Klasse liefert:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> objRibbon = Ribbons.Add(\"Main\")<\/pre>\n<p>Dieses Objekt besitzt wie das entsprechende Element in der Ribbon-Definition eine Eigenschaft namens <b>StartFromScratch<\/b>, die wir auf den Wert <b>True <\/b>einstellen:<\/p>\n<pre>     <span style=\"color:blue;\">With<\/span> objRibbon\r\n         .StartFromScratch = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Dann f&uuml;gen wir dem <b>clsRibbon<\/b>-Element mit der <b>Add<\/b>-Methode der <b>Tabs<\/b>-Auflistung ein neues <b>Tab<\/b>-Element hinzu. Den Namen &uuml;bergeben wir als Parameter:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objTab = .Tabs.Add(\"Beispieltab\")<\/pre>\n<p>F&uuml;r dieses Objekt legen wir die Beschriftung mit der Eigenschaft <b>label<\/b> fest:<\/p>\n<pre>         <span style=\"color:blue;\">With<\/span> objTab\r\n             .label = \"Beispieltab\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     End <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Danach rufen wir die Methode <b>CreateStartRibbon <\/b>der Klasse <b>Ribbons <\/b>auf und &uuml;bergeben dieser den Namen des zu erstellenden Ribbons, also <b>Main<\/b>:<\/p>\n<pre>     Ribbons.CreateStartRibbon \"Main\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die vollst&auml;ndige Fassung dieser Prozedur finden Sie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CreateRibbon()\r\n     <span style=\"color:blue;\">Dim <\/span>objRibbon<span style=\"color:blue;\"> As <\/span>clsRibbon\r\n     <span style=\"color:blue;\">Dim <\/span>objTab<span style=\"color:blue;\"> As <\/span>clsTab\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon = Ribbons.Add(\"Main\")\r\n     <span style=\"color:blue;\">With<\/span> objRibbon\r\n         .StartFromScratch = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objTab = .Tabs.Add(\"Beispieltab\")\r\n         <span style=\"color:blue;\">With<\/span> objTab\r\n             .label = \"Beispieltab\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Ribbons.CreateStartRibbon \"Main\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Methode CreateRibbon f&uuml;llen Sie mit eigenen Anweisungen.<\/span><\/b><\/p>\n<p>Anschlie&szlig;end schauen wir uns an, ob diese Art der Ribbon-Definition auch wirklich funktioniert. Dazu schlie&szlig;en Sie die Access-Datei und &ouml;ffnen diese erneut, damit das <b>AutoExec<\/b>-Makro ausgef&uuml;hrt wird. Es reicht nicht aus, einfach das Makro auszuf&uuml;hren, da das Main-Ribbon m&ouml;glicherweise zu diesem Zeitpunkt schon installiert wurde und erneutes Anlegen zu einem Fehler f&uuml;hrt (dies k&ouml;nnen Sie durch erneutes Aufrufen des <b>AutoExec<\/b>-Makros ausprobieren). Beim erneuten &ouml;ffnen der Anwendung sollte nun die Ansicht aus Bild 6 erscheinen. Es funktioniert!<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_006.png\" alt=\"Das erste per VBA-Code erzeugte Ribbon\" width=\"424,7115\" height=\"480,9346\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Das erste per VBA-Code erzeugte Ribbon<\/span><\/b><\/p>\n<h2>Gruppen und Schaltfl&auml;chen hinzuf&uuml;gen<\/h2>\n<p>Nun gehen wir einen Schritt weiter und wollen dem <b>Tab<\/b>-Element eine Gruppe hinzuf&uuml;gen &#8211; und nat&uuml;rlich auch noch <b>Button<\/b>-Elemente. Die einfachste Variante sieht nun wie in Listing 2 aus. Sie sehen hier, dass wir ein weiteres Objekt des Typs <b>clsGroup <\/b>mit dem Variablennamen <b>obj-Group <\/b>deklariert haben. Dieses f&uuml;gen wir dann &uuml;ber die <b>Add<\/b>-Methode der <b>Groups<\/b>-Auflistung des <b>clsTab<\/b>-Objekts zum Ribbon hinzu. Auch dieses Objekt h&auml;lt eine Eigenschaft namens <b>label <\/b>bereit, mit der Sie die Beschriftung der Gruppe festlegen k&ouml;nnen. Diese legen wir hier mit dem Ausdruck <b>Beispielgruppe <\/b>fest.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CreateRibbon()\r\n     <span style=\"color:blue;\">Dim <\/span>objRibbon<span style=\"color:blue;\"> As <\/span>clsRibbon\r\n     <span style=\"color:blue;\">Dim <\/span>objTab<span style=\"color:blue;\"> As <\/span>clsTab\r\n     <span style=\"color:blue;\">Dim <\/span>objGroup<span style=\"color:blue;\"> As <\/span>clsGroup\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon = Ribbons.Add(\"Main\")\r\n     <span style=\"color:blue;\">With<\/span> objRibbon\r\n         .StartFromScratch = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objTab = .Tabs.Add(\"Beispieltab\")\r\n         <span style=\"color:blue;\">With<\/span> objTab\r\n             .label = \"Beispieltab\"\r\n             <span style=\"color:blue;\">Set<\/span> objGroup = .Groups.Add(\"Beispielgruppe\")\r\n             <span style=\"color:blue;\">With<\/span> objGroup\r\n                 .label = \"Beispielgruppe\"\r\n                 <span style=\"color:blue;\">Set<\/span> objButton1 = .Controls.Add(msoRibbonControlButton, \"Beispielbutton\")\r\n                 objButton1.label = \"Button 1\"\r\n                 <span style=\"color:blue;\">Set<\/span> objButton2 = .Controls.Add(msoRibbonControlButton, \"Beispielbutton1\")\r\n                 objButton2.label = \"Button 2\"\r\n             End <span style=\"color:blue;\">With<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Ribbons.CreateStartRibbon \"Main\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Anlegen eines Ribbons, diesmal mit einer Gruppe und zwei Schaltfl&auml;chen<\/span><\/b><\/p>\n<p>Danach folgen die beiden <b>Button<\/b>-Elemente: Das erste f&uuml;gen wir mit der Methode <b>Add <\/b>der Auflistung <b>Controls <\/b>des Objekts <b>objGroup <\/b>hinzu. Dabei geben wir als ersten Parameter den Wert <b>msoRibbonControlButton <\/b>an, was bewirkt, dass hier ein <b>Button<\/b>-Element angelegt wird. Mit dem zweiten Parameter &uuml;bergeben wir den Namen dieses <b>Button<\/b>-Elements. Danach legen wir wiederum mit der Eigenschaft <b>label <\/b>die Bezeichnung des <b>Button<\/b>-Elements fest.<\/p>\n<p>Wenn Sie aufgepasst haben, f&auml;llt Ihnen auf, dass die Prozedur gar keine Deklaration f&uuml;r die beiden Button-Elemente <b>objButton1 <\/b>und <b>objButton2 <\/b>enth&auml;lt.<\/p>\n<p>Das hat folgenden Grund: Unter anderem soll die Verwendung dieser L&ouml;sung daf&uuml;r sorgen, dass Sie richtige Ereignisprozeduren f&uuml;r die Steuerelemente des Ribbons hinterlegen k&ouml;nnen. Das hei&szlig;t, dass Sie die Ribbon-Elemente, die Ereignisse ausl&ouml;sen, mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklarieren und daf&uuml;r entsprechende Ereignisprozeduren anlegen k&ouml;nnen.<\/p>\n<p><!--30percent--><\/p>\n<p>Das gelingt, indem Sie zun&auml;chst die Deklaration im Kopf des Klassenmoduls vornehmen &#8211; f&uuml;r unsere beiden Schaltfl&auml;chen also wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objButton1<span style=\"color:blue;\"> As <\/span>clsButton\r\n<span style=\"color:blue;\">Dim <\/span>WithEvents objButton2<span style=\"color:blue;\"> As <\/span>clsButton<\/pre>\n<p>Dann verwenden Sie die beiden Kombinationsfelder im Kopf des Modulfensters und w&auml;hlen dort im linken Element den Namen des betroffenen Steuerelements, zum Beispiel <b>objButton1<\/b>, und im rechten den Eintrag <b>OnAction<\/b> aus. Dies legt dann automatisch die passende Ereignisprozedur an, die wir mit einer Test-Meldung f&uuml;llen (s. Bild 7):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_007.png\" alt=\"Deklarieren von Button-Elementen und Implementieren ihrer Ereignisse\" width=\"499,6607\" height=\"321,4429\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Deklarieren von Button-Elementen und Implementieren ihrer Ereignisse<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objButton1_OnAction(control<span style=\"color:blue;\"> As <\/span>RibbonControl)\r\n     <span style=\"color:blue;\">MsgBox<\/span> control.id\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>objButton2_OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     <span style=\"color:blue;\">MsgBox<\/span> control.id\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In dieser Prozedur k&ouml;nnen wir dann gleich den Verweis auf das entsprechende Steuerelement nutzen, der mit dem Parameter <b>control <\/b>geliefert wird.<\/p>\n<p>Dies bietet zum Beispiel mit der Eigenschaft <b>id <\/b>den Namen des angeklickten Steuerelements an, den wir hier gleich per Meldungsfenster ausgeben. Das Ergebnis des aktuellen Stands finden Sie in Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_008.png\" alt=\"Test der neuen Button-Elemente\" width=\"424,7115\" height=\"260,8037\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Test der neuen Button-Elemente<\/span><\/b><\/p>\n<h2>Gro&szlig;e Schaltfl&auml;chen mit Bildern<\/h2>\n<p>Nun wollen wir nat&uuml;rlich auch die optischen M&ouml;glichkeiten des Ribbons nutzen und die Schaltfl&auml;chen gr&ouml;&szlig;er und mit Bildern anzeigen. Die dazu ben&ouml;tigten Bilder f&uuml;gen Sie zur Systemtabelle <b>MSysResources <\/b>hinzu.<\/p>\n<p>Das gelingt am einfachsten, indem Sie ein Formular in der Entwurfsansicht &ouml;ffnen und dann im Ribbon den Eintrag <b>Entwurf|Steuerelemente|Bild einf&uuml;gen <\/b>anklicken. Hier erscheint dann ein Eintrag namens <b>Durchsuchen&#8230;<\/b>, mit dem Sie einen <b>Grafik einf&uuml;gen<\/b>-Dialog &ouml;ffnen k&ouml;nnen (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_009.png\" alt=\"Hinzuf&uuml;gen von Bildern zur Tabelle MSysResources\" width=\"649,559\" height=\"247,2753\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Hinzuf&uuml;gen von Bildern zur Tabelle MSysResources<\/span><\/b><\/p>\n<p>Damit f&uuml;gen Sie dann die Bilddateien hinzu &#8211; f&uuml;r kleine Schaltfl&auml;chen in der Gr&ouml;&szlig;e 16&#215;16, f&uuml;r gro&szlig;e Schaltfl&auml;chen in 32&#215;32. Wenn Sie zuvor nicht das Formular anklicken, werden die Bilddateien noch nicht einmal direkt zum Formular hinzugef&uuml;gt, sondern nur zur Tabelle <b>MSysResources<\/b>.<\/p>\n<p>Diese sieht dann etwa wie in Bild 10 aus. Die Definition passen wir nun wie folgt an:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_010.png\" alt=\"Bilder in der Tabelle MSysResources\" width=\"424,7115\" height=\"161,7554\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Bilder in der Tabelle MSysResources<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objButton1 = .Controls.Add( msoRibbonControlButton, \"Beispielbutton\")\r\n<span style=\"color:blue;\">With<\/span> objButton1\r\n     .label = \"Button 1\"\r\n     .Size = msoRibbonControlSizelarge\r\n     .image = \"add\"\r\nEnd <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">Set<\/span> objButton2 = .Controls.Add( msoRibbonControlButton, \"Beispielbutton1\")\r\n<span style=\"color:blue;\">With<\/span> objButton2\r\n     .label = \"Button 2\"\r\n     .Size = msoRibbonControlSizelarge\r\n     .image = \"close\"\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Wir haben hier erstens die Gr&ouml;&szlig;e der Schaltfl&auml;chen mit dem Wert <b>msoRibbonControlSizeLarge <\/b>f&uuml;r die Eigenschaft <b>Size <\/b>auf gro&szlig;e Icons umgestellt.<\/p>\n<p>Au&szlig;erdem haben wir der Eigenschaft <b>image <\/b>jeweils den Namen des anzuzeigenden Bildes hinzugef&uuml;gt. Das Ergebnis sieht dann wie in Bild 11 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_011.png\" alt=\"Anzeige benutzerdefinierter Bilder\" width=\"424,7115\" height=\"139,2354\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Anzeige benutzerdefinierter Bilder<\/span><\/b><\/p>\n<h2>Eingebaute Icons<\/h2>\n<p>Sie k&ouml;nnen auch eines der zahlreichen eingebauten Icons nutzen. Diese lassen sich per IntelliSense abrufen, wenn Sie die Eigenschaft <b>imageMso <\/b>verwenden (s. Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_012.png\" alt=\"Auswahl eingebauter Icons per IntelliSense\" width=\"499,6607\" height=\"246,3976\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Auswahl eingebauter Icons per IntelliSense<\/span><\/b><\/p>\n<p>Beachten Sie: Sie k&ouml;nnen nur eine der beiden Eigenschaften zum Anzeigen von Bildern verwenden, also entweder <b>image <\/b>oder <b>imageMso<\/b>.<\/p>\n<h2>Eigenschaften nutzen am Beispiel Ein-\/Ausblenden<\/h2>\n<p>Wenn Sie schon einmal ein Ribbon programmiert haben und eine einzelne Schaltfl&auml;che etwa in Abh&auml;ngigkeit von den angezeigten Daten ein- oder ausblenden wollten, wissen Sie, wie m&uuml;hselig das Programmieren dieser Elemente ist.<\/p>\n<p>Mit der hier vorgestellten L&ouml;sung ist dies wesentlich einfacher als mit der von Microsoft vorgesehenen Variante.<\/p>\n<p>Um von au&szlig;en etwa auf die Eigenschaft <b>Visible <\/b>einer der Schaltfl&auml;chen zuzugreifen, f&uuml;gen Sie der Klasse <b>Startribbon <\/b>einfach nur eine entsprechende <b>Property Get<\/b>-Prozedur je betroffenem Steuerelement hinzu &#8211; also etwa so:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>Button1()<span style=\"color:blue;\"> As <\/span>clsButton\r\n     <span style=\"color:blue;\">Set<\/span> Button1 = objButton1\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>Button2()<span style=\"color:blue;\"> As <\/span>clsButton\r\n     <span style=\"color:blue;\">Set<\/span> Button2 = objButton2\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Wichtig ist, dass Sie den Variablentyp <b>clsButton <\/b>f&uuml;r den R&uuml;ckgabewert angeben.<\/p>\n<p>Wenn Sie das Ribbon nun aktualisieren, indem Sie die Anwendung schlie&szlig;en und wieder &ouml;ffnen (das geht &uuml;brigens am schnellsten durch Aufruf der Funktion <b>Datenbank komprimieren und reparieren<\/b>), k&ouml;nnen Sie einmal das VBA-Fenster neben dem Access-Fenster platzieren und folgende Anweisung in das Direktfenster eingeben:<\/p>\n<pre>Startribbon.Button1.Enabled = <span style=\"color:blue;\">False<\/span><\/pre>\n<p>Damit deaktiveren Sie die erste Schaltfl&auml;che, die nun wie in Bild 13 ausgegraut erscheint. Sie k&ouml;nnen die Schaltfl&auml;che sogar ausblenden, indem Sie die Eigenschaft <b>Visible <\/b>auf <b>False <\/b>einstellen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_013.png\" alt=\"Steuerelemente aktivieren und deaktivieren\" width=\"424,7115\" height=\"137,2543\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Steuerelemente aktivieren und deaktivieren<\/span><\/b><\/p>\n<pre>Startribbon.Button1.visible = <span style=\"color:blue;\">False<\/span><\/pre>\n<p>Mit den folgenden beiden Anweisungen blenden Sie die Schaltfl&auml;che wieder ein und aktivieren diese:<\/p>\n<pre>Startribbon.Button1.Enabled = true\r\nStartribbon.Button1.visible = true<\/pre>\n<p>Das gelingt nat&uuml;rlich nicht nur vom Direktfenster aus, sondern auch etwa &uuml;ber die Ereignisprozeduren eines Formulars oder auch &uuml;ber die der Ribbon-Steuerelemente selbst. Statten wir doch die zweite Schaltfl&auml;che mit einer Prozedur aus, welche die erste Schaltfl&auml;che abwechselnd aktiviert und deaktiviert &#8211; je nachdem, welcher Zustand gerade vorherrscht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objButton2_OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     objButton1.Enabled = <span style=\"color:blue;\">Not<\/span> objButton1.Enabled\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Beispielaufrufe aus einem Formular heraus<\/h2>\n<p>Im Formular aus Bild 14 haben wir drei Schaltfl&auml;chen untergebracht, die alle &auml;nderungen an der aktuellen Konstellation des Ribbons vornehmen. Der Code hinter den Schaltfl&auml;chen sieht wie folgt aus. Neu ist hier insbesondere die M&ouml;glichkeit, das angezeigte Icon per Mausklick zu &auml;ndern:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_014.png\" alt=\"Steuern des Ribbons vom Formular aus\" width=\"499,6607\" height=\"372,7111\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Steuern des Ribbons vom Formular aus<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBilder_Click()\r\n     <span style=\"color:blue;\">If <\/span>Startribbon.Button1.Image = \"add\"<span style=\"color:blue;\"> Then<\/span>\r\n         Startribbon.Button1.Image = \"close\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Startribbon.Button1.Image = \"add\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdEnabled_Click()\r\n     Startribbon.Button1.Enabled = _\r\n         <span style=\"color:blue;\">Not<\/span> Startribbon.Button1.Enabled\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdVisible_Click()\r\n     Startribbon.Button1.Visible = _\r\n         <span style=\"color:blue;\">Not<\/span> Startribbon.Button1.Visible\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Praxistipps zum Startribbon<\/h2>\n<p>In der Praxis bietet das Startribbon immer die f&uuml;r das Aufrufen der Funktionen der Anwendung ben&ouml;tigten Schaltfl&auml;chen an. Gelegentlich gibt es noch weitere Steuerelemente wie etwa Kombinationsfelder oder auch Men&uuml;s, mit denen weitere Schaltfl&auml;chen angeboten werden k&ouml;nnen.<\/p>\n<p>Die aktuelle Version der hier vorgestellten L&ouml;sung bietet dies nicht an. Gegebenenfalls wird es jedoch eine erweiterte Fassung geben, die weitere Steuerelemente bereitstellt und auf <b>amvshop.de <\/b>erworben werden kann.<\/p>\n<p>Wenn Sie den Wunsch haben, direkt beim Start etwa je nach angemeldetem Benutzer bestimmte Steuerelemente zu aktivieren\/deaktivieren oder auch ein-\/auszublenden, legen Sie die ben&ouml;tigten Steuerelemente alle zun&auml;chst an und stellen dann beim Starten die Eigenschaften <b>Visible <\/b>und <b>Enabled <\/b>auf die gew&uuml;nschten Werte ein. Ein nachtr&auml;gliches, dynamisches Hinzuf&uuml;gen von Steuerelementen ist nicht m&ouml;glich.<\/p>\n<p>Diese Variante ist den Ribbons vorbehalten, die Sie zur Laufzeit in Zusammenhang mit der Anzeige von Formularen oder Berichten einblenden, wie die folgenden Abschnitte zeigen werden.<\/p>\n<h2>Ribbons f&uuml;r Formulare<\/h2>\n<p>Sobald Sie &uuml;ber das Startribbon ein Formular ge&ouml;ffnet haben, gibt es zwei M&ouml;glichkeiten: Entweder Sie behalten das aktuelle Ribbon bei, etwa weil das Formular keine weiteren Steuerelemente im Ribbon ben&ouml;tigt oder Sie zeigen ein eigenes Ribbon an, welches formularspezifische Steuerelemente anbietet.<\/p>\n<p>Wie dies gelingt, zeigt unser folgendes Beispiel. Dazu haben wir ein Formular namens <b>frmEinfachesBeispiel <\/b>erstellt, das wir nat&uuml;rlich &uuml;ber unser Hauptribbon &ouml;ffnen wollen. Bei der Gelegenheit haben wir dem Startribbon auch gleich einen Eintrag hinzugef&uuml;gt, mit dem die aktuelle Anwendung komprimiert werden kann, was die schnellste Methode ist, die Datenbank zu schlie&szlig;en und wieder zu &ouml;ffnen und somit die neue Ribbon-Definition bereitzustellen (siehe weiter unten).<\/p>\n<p>Das Ribbon sieht nun wie in Bild 15 aus. Die Erweiterung f&uuml;r die Schaltfl&auml;che zum &ouml;ffnen des Formulars in der Methode <b>CreateRibbon <\/b>der Klasse <b>StartRibbon <\/b>sieht so aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_016.png\" alt=\"Zwei neue Ribbon-Befehle\" width=\"424,7115\" height=\"143,3739\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Zwei neue Ribbon-Befehle<\/span><\/b><\/p>\n<pre>...\r\n<span style=\"color:blue;\">Set<\/span> objGroup = .Groups.Add(\"grpFormulare\")\r\n<span style=\"color:blue;\">With<\/span> objGroup\r\n     .Label = \"Formulare\"\r\n     <span style=\"color:blue;\">Set<\/span> objButtonForm = _\r\n         .Controls.Add(msoRibbonControlButton, _\r\n         \"btnfrmEinfachesBeispielOeffnen\")\r\n     <span style=\"color:blue;\">With<\/span> objButtonForm\r\n         .Label = \"frmEinfachesBeispiel &ouml;ffnen\"\r\n         .Size = msoRibbonControlSizelarge\r\n         .Image = \"form\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\nEnd <span style=\"color:blue;\">With<\/span>\r\n...<\/pre>\n<p>Die Methode, die durch das Anklicken dieser Schaltfl&auml;che ausgel&ouml;st werden soll, sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ButtonForm()<span style=\"color:blue;\"> As <\/span>clsButton\r\n     <span style=\"color:blue;\">Set<\/span> ButtonForm = objButtonForm\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Auch hier m&uuml;ssen Sie nat&uuml;rlich wieder eine entsprechende Objektvariable deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objButtonForm<span style=\"color:blue;\"> As <\/span>clsButton<\/pre>\n<p>Au&szlig;erdem f&uuml;gen wir die Ereignisprozedur hinzu, die beim Anklicken des Buttons ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objButtonForm_OnAction(control<span style=\"color:blue;\"> As <\/span>_\r\n         Office.IRibbonControl)\r\n     DoCmd.OpenForm \"frmEinfachesBeispiel\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Ribbon mit Formular anzeigen<\/h2>\n<p>Dies zeigt dann das Formular wie in Bild 16 an. Hier erkennen Sie auch gleich das Ribbon, das beim Einblenden des Formulars automatisch erstellt und mit eingeblendet wird. Damit das Ribbon beim Laden des Formulars eingeblendet wird, legen Sie die folgende Prozedur an, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_018.png\" alt=\"Ribbon, das gleichzeitig mit einem Formular eingeblendet wird\" width=\"599,593\" height=\"412,1671\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Ribbon, das gleichzeitig mit einem Formular eingeblendet wird<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     CreateRibbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die hier aufgerufene Methode finden Sie in Listing 3. Sie deklariert wieder die f&uuml;r die Erstellung ben&ouml;tigten Variablen f&uuml;r Objekte der Typen <b>clsRibbon<\/b>, <b>clsTab <\/b>und <b>clsGroup<\/b>. Dann erstellt sie ein neues Ribbon namens <b>Formularribbon<\/b> (dies entspricht auch gleichzeitig der im Reiter angezeigten Bezeichnung). Das Ribbon-Objekt erh&auml;lt f&uuml;r die Eigenschaft <b>StartFromScratch <\/b>wieder den Wert <b>True<\/b>, damit die eingebauten Steuerelemente des Ribbons ausgeblendet werden. Dann f&uuml;gt die Prozedur einen neuen Tab namens <b>tabFormularribbon <\/b>hinzu und legt darunter eine Gruppe namens <b>grpFormularfunktionen <\/b>an.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>CreateRibbon()\r\n     <span style=\"color:blue;\">Dim <\/span>objRibbon<span style=\"color:blue;\"> As <\/span>clsRibbon\r\n     <span style=\"color:blue;\">Dim <\/span>objTab<span style=\"color:blue;\"> As <\/span>clsTab\r\n     <span style=\"color:blue;\">Dim <\/span>objGroup<span style=\"color:blue;\"> As <\/span>clsGroup\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon = Ribbons.Add(\"Formularribbon\")\r\n     <span style=\"color:blue;\">With<\/span> objRibbon\r\n         .StartFromScratch = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objTab = .Tabs.Add(\"tabFormularribbon\")\r\n         <span style=\"color:blue;\">With<\/span> objTab\r\n             .Label = \"Formularribbon\"\r\n             <span style=\"color:blue;\">Set<\/span> objGroup = .Groups.Add(\"grpFormularfunktionen\")\r\n             <span style=\"color:blue;\">With<\/span> objGroup\r\n                 .Label = \"Formularfunktionen\"\r\n                 <span style=\"color:blue;\">Set<\/span> objButtonClose = ._\r\n                     Controls.Add(msoRibbonControlButton, \"btnFormularSchliessen\")\r\n                 <span style=\"color:blue;\">With<\/span> objButtonClose\r\n                     .Label = \"Formular schlie&szlig;en\"\r\n                     .Size = msoRibbonControlSizelarge\r\n                     .Image = \"close\"\r\n                 End <span style=\"color:blue;\">With<\/span>\r\n             End <span style=\"color:blue;\">With<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me.RibbonName = Ribbons.GetRibbon(\"Formularribbon\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Anlegen eines Ribbons f&uuml;r ein Formular<\/span><\/b><\/p>\n<p>Die Gruppe erh&auml;lt die Beschriftung <b>Formularfunktionen <\/b>sowie eine neue Schaltfl&auml;che namens <b>btnFormularSchliessen <\/b>mit der Beschriftung <b>Formular schlie&szlig;en<\/b>. Die Gr&ouml;&szlig;e der Schaltfl&auml;che stellen wir wieder auf <b>msoRibbonControlSizeLarge <\/b>und somit auf gro&szlig; ein. Dann f&uuml;gen wir ein Icon mit einem <b>Schlie&szlig;en<\/b>-Symbol und dem Namen <b>close.png<\/b> zur Tabelle <b>USysResources <\/b>hinzu und stellen die Eigenschaft <b>Image <\/b>auf den Namen des Eintrags in der Tabelle ein (hier <b>close<\/b>).<\/p>\n<p>Diesmal rufen wir nicht einfach die Methode <b>GetRibbon <\/b>der Klasse <b>Ribbons <\/b>auf, sondern weisen das Ergebnis dieser Methode gleichzeitig der Eigenschaft <b>RibbonName <\/b>des Formulars zu. <b>GetRibbon <\/b>erstellt n&auml;mlich nicht nur das Ribbon, sondern liefert auch gleichzeitig den in der Anwendung hinterlegten Namen des Ribbons zur&uuml;ck. F&uuml;r die einzige Schaltfl&auml;che des Ribbons definieren wir die folgende Variable:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objButtonClose<span style=\"color:blue;\"> As <\/span>clsButton<\/pre>\n<p>Beim Anklicken der Schaltfl&auml;che soll die folgende Ereignisprozedur ausgel&ouml;st werden, welche das aktuelle Formular schlie&szlig;t:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objButtonClose_OnAction(control<span style=\"color:blue;\"> As <\/span>_\r\n         Office.IRibbonControl)\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Und auch hier stellen wir mit einer <b>Property Get<\/b>-Methode den Zugriff auf das Steuerelement bereit, um es ein- oder ausblenden beziehungsweise aktivieren oder deaktivieren zu k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ButtonClose()<span style=\"color:blue;\"> As <\/span>clsButton\r\n     <span style=\"color:blue;\">Set<\/span> ButtonClose = objButtonClose\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<h2>Komprimieren-Schaltfl&auml;che<\/h2>\n<p>Die <b>Komprimieren<\/b>-Schaltfl&auml;che ist eine Schaltfl&auml;che mit einer eingebauten Access-Funktion. Diese k&ouml;nnen wir anlegen, indem wir den zweiten Parameter der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung des <b>Group<\/b>-Elements auslassen und stattdessen den dritten Parameter nutzen. Im VBA-Editor unterst&uuml;tzt uns IntelliSense dabei, die passende Konstante anzugeben, in diesem Fall <b>msoFileCompactAndRepairDatabase<\/b> (s. Bild 17).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_017.png\" alt=\"IntelliSense-Unterst&uuml;tzung beim Anlegen eingebauter Steuerelemente\" width=\"700\" height=\"185,065\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: IntelliSense-Unterst&uuml;tzung beim Anlegen eingebauter Steuerelemente<\/span><\/b><\/p>\n<p>Der Code f&uuml;r dieses Element in der <b>CreateRibbon<\/b>-Methode der Klasse <b>StartRibbon <\/b>sieht so aus:<\/p>\n<pre>...\r\n<span style=\"color:blue;\">Set<\/span> objGroup = .Groups.Add(\"grpTools\")\r\n<span style=\"color:blue;\">With<\/span> objGroup\r\n     .Label = \"Tools\"\r\n     <span style=\"color:blue;\">Set<\/span> objButtonCompact = _\r\n         .Controls.Add(msoRibbonControlButton, , \r\n         msoFileCompactAndRepairDatabase)\r\n     <span style=\"color:blue;\">With<\/span> objButtonCompact\r\n         .Size = msoRibbonControlSizelarge\r\n     End <span style=\"color:blue;\">With<\/span>\r\nEnd <span style=\"color:blue;\">With<\/span>\r\n...<\/pre>\n<p>F&uuml;r diese Schaltfl&auml;che legen wir auch eine Objektvariable an, aber diese soll keine Ereignisse ausl&ouml;sen k&ouml;nnen. Wir ben&ouml;tigen also das Schl&uuml;sselwort <b>WithEvents <\/b>nicht:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objButtonCompact<span style=\"color:blue;\"> As <\/span>clsButton<\/pre>\n<p>Es handelt sich ja um ein eingebautes Element, das sein Ereignis automatisch ausl&ouml;st. Wir brauchen also keine Ereignisprozedur zu implementieren. Wozu aber ben&ouml;tigen wir die Variable Ganz einfach: Um eine <b>Property Get<\/b>-Prozedur zu definieren, mit der wir von au&szlig;en auf den Button zugreifen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ButtonCompact()<span style=\"color:blue;\"> As <\/span>clsButton\r\n     <span style=\"color:blue;\">Set<\/span> ButtonCompact = objButtonCompact\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Immerhin wollen wir dieses Element ja auch ein- oder ausblenden k&ouml;nnen &#8211; oder dieses aktivieren oder deaktivieren.<\/p>\n<h2>Zur Strukturierung: Trenner<\/h2>\n<p>Ein weiteres Element, das Sie mit den Ribbon-Klassen der hier vorgestellten L&ouml;sung nutzen k&ouml;nnen, ist der sogenannte <b>Separator<\/b>.<\/p>\n<p>Er erlaubt es, mehrere andere Steuerelemente voneinander zu trennen und das Ribbon somit auch innerhalb einer Gruppe &uuml;bersichtlicher zu gestalten.<\/p>\n<p>Solche Separator-Elemente f&uuml;gen Sie mit der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung unter Verwendung des Wertes <b>msoRibbonControlSeparator <\/b>als ersten Parameter zum Ribbon hinzu, wie folgendes Beispiel zeigt:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objGroup = .Groups.Add(\"grpSeparator\")\r\n<span style=\"color:blue;\">With<\/span> objGroup\r\n     .Label = \"Beispiel f&uuml;r Separatoren\"\r\n     <span style=\"color:blue;\">Set<\/span> objButtonCompact = _\r\n         .Controls.Add(msoRibbonControlButton, , _\r\n         msoFileCompactAndRepairDatabase)\r\n     <span style=\"color:blue;\">With<\/span> objButtonCompact\r\n         .Size = msoRibbonControlSizelarge\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     .Controls.Add msoRibbonControlSeparator, \"sep1\"\r\n     <span style=\"color:blue;\">Set<\/span> objButton3 = _\r\n         .Controls.Add(msoRibbonControlButton, , _\r\n         msoAccessFormDatasheet)\r\n     objButton3.Size = msoRibbonControlSizelarge\r\n     .Controls.Add msoRibbonControlSeparator, \"sep2\"\r\n     <span style=\"color:blue;\">Set<\/span> objButton4 = _\r\n         .Controls.Add(msoRibbonControlButton, , _\r\n         msoAccessFormModalDialog)\r\n     objButton4.Size = msoRibbonControlSizelarge\r\n     .Controls.Add msoRibbonControlSeparator, \"sep3\"\r\n     <span style=\"color:blue;\">Set<\/span> objButton5 = _\r\n         .Controls.Add(msoRibbonControlButton, , _\r\n         msoAccessFormWizard)\r\n     objButton5.Size = msoRibbonControlSizelarge\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Das Ergebnis sieht dann etwa wie in Bild 18 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1069_019.png\" alt=\"Beispiel f&uuml;r den Einsatz von Separatoren\" width=\"649,559\" height=\"141,0927\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Beispiel f&uuml;r den Einsatz von Separatoren<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit den hier vorgestellten Klassen und Techniken k&ouml;nnen Sie einfache Ribbons zusammenstellen, ohne auch nur eine Zeile XML-Code zu schreiben, der normalerweise f&uuml;r die Definition von Ribbons n&ouml;tig ist.<\/p>\n<p>Stattdessen verwenden Sie eine Reihe einfacher Klassen mit ihren Eigenschaften, Methoden und Ereignissen.<\/p>\n<p>Das hier vorgestellte Set von Ribbon-Klassen erlaubt den Einsatz von <b>Tab<\/b>-, <b>Group<\/b>&#8211; und <b>Button<\/b>-Elementen. Dies sind die meistverwendeten Elemente im Ribbon &#8211; andere werden kaum genutzt, da Elemente wie Kombinationsfelder, Men&uuml;s et cetera meist direkt in den jeweiligen Formularen abgebildet werden.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Ribbonklassen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/C04D4930-1C02-4B2D-87DC-A6BA95308164\/aiu_1069.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Ribbon l&auml;sst sich normalerweise nur definieren, indem Sie den XML-Code zur Beschreibung des Ribbons festlegen, in einer bestimmten Tabelle speichern und die dortigen Eintr&auml;ge dann als Anwendungsribbon nutzen oder bestimmten Formularen oder Berichten zuweisen. Mit hier vorgestellten Klassen k&ouml;nnen Sie das Ribbon von nun an ganz einfach per VBA zusammenstellen und etwa Formularen oder Berichten zuweisen.<\/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":[66012017,662017,44000028],"tags":[],"class_list":["post-55001069","post","type-post","status-publish","format-standard","hentry","category-66012017","category-662017","category-Ergonomie_und_Benutzeroberflaeche"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ribbonklassen - 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\/Ribbonklassen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ribbonklassen\" \/>\n<meta property=\"og:description\" content=\"Das Ribbon l&auml;sst sich normalerweise nur definieren, indem Sie den XML-Code zur Beschreibung des Ribbons festlegen, in einer bestimmten Tabelle speichern und die dortigen Eintr&auml;ge dann als Anwendungsribbon nutzen oder bestimmten Formularen oder Berichten zuweisen. Mit hier vorgestellten Klassen k&ouml;nnen Sie das Ribbon von nun an ganz einfach per VBA zusammenstellen und etwa Formularen oder Berichten zuweisen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:40:47+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/e4d231a242dc42f5915b5b3f3bd7c94a\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ribbonklassen\",\"datePublished\":\"2020-05-14T13:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/\"},\"wordCount\":3141,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e4d231a242dc42f5915b5b3f3bd7c94a\",\"articleSection\":[\"1\\\/2017\",\"2017\",\"Ergonomie und Benutzeroberfl\u00e4che\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/\",\"name\":\"Ribbonklassen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e4d231a242dc42f5915b5b3f3bd7c94a\",\"datePublished\":\"2020-05-14T13:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e4d231a242dc42f5915b5b3f3bd7c94a\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e4d231a242dc42f5915b5b3f3bd7c94a\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonklassen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ribbonklassen\"}]},{\"@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":"Ribbonklassen - 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\/Ribbonklassen\/","og_locale":"de_DE","og_type":"article","og_title":"Ribbonklassen","og_description":"Das Ribbon l&auml;sst sich normalerweise nur definieren, indem Sie den XML-Code zur Beschreibung des Ribbons festlegen, in einer bestimmten Tabelle speichern und die dortigen Eintr&auml;ge dann als Anwendungsribbon nutzen oder bestimmten Formularen oder Berichten zuweisen. Mit hier vorgestellten Klassen k&ouml;nnen Sie das Ribbon von nun an ganz einfach per VBA zusammenstellen und etwa Formularen oder Berichten zuweisen.","og_url":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:40:47+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/e4d231a242dc42f5915b5b3f3bd7c94a","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ribbonklassen","datePublished":"2020-05-14T13:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/"},"wordCount":3141,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/e4d231a242dc42f5915b5b3f3bd7c94a","articleSection":["1\/2017","2017","Ergonomie und Benutzeroberfl\u00e4che"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/","url":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/","name":"Ribbonklassen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/e4d231a242dc42f5915b5b3f3bd7c94a","datePublished":"2020-05-14T13:40:47+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ribbonklassen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/e4d231a242dc42f5915b5b3f3bd7c94a","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/e4d231a242dc42f5915b5b3f3bd7c94a"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ribbonklassen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ribbonklassen"}]},{"@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\/55001069","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=55001069"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001069\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001069"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001069"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001069"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}