{"id":55000468,"date":"2025-06-01T00:00:00","date_gmt":"2025-08-27T13:46:23","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=468"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"BackstageBereich_von_Office_erweitern","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/BackstageBereich_von_Office_erweitern\/","title":{"rendered":"Backstage-Bereich von Office erweitern"},"content":{"rendered":"<p><b>Wenn man eine der Office-Anwendungen um ein selbst programmiertes COM-Add-In erweitern m&ouml;chte, kann man den Backstage-Bereich nutzen, um eventuell notwendige Optionen f&uuml;r dieses COM-Add-In dort abzubilden. Wir w&uuml;rden dann einen eigenen Reiter auf der linken Seite des Backstage-Bereichs platzieren, &uuml;ber den wir einen eigenen Bereich anzeigen k&ouml;nnen. Diesem wiederum k&ouml;nnen wir verschiedene Steuerelemente f&uuml;r die Anzeige und Eingabe von Optionen hinzuf&uuml;gen. Dieser Artikel zeigt, wie wir ein einfaches COM-Add-In mit twinBASIC erstellen und dieses mit der Definition einer Backstage-Erweiterung ausstatten und wie diese Erweiterung beim Starten der Anwendung angezeigt wird.<\/b><\/p>\n<p>Mit <b>twinBASIC<\/b>, der Entwicklungsumgebung von Wayne Philips, lassen sich einfach COM-Add-Ins erstellen, mit denen wir auch den Backstage-Bereich anpassen k&ouml;nnen.<\/p>\n<p><b>twinBASIC <\/b>in der jeweils aktuellen Version kannst Du hier herunterladen:<\/p>\n<pre>https:\/\/github.com\/twinbasic\/twinbasic\/releases<\/pre>\n<p>Nach dem Kopieren der enthaltenen Dateien in einen beliebigen Ordner k&ouml;nnen wir twinBASIC mit einem Doppelklick auf die <b>.exe<\/b>-Datei starten. Wir landen dann im Startbildschirm, wo wir auf der Seite Samples den Eintrag <b>Sample 5. MyCOMAddin <\/b>ausw&auml;hlen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_468_001.png\" alt=\"Erstellen eines COM-Add-Ins auf Basis des Beispiels\" width=\"599,6265\" height=\"482,4065\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erstellen eines COM-Add-Ins auf Basis des Beispiels<\/span><\/b><\/p>\n<p>Im n&auml;chsten Dialog k&ouml;nnen wir bereits den Projektnamen festlegen (siehe Bild 2). Die &uuml;brigen Optionen behalten wir bei.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_468_002.png\" alt=\"Festlegen des Projektnamens\" width=\"549,6265\" height=\"297,9777\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Festlegen des Projektnamens<\/span><\/b><\/p>\n<p>Damit haben wir bereits ein COM-Add-In-Projekt angelegt, das wir nun direkt testen k&ouml;nnen. Dazu schlie&szlig;en wir alle eventuell ge&ouml;ffneten Access- und Excel-Anwendungen, denn f&uuml;r dieses ist die Demo ausgelegt. <\/p>\n<p>Danach bet&auml;tigen wir den Men&uuml;befehl <b>File|Build <\/b>(siehe Bild 3). Dies erstellt, nachdem wir den Speicherort f&uuml;r die Projektdatei angegeben haben, das COM-Add-In.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_468_003.png\" alt=\"Projekt erstellen\" width=\"599,6265\" height=\"416,3521\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Projekt erstellen<\/span><\/b><\/p>\n<p>Das bedeutet, dass die DLL f&uuml;r das COM-Add-In erstellt und in die Registry eingetragen wird. Diese Registry-Eintr&auml;ge werden beim Start der Office-Anwendungen ausgelesen und sorgen daf&uuml;r, dass die im COM-Add-In angegebenen Ereignisprozeduren ausgef&uuml;hrt werden, sodass das COM-Add-In bereits beim n&auml;chsten Start ausf&uuml;hrbereit ist.<\/p>\n<h2>Erster Test in Excel<\/h2>\n<p>Starten wir nun Excel und &ouml;ffnen ein Workbook, sehen wir im Ribbon einen neuen Registerreiter namens <b>twinBASIC Test<\/b>, der eine Schaltfl&auml;che namens <b>Hello World <\/b>enth&auml;lt. Klicken wir diese an, wird die provisorische Methode zum Anzeigen einer Meldung ausgef&uuml;hrt (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_468_004.png\" alt=\"Die Funktion des neuen COM-Add-Ins ist nun direkt in der jeweiligen Office-Anwendung verf&uuml;gbar.\" width=\"700\" height=\"219,9999\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Funktion des neuen COM-Add-Ins ist nun direkt in der jeweiligen Office-Anwendung verf&uuml;gbar.<\/span><\/b><\/p>\n<h2>Zielanwendung definieren<\/h2>\n<p>In twinBASIC finden wir im <b>PROJECT EXPLORER<\/b> unter Sources zwei Module. Das Modul <b>DllRegistration <\/b>enth&auml;lt den Code, der das COM-Add-In f&uuml;r die gew&uuml;nschten Office-Anwendungen installiert. Im oberen Bereich werden verschiedene Konstanten definieren mit den Pfaden der Registry, in denen die Registry-Informationen beim Registrieren eingetragen werden sollen (siehe Listing 1). Wichtig: Hier muss f&uuml;r <b>AddinClassName <\/b>der Name der soeben umbenannten Klasse eingetragen werden, also <b>Backstage<\/b>.<\/p>\n<pre>Const AddinProjectName<span style=\"color:blue;\"> As String<\/span> = VBA.Compilation.CurrentProjectName\r\nConst AddinClassName<span style=\"color:blue;\"> As String<\/span> = \"Backstage\"\r\nConst AddinQualifiedClassName<span style=\"color:blue;\"> As String<\/span> = AddinProjectName & \".\" & AddinClassName\r\nConst RootRegistryFolder_ACCESS<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Access\\Addins\\\" & AddinQualifiedClassName & \"\\\"\r\nConst RootRegistryFolder_EXCEL<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Excel\\Addins\\\" & AddinQualifiedClassName & \"\\\"\r\nConst RootRegistryFolder_WORD<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Word\\Addins\\\" & AddinQualifiedClassName & \"\\\"\r\nConst RootRegistryFolder_OUTLOOK<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Outlook\\Addins\\\" & AddinQualifiedClassName & \"\\\"\r\nConst RootRegistryFolder_POWERPOINT<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Powerpoint\\Addins\\\" _\r\n         & AddinQualifiedClassName & \"\\\"<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Konstanten f&uuml;r das Registrieren des COM-Add-Ins f&uuml;r die jeweilige Office-Anwendung<\/span><\/b><\/p>\n<p>Die Funktion <b>DllRegisterServer <\/b>erledigt das Eintragen der notwendigen Informationen in der Registry (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DllRegisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n     <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n     wscript.RegWrite RootRegistryFolder_ACCESS & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_ACCESS & \"Description\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_ACCESS & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n     \r\n     wscript.RegWrite RootRegistryFolder_EXCEL & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_EXCEL & \"Description\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_EXCEL & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n     wscript.RegWrite RootRegistryFolder_WORD & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_WORD & \"Description\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_WORD & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n     \r\n     wscript.RegWrite RootRegistryFolder_OUTLOOK & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_OUTLOOK & \"Description\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_OUTLOOK & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n     \r\n     wscript.RegWrite RootRegistryFolder_POWERPOINT & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_POWERPOINT & \"Description\", AddinProjectName, \"REG_SZ\"\r\n     wscript.RegWrite RootRegistryFolder_POWERPOINT & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n     Return <span style=\"color:blue;\">True<\/span>\r\nRegError:\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"DllRegisterServer -- An error occured trying to write to the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n             Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n     Return <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion zum Eintragen der COM-Add-In-Informationen in die Registry<\/span><\/b><\/p>\n<p>Wir haben hier zu Beispielzwecken einmal die Eintragungen f&uuml;r alle f&uuml;nf Office-Anwendungen eingetragen, also f&uuml;r Access, Excel, Outlook, Word und PowerPoint. Es werden jeweils vier Eintr&auml;ge f&uuml;r den entsprechenden Registry-Zweig angelegt.<\/p>\n<p>In Bild 5 sehen wir diese Eintr&auml;ge f&uuml;r Word. Unter <b>AddIns <\/b>befinden sich alle aktuell registrieren Add-Ins, hier auch das von uns hinzugef&uuml;gte COM-Add-In namens <b>amvBackstage<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_468_005.png\" alt=\"Eintrag f&uuml;r ein COM-Add-In f&uuml;r Word\" width=\"649,627\" height=\"246,8582\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Eintrag f&uuml;r ein COM-Add-In f&uuml;r Word<\/span><\/b><\/p>\n<p>Je nachdem, f&uuml;r welche Anwendung Du ein COM-Add-In mit einer Anpassung des Backstage-Bereichs hinzuf&uuml;gen m&ouml;chtest, kannst Du einen oder mehrere der f&uuml;nf Konstanten und Anweisungen zum Eintragen in die Registry beibehalten, die &Uuml;brigen k&ouml;nnen auskommentiert werden.<\/p>\n<h2>Registrierung aufheben<\/h2>\n<p>Wenn das COM-Add-In aus der Registrierung entfernt werden und somit nicht mehr beim Start der jeweiligen Office-Anwendungen aufgerufen werden soll, m&uuml;ssen wir die Funktion <b>DllUnregisterServer <\/b>ausf&uuml;hren (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DllUnregisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n     <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n     wscript.RegDelete RootRegistryFolder_ACCESS & \"FriendlyName\"\r\n     wscript.RegDelete RootRegistryFolder_ACCESS & \"Description\"\r\n     wscript.RegDelete RootRegistryFolder_ACCESS & \"LoadBehavior\"\r\n     wscript.RegDelete RootRegistryFolder_ACCESS\r\n     wscript.RegDelete RootRegistryFolder_EXCEL & \"FriendlyName\"\r\n     wscript.RegDelete RootRegistryFolder_EXCEL & \"Description\"\r\n     wscript.RegDelete RootRegistryFolder_EXCEL & \"LoadBehavior\"\r\n     wscript.RegDelete RootRegistryFolder_EXCEL\r\n     wscript.RegDelete RootRegistryFolder_WORD & \"FriendlyName\"\r\n     wscript.RegDelete RootRegistryFolder_WORD & \"Description\"\r\n     wscript.RegDelete RootRegistryFolder_WORD & \"LoadBehavior\"\r\n     wscript.RegDelete RootRegistryFolder_WORD\r\n     \r\n     wscript.RegDelete RootRegistryFolder_OUTLOOK & \"FriendlyName\"\r\n     wscript.RegDelete RootRegistryFolder_OUTLOOK & \"Description\"\r\n     wscript.RegDelete RootRegistryFolder_OUTLOOK & \"LoadBehavior\"\r\n     wscript.RegDelete RootRegistryFolder_OUTLOOK\r\n     \r\n     wscript.RegDelete RootRegistryFolder_POWERPOINT & \"FriendlyName\"\r\n     wscript.RegDelete RootRegistryFolder_POWERPOINT & \"Description\"\r\n     wscript.RegDelete RootRegistryFolder_POWERPOINT & \"LoadBehavior\"\r\n     wscript.RegDelete RootRegistryFolder_POWERPOINT\r\n     \r\n     Return <span style=\"color:blue;\">True<\/span>    \r\nRegError:\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"DllUnregisterServer -- An error occured trying to delete from the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n             Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n     Return <span style=\"color:blue;\">False<\/span>    \r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Entfernen der Eintr&auml;ge f&uuml;r das COM-Add-In aus der Registry<\/span><\/b><\/p>\n<p>Auch hier sind wieder die Anweisungen f&uuml;r das Entfernen der Registry-Eintr&auml;ge f&uuml;r alle f&uuml;nf Office-Anwendungen enthalten. Wenn nur Registrierungen f&uuml;r bestimmte Office-Anwendungen hinterlegt wurden, k&ouml;nnen wir auch die entsprechenden Anweisungen zum Entfernen der Registry-Eintr&auml;ge entfernen.<\/p>\n<p>Die beiden Funktionen <b>DllRegisterServer<\/b> und <b>DllUnregisterServer <\/b>werden &uuml;brigens nicht nur aufgerufen, wenn wir in twinBASIC den Befehl <b>File|Build <\/b>ausf&uuml;hren. Auch wenn die wir so erstellte DLL sp&auml;ter mit dem Befehl <b>Regsvr32.exe <\/b>registrieren, werden diese ausgef&uuml;hrt. Das Gleiche gilt f&uuml;r das Aufhaben der Registrierung, wobei wir <b>Regsvr32.exe <\/b>dann noch den Parameter <b>\/u <\/b>&uuml;bergeben m&uuml;ssen.<\/p>\n<h2>Klasse des COM-Add-Ins anpassen<\/h2>\n<p>Damit kommen wir zum eigentlichen Teil des COM-Add-Ins, den wir mit der Definition einer Backstage-Erweiterung ausstatten wollen. Diese finden wir im Modul, das im Demo-Projekt <b>MyCOMAddin.twin <\/b>hei&szlig;t. Dieses benennen wir erst einmal um, zum Beispiel in <b>Backstage.twin<\/b>. Dazu darf das Modul aktuell nicht ge&ouml;ffnet sein. Danach &ouml;ffnen wir das Modul <b>Backstage.twin <\/b>und &auml;ndern auch dort noch den eigentlichen Klassennamen von <b>MyCOMAddIn <\/b>auf <b>Backstage<\/b> (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_468_006.png\" alt=\"Umbenennen der Hauptklasse des COM-Add-Ins\" width=\"649,627\" height=\"331,8745\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Umbenennen der Hauptklasse des COM-Add-Ins<\/span><\/b><\/p>\n<p>Nun beginnen wir mit der eigentlichen Erstellung der <b>Backstage<\/b>-Anpassung.<\/p>\n<h2>Backstage f&uuml;r das COM-Add-In anzeigen<\/h2>\n<p>Im Modul <b>Backstage.twin <\/b>finden wir nun folgende Bestandteile:<\/p>\n<ul>\n<li>Zwei <b>Implements<\/b>-Anweisungen. Die erste gibt an, dass die Schnittstelle <b>IDTExtensibility2 <\/b>implementiert wird. Diese sorgt daf&uuml;r, dass beim Start der jeweiligen Office-Anwendung die f&uuml;r die Schnittstelle definierten Ereignisprozeduren ausgef&uuml;hrt werden, zum Beispiel <b>OnConnection<\/b> direkt beim Start. Hier werden dem COM-Add-In Verweise unter anderem auf die aufrufende Office-Anwendung &uuml;bergeben. Diese ist wichtig, wenn wir im Code des COM-Add-In auf die Instanz der Anwendung zugreifen wollen.<\/li>\n<li>Die zweite <b>Implements<\/b>-Anweisung ist f&uuml;r unseren Artikel wichtig. Sie gibt an, dass die Schnittstelle <b>IRibbonExtensibility <\/b>implementiert wird. Diese erfordert die Implementierung der einzigen Funktion, die beim Start des COM-Add-Ins aufgerufen wird und welche die Backstage-Definition zusammenstellen, die dann von der Office-Anwendung angewendet werden soll. In diese definieren wir also den Backstage-Bereich, den wir der Office-Anwendung hinzuf&uuml;gen wollen. Die Funktion gibt diese XML-Definition an die aufrufende Anwendung zur&uuml;ck.<\/li>\n<li>Die folgenden f&uuml;nf Ereignisprozeduren sind Teile der Implementierung der Schnittstelle <b>IDTExtensibility2 <\/b>und enthalten Code, der zu den verschiedenen Ereignissen ausgef&uuml;hrt wird &#8211; f&uuml;r unser Beispiel aber nicht relevant.<\/li>\n<li>Interessant ist wieder die folgende Funktion namens <b>GetCustomUI<\/b>. Diese wird durch <b>IRibbonExtensibility<\/b> implementiert und stellt die XML-Definition zum Anpassen des Ribbons und somit auch des Backstage-Bereichs der Anwendung zusammen, die beim Aufruf der Anwendung direkt angewendet wird (siehe Listing 4). Diese Funktion passen wir an, damit die von uns gew&uuml;nschte Backstage-Erweiterung in der Anwendung erscheint.<\/li>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     strXML &= \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2006\/01\/customui\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;ribbon startFromScratch=\"\"false\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;tab id=\"\"tabTest\"\" label=\"\"twinBASIC Test\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;group id=\"\"grpTwin1\"\" label=\"\"Hello Group\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;button id=\"\"btnHello\"\" size=\"\"large\"\" label=\"\"Hello World\"\" \" _\r\n         & \"getImage=\"\"OnGetHelloWorldButtonImage\"\" onAction=\"\"OnHelloWorldClicked\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;\/tab&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;\/tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;\/ribbon&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     \r\n     Return strXML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Urspr&uuml;ngliche Funktion zum Zur&uuml;ckgeben einer Ribbon-Definition an die aufrufende Anwendung<\/span><\/b><\/p>\n<\/ul>\n<h2>Backstage-Erweiterung statt Ribbon-Erweiterung<\/h2>\n<p>Es gibt eine wichtige &Auml;nderung gegen&uuml;ber dem Ribbon-XML aus der Vorlage. Wir m&uuml;ssen den Namespace so &auml;ndern, dass er sich auf die aktuellere Version bezieht, und zwar auf <b>2009\/07 <\/b>statt auf <b>2006\/01<\/b>. In der Version von <b>2006\/01 <\/b>war das <b>backstage<\/b>-Element n&auml;mlich noch gar nicht enthalten. Somit w&uuml;rden wir Fehler erhalten, wenn wir unter diesen Bedingungen das <b>backstage<\/b>-Element verwenden w&uuml;rden.<\/p>\n<p>Anschlie&szlig;end k&ouml;nnen wir den Code, den wir in der Funktion <b>GetCustomUI <\/b>finden, fast vollst&auml;ndig entfernen. Genau genommen l&ouml;schen wir nun alle Zeilen, die sich zwischen den Anweisungen zum Hinzuf&uuml;gen des &ouml;ffnenden und schlie&szlig;enden <b>customUI<\/b>-Elements befinden (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     strXML &= \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;backstage&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;button id=\"\"btn1\"\" label=\"\"Beispielbutton\"\" onAction=\"\"OnAction\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;\/backstage&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> strXML\r\n     Return strXML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Neue Version des Ribbon-XML mit dem backstage-Element<\/span><\/b><\/p>\n<p>Dazwischen k&ouml;nnen wir nun mit der Gestaltung unserer Backstage-Erweiterung beginnen. Wir f&uuml;gen ein <b>backstage<\/b>-Element hinzu. Au&szlig;erdem legen wir darin ein <b>button<\/b>-Element an mit dem Attribut <b>onAction <\/b>mit dem Wert <b>OnAction<\/b>.<\/p>\n<p>Nach dem erneuten Erstellen des COM-Add-Ins k&ouml;nnen wir eine der f&uuml;nf Office-Anwendungen starten und finden dort im Backstage-Bereich ganz unten den Befehl <b>Beispielbutton <\/b>vor, den wir auch ausf&uuml;hren k&ouml;nnen (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_468_007.png\" alt=\"Neuer Befehl im Backstage-Bereich, hier in Word\" width=\"524,6265\" height=\"476,4726\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Neuer Befehl im Backstage-Bereich, hier in Word<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt, wie Du Office-Anwendungen &uuml;ber ein COM-Add-In mit einem neuen Backstage-Element erweitern kannst. In einem weiteren Artikel namens <b>Backstage-Bereich von Office erweitern <\/b>(<b>www.vbentwickler.de\/468<\/b>) zeigen wir, welche M&ouml;glichkeiten das Backstage-Element insgesamt bietet.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvBackstage.twinproj<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/C0848B89-81A1-42E3-A601-3A72BB410F74\/vbe_468.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Office-Anwendungen zeigen seit der Version 2010 einen neuen Bereich namens Backstage an, der allgemeine Funktionen wie zum Verwalten von Dateien wie Erstellen, &Ouml;ffnen und Speichern, aber auch allgemeine Informationen und M&ouml;glichkeiten zum Drucken von Dokumenten an. Au&szlig;erdem finden wir hier einen Bereich zum Einsehen des verwendeten Microsoft-Kontos und eine Schaltfl&auml;che zum Anzeigen der Optionen der jeweiligen Anwendung. Aber auch dieser Bereich ist, genau wie das Ribbon selbst, anpassbar. Wie das gelingt, schauen wir uns in diesem Grundlagenartikel einmal im Detail an.<\/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":[662025,66032025,44000027,44000026,44000030,44000036],"tags":[],"yst_prominent_words":[],"class_list":["post-55000468","post","type-post","status-publish","format-standard","hentry","category-662025","category-66032025","category-Excel_programmieren","category-Outlook_programmieren","category-PowerPoint_programmieren","category-Ribbon_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000468"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000468\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000468"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}