{"id":55001093,"date":"2017-08-01T00:00:00","date_gmt":"2020-05-13T21:26:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1093"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"COMAddInRibbons_mit_dem_XMLDesigner","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/","title":{"rendered":"COM-Add-In-Ribbons mit dem XML-Designer"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/d58d8d11450041108f7d9babacc7f7ae\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie in Visual Studio ein COM-Add-In f&uuml;r Access erstellen (wie im Beitrag &#8222;Access-Add-In mit VSTO&#8220;), k&ouml;nnen Sie zwei M&ouml;glichkeiten nutzen, um Ribbons f&uuml;r das Add-In hinzuzuf&uuml;gen. Der erste Weg nutzt einen grafischen Editor und wird bereits im genannten Beitrag beschrieben. Allerdings erlaubt dieser nicht, alle verf&uuml;gbaren Elemente und Techniken zu nutzen. Genau genommen k&ouml;nnen Sie damit nur Tabs, Groups und die darin enthaltenen Steuer-elemente hinzuf&uuml;gen. Wenn Sie, wie Sie es von Access gewohnt sind, in die Vollen gehen wollen und etwa auch das Backstage anpassen oder eingebaute Ribbon-Schaltfl&auml;chen mit neuen Funktionen versehen wollen, finden Sie im vorliegenden Artikel die richtigen Techniken.<\/b><\/p>\n<h2>Voraussetzungen<\/h2>\n<p>Um die in diesem Beitrag beschriebenen Techniken verwenden zu k&ouml;nnen, ben&ouml;tigen Sie ein COM-Add-In, das mit Access gestartet wird. Die Grundlagen dazu finden Sie im Beitrag <b>Access-Add-In mit VSTO <\/b>(<b>www.access-im-unternehmen.de\/1092<\/b>). Der Beitrag beschreibt die Vorgehensweise f&uuml;r C#, Sie finden im Download aber auch ein f&uuml;r den Einsatz mit Access angepasstes COM-Add-In-Projekt. Auf diesem setzt dieser Beitrag auf. Au&szlig;erdem verwenden wir Visual Studio 2015 in der Community Edition, die f&uuml;r einzelne Entwickler kostenlos verf&uuml;gbar ist.<\/p>\n<h2>Hinweis<\/h2>\n<p>Alle wichtigen Grundlagen und Informationen sowie Listen der Callback-Funktionen f&uuml;r den Backstage-Bereich des Ribbons finden Sie auf der Internetseite mit dem Titel Einf&uuml;hrung in die Office 2010-Backstage-Ansicht f&uuml;r Entwickler (aktueller LInk: <b>https:\/\/msdn.microsoft.com\/de-de\/library\/ee691833(office.14).aspx<\/b>).<\/p>\n<p>Die Grundlagen f&uuml;r den Ribbon-Teil finden Sie unter dem Titel <b>Anpassen der Multifunktionsleisten-Benutzeroberfl&auml;che von Office (2007) f&uuml;r Entwickler &#8211; Teil 1 <\/b>und den folgenden Teilen (aktueller Link: <b>https:\/\/msdn.microsoft.com\/de-de\/library\/aa338202.aspx<\/b>).<\/p>\n<h2>Ribbon zum Add-In hinzuf&uuml;gen<\/h2>\n<p>Wie bereits erw&auml;hnt, gibt es zwei M&ouml;glichkeiten, ein Ribbon zu einem COM-Add-In auf Basis der VSTO-Vorlagen hinzuzuf&uuml;gen. Der erste Eintrag namens <b>Men&uuml;band (Visueller Designer) <\/b>liefert einen Designer, mit dem Sie das Ribbon per Drag and Drop aus der Toolbox zusammenstellen k&ouml;nnen. Daf&uuml;r stehen aber nur die wichtigsten Elemente zur Verf&uuml;gung. Wer bereits unter Access Ribbons definiert hat, wird hier einiges vermissen. In diesem Fall w&auml;hlt man besser den Eintrag <b>Men&uuml;band (XML) <\/b>und gibt beispielsweise den Namen <b>Ribbon_Access.vb <\/b>an (s. Bild 1). Dies f&uuml;gt zwei Klassen namens <b>Ribbon_Access.vb <\/b>und <b>Ribbon_Access.xml <\/b>zum Projekt hinzu.  Damit die in der Datei <b>Ribbon_Access.xml <\/b>enthaltene Ribbon-Definition auf die Host-Anwendung, in diesem Fall Access, angewendet wird, kopieren Sie die noch auskommentierte Methode <b>CreateRibbonExtensibilityObject <\/b>aus dem Modul <b>Ribbon_Access.vb <\/b>in das Klassenmodul <b>ThisAddIn.vb <\/b>und entfernen die Kommentarzeichen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_1093_001.png\" alt=\"Hinzuf&uuml;gen eines Ribbons mit der Vorlage Men&uuml;band (XML)\" width=\"649,559\" height=\"330,3727\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen eines Ribbons mit der Vorlage Men&uuml;band (XML)<\/span><\/b><\/p>\n<pre>Protected Overrides Function _\r\n         CreateRibbonExtensibilityObject() _\r\n        <span style=\"color:blue;\"> As <\/span>Microsoft.Office.Core.IRibbonExtensibility\r\n     Return <span style=\"color:blue;\">New<\/span> Ribbon_Access()\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Diese Methode wird beim Starten des Add-Ins automatisch ausgef&uuml;hrt.<\/p>\n<p>Die XML-Definition des Ribbons sieht standardm&auml;&szlig;ig wie folgt aus:<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"UTF-8\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" onLoad=\"Ribbon_Load\"&gt;\r\n   &lt;ribbon&gt;\r\n     &lt;tabs&gt;\r\n       &lt;tab idMso=\"TabAddIns\"&gt;\r\n         &lt;group id=\"MyGroup\"\r\n                label=\"My Group\"&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>Wenn Sie das Add-In nun starten, erscheinen allerdings keine neuen Elemente im Ribbon von Access. Der Grund ist einfach: Die automatisch erstellte Ribbon-Definition aus der Datei <b>Ribbon_Access.xml <\/b>versucht, eine Gruppe unterhalb eines <b>Tab<\/b>-Elements mit der <b>idMso <\/b>mit dem Wert <b>TabAddIns <\/b>anzulegen. Warum wird dieses Tab dann von der Vorlage als Ausgangspunkt f&uuml;r die Ribbon-Definition festgelegt Ganz einfach: Weil es offiziell gar keine VSTO-Vorlage f&uuml;r Access-Add-Ins gibt, haben wir ja, wie im Beitrag <b>Access-Add-In mit VSTO <\/b>beschrieben, ein Excel-Add-In in ein Access-Add-In umgewandelt. Und unter Excel gibt es sehr wohl ein Ribbon-Tab namens <b>TabAddIns<\/b>. Wenn wir also einfach das eingebaute <b>group<\/b>-Element <b>TabAddIns <\/b>durch ein benutzerdefiniertes Element ersetzen, sollte es funktionieren.<\/p>\n<h2>Benutzerdefiniertes Tab mit Gruppe und Schaltfl&auml;che hinzuf&uuml;gen<\/h2>\n<p>Ein eingebautes <b>tab<\/b>-Element verwendet die f&uuml;r dieses Element festgelegte <b>idMso <\/b>(&uuml;bersicht der idMsos f&uuml;r alle Elemente siehe Datei <b>AccessControl.xlsx <\/b>aus dem Download von der Seite <b>http:\/\/go.microsoft.com\/fwlink\/LinkID=181052<\/b>), um festzulegen, dass die darunter abgebildeten <b>group<\/b>-Elemente unterhalb des eingebauten Elements mit der angegebenen <b>idMso <\/b>angelegt werden sollen. Gegebenenfalls m&ouml;chten Sie auch noch Elemente in eine eingebaute Gruppe einf&uuml;gen, dann w&uuml;rden Sie auch f&uuml;r die Gruppe die entsprechende <b>idMso <\/b>angeben.<\/p>\n<p>Wir wollen aber ein neues <b>tab<\/b>-Element erstellen, weshalb wir nicht die Eigenschaft <b>idMso <\/b>angeben, sondern mit <b>id <\/b>den Namen unseres benutzerdefinierten Elements. Dieses soll <b>tabAddIn <\/b>hei&szlig;en. Darunter wollen wir zwei Gruppen anlegen, die jeweils eine Schaltfl&auml;che enthalten. Die erste Gruppe soll Befehle erhalten, die sich auf die Access-Anwendung selbst beziehen, die zweite Befehle, die sich auf die aktuell ge&ouml;ffnete Datenbank beziehen. F&uuml;r den zweiten Teil arbeiten wir im Beitrag <b>Datenzugriff per VSTO-Add-In <\/b>(<b>www.access-im-unternehmen.de\/1094<\/b>) noch eine L&ouml;sung heraus, mit der wir daf&uuml;r sorgen k&ouml;nnen, dass die Elemente der zweiten Gruppe nur aktiviert sind, wenn Access gerade eine Datenbankanwendung geladen hat. Die Definition unseres Ribbons sieht somit wie in Listing 1 aus.<\/p>\n<p><!--30percent--><\/p>\n<p>Wenn wir das Add-In nun starten, sollten die neuen Elemente in Access wie in Bild 2 erscheinen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_1093_002.png\" alt=\"Die neuen Ribbon-Elemente im Tab COM-Add-In\" width=\"649,559\" height=\"163,4175\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die neuen Ribbon-Elemente im Tab COM-Add-In<\/span><\/b><\/p>\n<h2>Prozedur f&uuml;r die Buttons anlegen<\/h2>\n<p>Wir legen nun zun&auml;chst eine Prozedur an, die durch einen Klick auf eine der Schaltfl&auml;chen ausgel&ouml;st wird. Wie unter Access haben wir in der XML-Definition des Ribbons mit dem Attribut <b>onAction <\/b>den Namen der aufzurufenden Methode angegeben, in diesem Fall <b>onAction<\/b>.<\/p>\n<p>Die Signatur der verschiedenen Callback-Funktionen, die hier nicht beschrieben werden, finden Sie in den weiter oben unter Hinweis angegebenen Quellen. Wir wollen zun&auml;chst einfach nur den Namen des aufrufenden Steuer-elements in einem Meldungsfenster ausgeben. Dazu f&uuml;gen Sie dem Klassenmodul <b>Ribbon_Access.vb <\/b>zun&auml;chst den Verweis auf folgenden Namespace hinzu:<\/p>\n<pre>Imports System.Windows.Forms<\/pre>\n<p>Danach legen wir in der Klasse <b>Ribbon_Access.vb <\/b>in dem Bereich, der mit <b>#Region &#8222;Men&uuml;bandr&uuml;ckrufe&#8220; <\/b>gekennzeichnet ist, die folgende Methode an:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     MessageBox.Show(control.Id.ToString())\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn Sie das Add-In nun zum Debuggen starten und auf eine der beiden Schaltfl&auml;chen klicken, erscheint die entsprechende <b>MessageBox<\/b>. Wir wollen nun eine <b>Select Case<\/b>-Bedingung einbauen, die pr&uuml;ft, welche Schaltfl&auml;che die Methode ausgel&ouml;st hat, und davon abh&auml;ngig entweder den Text <b>Anwendungsbefehl <\/b>oder <b>Datenbankbefehl <\/b>ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>onAction(ctl<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     Select Case ctl.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnAnwendungsbefehl\"\r\n             MessageBox.Show(\"Anwendungsbefehl\")\r\n         <span style=\"color:blue;\">Case <\/span>\"btnDatenbankbefehl\"\r\n             MessageBox.Show(\"Datenbankbefehl\")\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit h&auml;tten wir schon einmal die grundlegende Funktion des Ribbons gekl&auml;rt &#8211; die Anzeige von Schaltfl&auml;chen und deren Implementierung.<\/p>\n<h2>Bilder im Ribbon<\/h2>\n<p>Nun schauen wir uns an, wie Sie unter Visual Studio benutzerdefinierte Bilder f&uuml;r die Schaltfl&auml;chen hinterlegen. Dazu &ouml;ffnen Sie die Datei <b>My Project <\/b>aus dem Projektmappen-Explorer. Dies zeigt die Eigenschaften des Projekts an, wobei wir &uuml;ber den Eintrag <b>Ressourcen <\/b>in der Navigation auf der linken Seite zum gleichnamigen Bereich gelangen (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_1093_003.png\" alt=\"Hinzuf&uuml;gen von Bildern als Ressource des Add-In-Projekts\" width=\"649,559\" height=\"341,664\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen von Bildern als Ressource des Add-In-Projekts<\/span><\/b><\/p>\n<p>Hier sehen Sie oben die Schaltfl&auml;che <b>Ressource hinzuf&uuml;gen<\/b>. Klicken Sie auf den Pfeil nach unten rechts neben der Schaltfl&auml;che, um das Men&uuml; aus Bild 4 zu &ouml;ffnen. Hier w&auml;hlen Sie den Eintrag <b>Vorhandene Datei hinzuf&uuml;gen&#8230; <\/b>aus. Dies &ouml;ffnet den Dialog <b>Vorhandene Datei zu Ressourcen hinzuf&uuml;gen<\/b>, mit dem Sie eine oder mehrere Dateien ausw&auml;hlen k&ouml;nnen. Die ausgew&auml;hlten Dateien, etwa vom Datentyp <b>.png<\/b>, werden dann anschlie&szlig;end in dem freien Bereich angezeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_1093_004.png\" alt=\"Starten des Dialogs zum Hinzuf&uuml;gen von Bildern\" width=\"549,6265\" height=\"226,8922\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Starten des Dialogs zum Hinzuf&uuml;gen von Bildern<\/span><\/b><\/p>\n<p>Wenn Sie die Ribbon-Schaltfl&auml;che in der kleinen Gr&ouml;&szlig;e anzeigen wollen, verwenden Sie Bilddateien der Gr&ouml;&szlig;e 16&#215;16 Pixel, sonst 32&#215;32 Pixel.<\/p>\n<p>Damit ist dieser Teil der Arbeit abgeschlossen und wir wenden uns der Klasse <b>Ribbon_Access.xml <\/b>zu. Hier nehmen wir zur Anzeige der Bilder ein paar kleine &auml;nderungen vor. Als Erstes erg&auml;nzen wir das <b>customUI<\/b>-Element um das Attribut <b>loadImage<\/b>, welches wir mit dem Wert <b>loadImage <\/b>f&uuml;llen:<\/p>\n<pre>&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" onLoad=\"Ribbon_Load\" loadImage=\"loadImage\"&gt;<\/pre>\n<p>Dies sorgt daf&uuml;r, dass beim Anzeigen des jeweiligen Elements gepr&uuml;ft wird, ob es ein Attribut namens <b>image <\/b>mit der Angabe einer Bilddatei enth&auml;lt. Dieses f&uuml;gen wir wie folgt zu den beiden <b>button<\/b>-Elementen hinzu:<\/p>\n<pre>&lt;button id=\"btnAnwendungsbefehl\" label=\"Anwendungsbefehl\" onAction=\"onAction\" image=\"data\" size=\"large\"\/&gt;\r\n&lt;button id=\"btnDatenbankbefehl\" label=\"Datenbankbefehl\" onAction=\"onAction\" image=\"window_dialog\" size=\"large\"\/&gt;<\/pre>\n<p>Au&szlig;erdem stellen wir mit dem Attribut <b>size <\/b>auch noch die Gr&ouml;&szlig;e der beiden Schaltfl&auml;chen auf <b>large <\/b>ein.<\/p>\n<p>Damit fehlt nun noch die Methode <b>loadImage <\/b>in der Klasse <b>Ribbon_Access.vb<\/b>. Diese sieht dank der eingebauten Funktionen von .NET viel einfacher aus als es unter Access\/VBA der Fall ist. Dies ist der komplette Code, den Sie ben&ouml;tigen:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>loadImage(ByVal imageId<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Bitmap\r\n     Return My.Resources.ResourceManager.GetObject(imageId)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Einzig der Namespace <b>System.Drawing <\/b>wird noch ben&ouml;tigt, da es sich bei dem von der Funktion zur&uuml;ckgegebenen Wert um ein Element des Typs <b>Bitmap <\/b>handelt. Damit k&ouml;nnen wir auch schon zum n&auml;chsten Test des Add-Ins schreiten, welches das Ribbon-Tab COM-Add-In der noch zu &ouml;ffnenden Access-Anwendung wie in Bild 5 aussehen l&auml;sst.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_1093_005.png\" alt=\"Die beiden neuen Schaltfl&auml;chen mit h&uuml;bschen Bildern\" width=\"649,559\" height=\"147,3322\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die beiden neuen Schaltfl&auml;chen mit h&uuml;bschen Bildern<\/span><\/b><\/p>\n<h2>Aktivieren\/deaktivieren von Schaltfl&auml;chen<\/h2>\n<p>Eine weitere wichtige Funktion ist das Aktivieren oder Deaktivieren von Schaltfl&auml;chen. Dies erledigen wir grunds&auml;tzlich wie unter Access\/VBA, allerdings gibt es wenige kleine Unterschiede. Der Einfachheit halber wollen wir daf&uuml;r sorgen, dass Sie die Schaltfl&auml;che <b>btnAnwendungsbefehl <\/b>mit einem Klick auf die Schaltfl&auml;che <b>btnDatenbankbefehl <\/b>deaktivieren und diese mit einem weiteren Klick wieder aktivieren k&ouml;nnen.<\/p>\n<p>Der erste Schritt ist eine weitere Erweiterung des Elements <b>btnDatenbankbefehl<\/b>, diesmal um das Attribut <b>getEnabled<\/b>:<\/p>\n<pre>&lt;button id=\"btnDatenbankbefehl\" label=\"Datenbankbefehl\" onAction=\"onAction\" image=\"window_dialog\" size=\"large\" getEnabled=\"getEnabled\"\/&gt;<\/pre>\n<p>Dies ist ein Callback-Attribut, das seinen Wert jedesmal, wenn das entsprechende Element angezeigt wird, erneut abfragt. Au&szlig;erdem k&ouml;nnen wir die erneute Abfrage des Wertes auch provozieren. Ob die Schaltfl&auml;che <b>btnDatenbankbefehl<\/b> aktiviert oder deaktiviert sein soll, speichern wir in der Variablen <b>bolDatenbankbefehl_Enabled<\/b>, die wir wie folgt deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>bolDatenbankbefehl_Enabled<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Wenn die Schaltfl&auml;che angezeigt wird, l&ouml;st das die f&uuml;r das Attribut angegebene Methode <b>GetEnabled <\/b>aus, welche einen <b>Boolean<\/b>-Wert zur&uuml;ckliefern soll. Diese Methode sieht wie in Listing 2 aus. Sie erh&auml;lt mit dem Parameter <b>control <\/b>wie auch durch die f&uuml;r das Attribut <b>onAction <\/b>angegebene Prozedur einen Verweis auf das ausl&ouml;sende Steuer-element. In einer <b>Select Case<\/b>-Bedingung pr&uuml;ft die Prozedur den Wert von <b>control.Id<\/b>, was den Wert der Eigenschaft <b>id <\/b>des Elements zur&uuml;ckgibt &#8211; in diesem Fall beispielsweise <b>btnDatenbankbefehl<\/b>. Dann stellt die Prozedur den Wert der Variablen <b>bolDatenbankbefehl_Enabled <\/b>auf <b>False <\/b>ein, wenn dieser zuvor <b>True <\/b>war und umgekehrt. Der resultierende Wert landet dann als R&uuml;ckgabewert in <b>GetEnabled<\/b>.<\/p>\n<p>Ohne weiteres Zutun sorgt dies beim erstmaligen Anzeigen des Ribbon-Tabs daf&uuml;r, dass die Schaltfl&auml;che <b>btnDatenbankbefehl <\/b>aktiviert dargestellt wird, denn <b>Boolean<\/b>-Variablen haben standardm&auml;&szlig;ig den Wert <b>False<\/b>. In der ersten Anweisung wird dieser Wert in <b>True <\/b>ge&auml;ndert und dann an die Eigenschaft <b>Enabled <\/b>des <b>Button<\/b>-Elements &uuml;bergeben (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_04\/pic_1093_006.png\" alt=\"Deaktivieren der Schaltfl&auml;che Datenbankbefehl per Mausklick\" width=\"700\" height=\"165,9198\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Deaktivieren der Schaltfl&auml;che Datenbankbefehl per Mausklick<\/span><\/b><\/p>\n<p>Wie aber k&ouml;nnen wir daf&uuml;r sorgen, dass ein Mausklick auf die Schaltfl&auml;che <b>btnAnwendungsbefehl <\/b>den Status der <b>Enabled<\/b>-Eigenschaft von <b>btnDatenbankbefehl <\/b>&auml;ndert Dazu &auml;ndern wir die <b>onAction<\/b>-Eigenschaft f&uuml;r den <b>Select Case<\/b>-Zweig mit dem Wert <b>btnAnwendungsbefehl <\/b>wie folgt ab:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>onAction(ctl<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     Select Case ctl.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnAnwendungsbefehl\"\r\n             ribbon.Invalidate()\r\n         <span style=\"color:blue;\">Case <\/span>\"btnDatenbankbefehl\"\r\n             MessageBox.Show(\"Datenbankbefehl\")\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der einzige notwendige Schritt ist also, den Befehl <b>Invalidate <\/b>eines Objekts namens <b>ribbon <\/b>aufzurufen. Unter Access\/VBA kennen Sie diesen Befehl bereits. Dort sind es bis hierhin jedoch einige Schritte mehr: Wir m&uuml;ssen zum Beispiel eine Variable des Typs <b>IRibbonUI <\/b>deklarieren und diese in der Prozedur, die durch die Callback-Eigenschaft <b>LoadRibbon <\/b>des <b>customUI<\/b>-Elements ausgel&ouml;st wird, mit einer Referenz auf das Ribbon f&uuml;llen. Diese Schritte werden durch Visual Studio bereits automatisch durchgef&uuml;hrt. Sowohl das Attribut <b>loadRibbon <\/b>ist bereits angelegt als auch die Variable <b>ribbon <\/b>sowie die Methode <b>Ribbon_Load<\/b>.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt die wichtigsten Techniken zur Definition von Ribbon-Schaltfl&auml;chen f&uuml;r VSTO-Add-Ins. Damit k&ouml;nnen Sie die meisten ben&ouml;tigten Funktionen abbilden. Ein Beispiel daf&uuml;r finden Sie etwa im Beitrag <b>Datenzugriff per VSTO-Add-In <\/b>(<b>www.access-im-unternehmen.de\/1094<\/b>), wo wir auf die Daten in den Tabellen einer Datenbank zugreifen wollen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>AccessAddIn_VB.rar<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/A93EB561-FF39-48CA-85EA-5C057C204F64\/aiu_1093.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie in Visual Studio ein COM-Add-In f&uuml;r Access erstellen (wie im Beitrag &#8222;Access-Add-In mit VSTO&#8220;), k&ouml;nnen Sie zwei M&ouml;glichkeiten nutzen, um Ribbons f&uuml;r das Add-In hinzuzuf&uuml;gen. Der erste Weg nutzt einen grafischen Editor und wird bereits im genannten Beitrag beschrieben. Allerdings erlaubt dieser nicht, alle verf&uuml;gbaren Elemente und Techniken zu nutzen. Genau genommen k&ouml;nnen Sie damit nur Tabs, Groups und die darin enthaltenen Steuer-elemente hinzuf&uuml;gen. Wenn Sie, wie Sie es von Access gewohnt sind, in die Vollen gehen wollen und etwa auch das Backstage anpassen oder eingebaute Ribbon-Schaltfl&auml;chen mit neuen Funktionen versehen wollen, finden Sie im vorliegenden Artikel die richtigen Techniken.<\/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":[662017,66042017,44000025],"tags":[],"class_list":["post-55001093","post","type-post","status-publish","format-standard","hentry","category-662017","category-66042017","category-VBA_und_Programmiertechniken"],"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>COM-Add-In-Ribbons mit dem XML-Designer - 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\/COMAddInRibbons_mit_dem_XMLDesigner\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"COM-Add-In-Ribbons mit dem XML-Designer\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie in Visual Studio ein COM-Add-In f&uuml;r Access erstellen (wie im Beitrag &quot;Access-Add-In mit VSTO&quot;), k&ouml;nnen Sie zwei M&ouml;glichkeiten nutzen, um Ribbons f&uuml;r das Add-In hinzuzuf&uuml;gen. Der erste Weg nutzt einen grafischen Editor und wird bereits im genannten Beitrag beschrieben. Allerdings erlaubt dieser nicht, alle verf&uuml;gbaren Elemente und Techniken zu nutzen. Genau genommen k&ouml;nnen Sie damit nur Tabs, Groups und die darin enthaltenen Steuer-elemente hinzuf&uuml;gen. Wenn Sie, wie Sie es von Access gewohnt sind, in die Vollen gehen wollen und etwa auch das Backstage anpassen oder eingebaute Ribbon-Schaltfl&auml;chen mit neuen Funktionen versehen wollen, finden Sie im vorliegenden Artikel die richtigen Techniken.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:26:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/d58d8d11450041108f7d9babacc7f7ae\" \/>\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=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"COM-Add-In-Ribbons mit dem XML-Designer\",\"datePublished\":\"2020-05-13T21:26:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/\"},\"wordCount\":2045,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d58d8d11450041108f7d9babacc7f7ae\",\"articleSection\":[\"2017\",\"4\\\/2017\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/\",\"name\":\"COM-Add-In-Ribbons mit dem XML-Designer - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d58d8d11450041108f7d9babacc7f7ae\",\"datePublished\":\"2020-05-13T21:26:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d58d8d11450041108f7d9babacc7f7ae\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d58d8d11450041108f7d9babacc7f7ae\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/COMAddInRibbons_mit_dem_XMLDesigner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"COM-Add-In-Ribbons mit dem XML-Designer\"}]},{\"@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":"COM-Add-In-Ribbons mit dem XML-Designer - 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\/COMAddInRibbons_mit_dem_XMLDesigner\/","og_locale":"de_DE","og_type":"article","og_title":"COM-Add-In-Ribbons mit dem XML-Designer","og_description":"Wenn Sie in Visual Studio ein COM-Add-In f&uuml;r Access erstellen (wie im Beitrag \"Access-Add-In mit VSTO\"), k&ouml;nnen Sie zwei M&ouml;glichkeiten nutzen, um Ribbons f&uuml;r das Add-In hinzuzuf&uuml;gen. Der erste Weg nutzt einen grafischen Editor und wird bereits im genannten Beitrag beschrieben. Allerdings erlaubt dieser nicht, alle verf&uuml;gbaren Elemente und Techniken zu nutzen. Genau genommen k&ouml;nnen Sie damit nur Tabs, Groups und die darin enthaltenen Steuer-elemente hinzuf&uuml;gen. Wenn Sie, wie Sie es von Access gewohnt sind, in die Vollen gehen wollen und etwa auch das Backstage anpassen oder eingebaute Ribbon-Schaltfl&auml;chen mit neuen Funktionen versehen wollen, finden Sie im vorliegenden Artikel die richtigen Techniken.","og_url":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:26:06+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/d58d8d11450041108f7d9babacc7f7ae","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"COM-Add-In-Ribbons mit dem XML-Designer","datePublished":"2020-05-13T21:26:06+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/"},"wordCount":2045,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/d58d8d11450041108f7d9babacc7f7ae","articleSection":["2017","4\/2017","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/","url":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/","name":"COM-Add-In-Ribbons mit dem XML-Designer - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/d58d8d11450041108f7d9babacc7f7ae","datePublished":"2020-05-13T21:26:06+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/d58d8d11450041108f7d9babacc7f7ae","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/d58d8d11450041108f7d9babacc7f7ae"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/COMAddInRibbons_mit_dem_XMLDesigner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"COM-Add-In-Ribbons mit dem XML-Designer"}]},{"@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\/55001093","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=55001093"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001093\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}