{"id":55000468,"date":"2026-04-01T00:00:00","date_gmt":"2026-05-16T15:31:19","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_Access_erweitern_Teil_1","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/BackstageBereich_von_Access_erweitern_Teil_1\/","title":{"rendered":"Backstage-Bereich von Access erweitern, Teil 1"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/49ed65e7887e4aeca31dd092ac3301a7\" width=\"1\" height=\"1\" alt=\"\"><b>Klickt man in Access auf den Registerreiter <b>Datei<\/b>, &ouml;ffnet sich der sogenannte Backstage-Bereich. Hier findet man Befehle wie <b>Speichern<\/b>, <b>Drucken<\/b> oder <b>Optionen<\/b> sowie verschiedene Informationsbereiche. Was viele nicht wissen: Dieser Bereich l&auml;sst sich per XML-Definition umfangreich anpassen. Wir k&ouml;nnen eigene Befehle und Registerkarten hinzuf&uuml;gen, eingebaute Bereiche ausblenden und sogar vollst&auml;ndige Optionsseiten mit Textfeldern, Kontrollk&auml;stchen und Auswahllisten gestalten. In diesem Artikel zeigen wir Schritt f&uuml;r Schritt, wie das in Access funktioniert &#8211; direkt &uuml;ber die Systemtabelle <b>USysRibbons<\/b> und VBA-Callback-Prozeduren.<\/b><\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele zu diesem Artikel findest Du in der Beispieldatenbank. Diese enth&auml;lt ein Modul <b>mdlBackstageReferenz<\/b>, das die Tabelle <b>USysRibbons<\/b> anlegt und mit der XML-Definition bef&uuml;llt. Die Callback-Prozeduren befinden sich im Modul <b>mdlBackstageCallbacks<\/b>. F&uuml;hre im Direktbereich die Prozedur <b>BackstageReferenz<\/b> aus, um die Tabelle zu erstellen.<\/p>\n<p>Danach tr&auml;gst Du unter <b>Datei|Optionen|Aktuelle Datenbank<\/b> den Ribbon-Namen <b>BackstageRef<\/b> ein und startest Access neu (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_001.png\" alt=\"Ausw&auml;hlen der aktuellen Ribbon-Definition\" width=\"599,6265\" height=\"345,6181\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ausw&auml;hlen der aktuellen Ribbon-Definition<\/span><\/b><\/p>\n<h2>Hilfsformular zum Bearbeiten der Ribbon-Definitionen<\/h2>\n<p>In der Beispieldatenbank findest Du ein Formular namens <b>frmRibbonXML<\/b>, mit dem Du die Ribbon-Definitionen einfacher bearbeiten kannst, als direkt in der Tabelle (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_006.png\" alt=\"Formular zum Bearbeiten der Ribbon-Definitionen\" width=\"599,6265\" height=\"368,0706\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Formular zum Bearbeiten der Ribbon-Definitionen<\/span><\/b><\/p>\n<h2>Voraussetzungen<\/h2>\n<p>Die Backstage-Definition verwendet den Namespace <b>http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui<\/b>. Dieser wurde mit Office 2010 eingef&uuml;hrt und ist die Voraussetzung daf&uuml;r, dass das <b>backstage<\/b>-Element &uuml;berhaupt zur Verf&uuml;gung steht. Der &auml;ltere Namespace <b>2006\/01<\/b> kennt kein <b>backstage<\/b>-Element.<\/p>\n<p>Jede Backstage-Definition beginnt daher mit dem folgenden Grundger&uuml;st:<\/p>\n<pre>&lt;customUI xmlns=\r\n    \"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\r\n      onLoad=\"onLoad\"&gt;\r\n  &lt;backstage&gt;\r\n    ...\r\n  &lt;\/backstage&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p>Das Attribut <b>onLoad<\/b> im <b>customUI<\/b>-Element verweist auf eine VBA-Callback-Prozedur, die beim Laden der Ribbon-Definition aufgerufen wird. Sie &uuml;bergibt ein <b>IRibbonUI<\/b>-Objekt, das wir in einer Modulvariablen speichern. Dar&uuml;ber k&ouml;nnen wir sp&auml;ter die Anzeige aller Steuerelemente aktualisieren. Dazu legen wir im Modul mdlBackstage die folgenden Elemente an:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>m_objRibbon<span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n<span style=\"color:blue;\">Public Sub <\/span>onLoad(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n    <span style=\"color:blue;\">Set<\/span> m_objRibbon = ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Die Tabelle USysRibbons<\/h2>\n<p>In Access speichern wir Ribbon- und Backstage-Definitionen in der Systemtabelle <b>USysRibbons<\/b>. Diese Tabelle enth&auml;lt mindestens die Spalten <b>RibbonName<\/b> (Textfeld) und <b>RibbonXml<\/b> (Memofeld) &#8211; siehe Bild 3.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_002.png\" alt=\"Die Tabelle USysRibbons\" width=\"700\" height=\"232,061\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die Tabelle USysRibbons<\/span><\/b><\/p>\n<p>Den Namen aus der Spalte <b>RibbonName<\/b> tragen wir unter <b>Datei|Optionen|Aktuelle Datenbank<\/b> im Feld <b>Name des Men&uuml;bands<\/b> ein. Beim n&auml;chsten Start der Datenbank liest Access die zugeh&ouml;rige XML-Definition ein und wendet sie an. Die Tabelle ist als Systemtabelle nur sichtbar, wenn Du im Navigationsbereich unter <b>Navigationsoptionen<\/b> die Option <b>Systemobjekte anzeigen<\/b> aktivierst.<\/p>\n<h2>Die eingebauten Backstage-Elemente<\/h2>\n<p>Bevor wir eigene Elemente hinzuf&uuml;gen, werfen wir einen Blick auf die eingebauten Elemente des Backstage-Bereichs. Jedes Element besitzt einen eindeutigen <b>idMso<\/b>-Wert, &uuml;ber den wir es referenzieren. In der Reihenfolge ihres Erscheinens sind das: <b>PlaceTabHome<\/b> (Startseite), <b>TabOfficeStart<\/b> (Office-Start), <b>TabRecent<\/b> (Zuletzt verwendet), <b>TabInfo<\/b> (Informationen), <b>FileSave<\/b> (Speichern-Befehl), <b>TabSave<\/b> (Speichern unter), <b>TabPrint<\/b> (Drucken), <b>FileCloseDatabase<\/b> (Schlie&szlig;en-Befehl), <b>TabHelp<\/b> (Hilfe), <b>TabOfficeFeedback<\/b> (Feedback) und <b>ApplicationOptionsDialog<\/b> (Optionen-Befehl).<\/p>\n<p>Es gibt also zwei Typen:<\/p>\n<p><b>tab<\/b>-Elemente &ouml;ffnen beim Anklicken einen Inhaltsbereich auf der rechten Seite, <b>button<\/b>-Elemente f&uuml;hren direkt eine Aktion aus (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_003.png\" alt=\"Der Standard-Backstage-Bereich von Access mit allen eingebauten Elementen\" width=\"649,627\" height=\"545,917\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Der Standard-Backstage-Bereich von Access mit allen eingebauten Elementen<\/span><\/b><\/p>\n<h2>Ein eigener Befehl im Backstage-Bereich<\/h2>\n<p>Wir starten mit einem einfachen Befehl: einem <b>button<\/b>-Element direkt unterhalb von <b>backstage<\/b>.<\/p>\n<p>Den folgenden Code f&uuml;gen wir wie in Bild 5 in die Tabelle <b>USysRibbons <\/b>ein und &ouml;ffnen die Anwendung danach neu.  Du findest die Ribbon-Definition in der Tabelle <b>USysRibbons <\/b>unter <b>EigenerBefehl<\/b>. Dann stellen wir in den Optionen die Eigenschaft <b>Men&uuml;band <\/b>auf <b>EigenerBefehl <\/b>ein, also auf den Wert der Spalte <b>RibbonName<\/b>:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_004.png\" alt=\"Ribbon-Definition f&uuml;r eine neue Schaltfl&auml;che im Backstage-Bereich\" width=\"700\" height=\"162,585\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ribbon-Definition f&uuml;r eine neue Schaltfl&auml;che im Backstage-Bereich<\/span><\/b><\/p>\n<pre>&lt;customUI     xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/        customui\" onLoad=\"onLoad\"&gt;\r\n  &lt;backstage&gt;\r\n     &lt;button id=\"btnSchnell\" \r\n       label=\"Schnellbefehl (button)\"         insertAfterMso=\"TabInfo\"        imageMso=\"FileSave\"        onAction=\"onAction\"\/&gt;\r\n  &lt;\/backstage&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p>Dieses Element erscheint in der linken Befehlsleiste &#8211; genau wie die eingebauten Befehle <b>Speichern<\/b> oder <b>Schlie&szlig;en<\/b> (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_005.png\" alt=\"Neuer Befehl im Backstage-Bereich\" width=\"424,6267\" height=\"329,668\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Neuer Befehl im Backstage-Bereich<\/span><\/b><\/p>\n<p>Das Attribut <b>insertAfterMso=&#8221;TabInfo&#8221;<\/b> sorgt daf&uuml;r, dass der Befehl nach dem Informationen-Bereich eingef&uuml;gt wird. Mit <b>imageMso<\/b> weisen wir eines der eingebauten Office-Icons zu. Der Callback <b>onAction<\/b> verweist auf die VBA-Prozedur, die beim Klick aufgerufen wird. Die Signatur dieser Prozedur sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>onAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"onAction: \" & control.Id\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur empf&auml;ngt ein <b>IRibbonControl<\/b>-Objekt. &Uuml;ber dessen Eigenschaft <b>Id<\/b> l&auml;sst sich ermitteln, welches Steuerelement den Aufruf ausgel&ouml;st hat. So k&ouml;nnen wir mit einer einzigen Prozedur die Klicks mehrerer Backstage-Elemente verarbeiten.<\/p>\n<h2>Eine eigene Registerkarte anlegen<\/h2>\n<p>&Uuml;ber das <b>tab<\/b>-Element legen wir eine eigene Registerkarte an. Diese erzeugt einen Eintrag in der linken Befehlsleiste, der beim Anklicken einen Inhaltsbereich auf der rechten Seite &ouml;ffnet. Das <b>tab<\/b>-Element enth&auml;lt bis zu zwei Spalten: <b>firstColumn<\/b> und optional <b>secondColumn<\/b>:<\/p>\n<pre>&lt;tab id=\"tabSteuer\"\r\n    label=\"Steuerelemente (tab)\"\r\n    insertAfterMso=\"TabInfo\"&gt;\r\n  &lt;firstColumn&gt;\r\n    ...\r\n  &lt;\/firstColumn&gt;\r\n  &lt;secondColumn&gt;\r\n    ...\r\n  &lt;\/secondColumn&gt;\r\n&lt;\/tab&gt;<\/pre>\n<p>Innerhalb der Spalten platzieren wir <b>group<\/b>-Elemente, die Steuerelemente thematisch zusammenfassen. Die Hierarchie lautet: <b>tab<\/b> enth&auml;lt <b>firstColumn<\/b>\/<b>secondColumn<\/b>, diese enthalten <b>group<\/b>-Elemente, und darin befinden sich die Steuerelemente.<\/p>\n<p>Ohne diese <b>group<\/b>-Elemente sehen wir noch keine Elemente, wenn wir diese Ribbon-Definition anwenden. Also f&uuml;gen wir diese nun hinzu. Den vollst&auml;ndigen Code findest Du in der Tabelle <b>USysRibbons <\/b>unter <b>EigeneRegisterkarte<\/b>. Wir erl&auml;utern diesen im Anschluss schrittweise.<\/p>\n<h2>Gruppen mit primaryItem, topItems und bottomItems<\/h2>\n<p>Das <b>group<\/b>-Element im Backstage-Bereich unterscheidet sich deutlich von dem im Ribbon. Es kann drei Unterbereiche enthalten: <b>primaryItem<\/b>, <b>topItems<\/b> und <b>bottomItems<\/b>. Das <b>primaryItem<\/b> zeigt ein gro&szlig;es Steuerelement (einen Button oder ein Men&uuml;) auf der linken Seite der Gruppe (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_007.png\" alt=\"Ein Element im Bereich primaryItem\" width=\"599,6265\" height=\"328,6143\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ein Element im Bereich primaryItem<\/span><\/b><\/p>\n<p><b>topItems<\/b> und <b>bottomItems<\/b> enthalten die regul&auml;ren Steuerelemente oberhalb beziehungsweise unterhalb einer gedachten Trennlinie. Das Attribut <b>helperText<\/b> zeigt einen erl&auml;uternden Text unterhalb des Gruppennamens:<\/p>\n<pre>&lt;group id=\"grpTexte\"\r\n    label=\"Texteingaben (group)\"\r\n    helperText=\"Dieser Text kommt aus dem Attribut helperText.\"&gt;\r\n  &lt;primaryItem&gt;\r\n    &lt;button id=\"btnSpeichern\"\r\n        label=\"Speichern\r\n        (primaryItem &gt; button)\"\r\n        imageMso=\"FileSave\"\r\n        onAction=\"onAction\"\/&gt;\r\n  &lt;\/primaryItem&gt;\r\n  &lt;topItems&gt;\r\n    ...\r\n  &lt;\/topItems&gt;\r\n  &lt;bottomItems&gt;\r\n    ...\r\n  &lt;\/bottomItems&gt;\r\n&lt;\/group&gt;<\/pre>\n<h2>Elemente im Bereich topItems<\/h2>\n<p>Im Bereich <b>topItems<\/b> haben wir einige Elemente wie ein <b>labelControl<\/b>&#8211; und mehrere <b>editBox<\/b>-Elemente untergebracht. Diese werden wie folgt definiert:<\/p>\n<pre>&lt;topItems&gt;\r\n  &lt;labelControl id=\"lblHinweis\"     label=\"Dies ist ein labelControl\"\/&gt;\r\n  &lt;editBox id=\"txtServer\" label=\"Server (editBox)\"     getText=\"getText\" onChange=\"onChange\"     sizeString=\"yyyyyyyyyyyyyyyyyy\"\/&gt;\r\n  &lt;editBox id=\"txtDatenbank\" label=\"Datenbank (editBox)\"     getText=\"getText\" onChange=\"onChange\"     sizeString=\"yyyyyyyyyyyyyyyyyy\"\/&gt;\r\n  &lt;editBox id=\"txtBenutzer\" label=\"Benutzer (editBox)\"     getText=\"getText\" onChange=\"onChange\"     sizeString=\"yyyyyyyyyyyyyyyyyy\"\/&gt;\r\n&lt;\/topItems&gt;<\/pre>\n<p>Das Ergebnis sehen wir in Bild 8. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_008.png\" alt=\"Ein Element im Bereich topItem\" width=\"599,6265\" height=\"225,3143\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Ein Element im Bereich topItem<\/span><\/b><\/p>\n<h2>Wichtig: Die &Uuml;berschrift<\/h2>\n<p>Wie wir in der Abbildung sehen, &#8220;kleben&#8221; die Elemente alle am oberen Rand. Das liegt daran, dass wir die &Uuml;berschrift noch ausgespart haben. Diese f&uuml;gen wir nicht etwa als eigenes Element ein, aondern wir legen diese direkt f&uuml;r das <b>tab<\/b>-Element fest:<\/p>\n<pre>&lt;tab id=\"tabSteuer\" label=\"Steuerelemente (tab)\" \r\n  insertBeforeMso=\"FileSave\" \r\n  title=\"Beispiele f&uuml;r Steuerelemente\"&gt;<\/pre>\n<p>Damit sieht der Bereich bereits viel harmonischer aus (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_011.png\" alt=\"Backstage-Bereich mit &Uuml;berschrift\" width=\"649,627\" height=\"307,3084\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Backstage-Bereich mit &Uuml;berschrift<\/span><\/b><\/p>\n<h2>Callback-Funktionen<\/h2>\n<p>Hier verwenden wir einige Callback-Funktionen. Das sind Funktionen, die beim Anzeigen der Ribbon-Elemente ausgel&ouml;st werden und f&uuml;r die wir entsprechende Funktionen im VBA-Projekt hinterlegen. Diese findest Du im Modul <b>mdlBackstage<\/b>.<\/p>\n<h2>Das labelControl-Element<\/h2>\n<p>Das einfachste Steuerelement ist <b>labelControl<\/b>: Es zeigt einen statischen Text an, ohne dass der Benutzer damit interagieren kann. Das ist n&uuml;tzlich f&uuml;r Hinweise oder &Uuml;berschriften innerhalb einer Gruppe:<\/p>\n<pre>&lt;labelControl id=\"lblHinweis\"\r\n    label=\"Dies ist ein labelControl\"\/&gt;<\/pre>\n<p>Die XSD-Definition zeigt, dass <b>labelControl<\/b> neben <b>id<\/b> und <b>label<\/b> auch die Attribute <b>alignLabel<\/b>, <b>expand<\/b>, <b>enabled<\/b>, <b>visible<\/b> und <b>noWrap<\/b> unterst&uuml;tzt.<\/p>\n<p>Mit <b>noWrap=&#8221;true&#8221;<\/b> verhindern wir, dass ein langer Text umgebrochen wird.<\/p>\n<h2>Das editBox-Element<\/h2>\n<p>Mit <b>editBox<\/b> erstellen wir ein Textfeld, in das der Benutzer Freitext eingeben kann. Das Steuerelement arbeitet mit zwei Callbacks: <b>getText<\/b> liefert den aktuell anzuzeigenden Wert, <b>onChange<\/b> wird ausgel&ouml;st, wenn der Benutzer den Wert &auml;ndert und das Feld verl&auml;sst.<\/p>\n<p>Das Attribut <b>sizeString<\/b> bestimmt die Breite des Eingabefelds &#8211; Access misst die Breite anhand des angegebenen Textes:<\/p>\n<pre>&lt;editBox id=\"txtServer\" label=\"Server (editBox)\"\r\n    getText=\"getText\" onChange=\"onChange\"\r\n    sizeString=\"yyyyyyyyyyyyyyyyyy\"\/&gt;<\/pre>\n<p>Die Callback-Funktion <b>getText<\/b> wird aufgerufen, wenn Access den Inhalt des Feldes ermitteln m&ouml;chte &#8211; also beim &Ouml;ffnen des Backstage-Bereichs und nach einem Aufruf der <b>Invalidate<\/b>-Methode. Sie gibt einen <b>String<\/b> zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>getText(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n        ByRef text)\r\n    text = GetSetting(\"Backstage-Beispiel\", \"Optionen\", _\r\n        control.ID, \"\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Hier verwenden wir <b>control.Id<\/b> direkt als Schl&uuml;ssel f&uuml;r die Windows-Registry. So brauchen wir keinen langen <b>Select Case<\/b>-Block, sondern k&ouml;nnen mit einer einzigen Funktion beliebig viele Textfelder bedienen.<\/p>\n<p>Die Prozedur <b>onChange<\/b> empf&auml;ngt neben dem <b>control<\/b>-Objekt den neuen Text als zweiten Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>onChange(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n        text<span style=\"color:blue;\"> As String<\/span>)\r\n    SaveSetting \"Backstage-Beispiel\", \"Optionen\", _\r\n        control.ID, text\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die beiden Funktionen <b>GetSetting <\/b>und <b>SaveSetting <\/b>lesen beziehungsweise schreiben Einstellungen der Registry.<\/p>\n<p>Wenn Du Daten in eines der <b>editBox<\/b>-Elemente eintr&auml;gst, werden diese in enem f&uuml;r VBA-Anwendungen reservierten Bereich der Registry eingetragen, von wo sie beim Anzeigen der jeweiligen Steuerelemente auch wieder ausgelesen werden. Der entsprechende Bereich der Registry sieht wie in Bild 10 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_009.png\" alt=\"Die im Backstage-Bereich eingegebenen Werte in der Registry\" width=\"674,627\" height=\"289,9799\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Die im Backstage-Bereich eingegebenen Werte in der Registry<\/span><\/b><\/p>\n<h2>Das hyperlink-Element<\/h2>\n<p>Im <b>bottomItems<\/b>-Bereich der Gruppe platzieren wir ein <b>hyperlink<\/b>-Element. Dieses zeigt einen anklickbaren Link an, der eine URL im Standardbrowser &ouml;ffnet. <\/p>\n<p>as Attribut <b>target<\/b> enth&auml;lt die Ziel-URL:<\/p>\n<pre>&lt;hyperlink id=\"lnkHilfe\" label=\"Online-Hilfe (hyperlink)\"\r\n    target=\"https:\/\/www.example.com\"\/&gt;<\/pre>\n<p>Das <b>hyperlink<\/b>-Element unterst&uuml;tzt laut XSD auch die Attribute <b>onAction<\/b> (zum Ausf&uuml;hren von VBA-Code statt einer URL), <b>imageMso<\/b> (f&uuml;r ein Icon) sowie <b>screentip<\/b> und <b>supertip<\/b> (f&uuml;r Tooltips).<\/p>\n<p>Man kann statt <b>target<\/b> auch <b>getTarget<\/b> verwenden, um die URL dynamisch per Callback zu bestimmen.<\/p>\n<h2>Elemente im Bereich secondColumn<\/h2>\n<p>In der zweiten Spalte unserer Registerkarte (<b>secondColumn<\/b>) platzieren wir eine Gruppe mit Auswahl-Steuerelementen, und zwar das <b>checkBox<\/b>-Element, das <b>dropDown<\/b>-Element, das <b>comboBox<\/b>-Element und das <b>radioGroup<\/b>-Element (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_468_010.png\" alt=\"Elemente im Bereich secondColumn\" width=\"599,6265\" height=\"332,4118\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Elemente im Bereich secondColumn<\/span><\/b><\/p>\n<h2>Das checkBox-Element<\/h2>\n<p>Das <b>checkBox<\/b>-Element erzeugt ein Kontrollk&auml;stchen. Es verwendet den Callback <b>getPressed<\/b>, um den aktuellen Zustand abzufragen, und <b>onAction<\/b> f&uuml;r die Benachrichtigung bei einer &Auml;nderung. Im Backstage-Bereich unterst&uuml;tzt es zus&auml;tzlich das Attribut <b>description<\/b>, das einen erl&auml;uternden Text unterhalb des Labels anzeigt:<\/p>\n<pre>&lt;checkBox id=\"chkProtokoll\"     label=\"Protokollierung (checkBox)\"\r\n    description=\"Text aus dem Attribut description\"\r\n    getPressed=\"getPressed\"\r\n    onAction=\"onActionToggle\"\/&gt;<\/pre>\n<p>Die Callback-Funktion <b>getPressed<\/b> gibt einen <b>Boolean<\/b>-Wert zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>getPressed(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n        ByRef returnValue)\r\n    returnValue = GetSetting(\"Backstage-Beispiel\", _\r\n        \"Optionen\", control.ID, \"0\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Prozedur <b>onActionToggle<\/b> empf&auml;ngt den neuen Zustand als <b>Boolean<\/b>-Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>onActionToggle(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n        bolPressed<span style=\"color:blue;\"> As Boolean<\/span>)\r\n    SaveSetting \"Backstage-Beispiel\", \"Optionen\", _\r\n        control.ID, bolPressed 'strWert\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Das dropDown-Element<\/h2>\n<p>Ein <b>dropDown<\/b> bietet dem Benutzer eine geschlossene Auswahlliste, aus der er genau einen Eintrag w&auml;hlen kann. Die Eintr&auml;ge definieren wir statisch &uuml;ber <b>item<\/b>-Unterelemente. Jedes <b>item<\/b>-Element ben&ouml;tigt ein <b>id<\/b>&#8211; und ein <b>label<\/b>-Attribut:<\/p>\n<pre>&lt;dropDown id=\"ddSprache\" label=\"Sprache (dropDown)\"\r\n    getSelectedItemIndex=\"getSelectedItemIndex\"\r\n    onAction=\"onActionDropDown\"&gt;\r\n  &lt;item id=\"itemDE\" label=\"Deutsch (item)\"\/&gt;\r\n  &lt;item id=\"itemEN\" label=\"Englisch (item)\"\/&gt;\r\n  &lt;item id=\"itemFR\" label=\"Franzoesisch\r\n      (item)\"\/&gt;\r\n&lt;\/dropDown&gt;<\/pre>\n<p>Wichtig: Im Backstage-Bereich verwendet das <b>dropDown<\/b>-Element den Callback <b>getSelectedItemIndex<\/b> (nicht <b>getSelectedItemID<\/b> wie im Ribbon). Die Funktion gibt den nullbasierten Index des vorausgew&auml;hlten Eintrags zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>getSelectedItemIndex( _\r\n        control<span style=\"color:blue;\"> As <\/span>IRibbonControl, ByRef index)\r\n    index = CLng(GetSetting(\"Backstage-Beispiel\", _\r\n       \"Optionen\", control.ID, \"0\"))\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Callback-Prozedur <b>onActionDropDown<\/b> empf&auml;ngt neben dem <b>control<\/b>-Objekt die <b>id<\/b> des gew&auml;hlten Eintrags als <b>String<\/b> und den Index als <b>Long<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>onActionDropDown(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n        selectedID<span style=\"color:blue;\"> As String<\/span>, selectedIndex<span style=\"color:blue;\"> As Integer<\/span>)\r\n    SaveSetting \"Backstage-Beispiel\", \"Optionen\", _\r\n        control.ID, CStr(selectedIndex)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Das comboBox-Element<\/h2>\n<p>Die <b>comboBox<\/b> kombiniert ein Textfeld mit einer Auswahlliste. Im Gegensatz zum <b>dropDown<\/b> kann der Benutzer auch Freitext eingeben, der nicht in der Liste enthalten ist. Die <b>comboBox<\/b> verwendet die gleichen Callbacks wie die <b>editBox<\/b> &#8211; also <b>getText<\/b> und <b>onChange<\/b> &#8211; und bietet zus&auml;tzlich statische <b>item<\/b>-Eintr&auml;ge als Vorschl&auml;ge:<\/p>\n<pre>&lt;comboBox id=\"cboFormat\"   label=\"Exportformat (comboBox)\"\r\n  getText=\"getText\" \r\n  onChange=\"onChange\"\r\n  sizeString=\"yyyyyyyyyyyyyy\"&gt;\r\n  &lt;item id=\"itemCSV\" \r\n    label=\"CSV (item)\"\/&gt;\r\n  &lt;item id=\"itemXLSX\" \r\n    label=\"Excel (item)\"\/&gt;\r\n  &lt;item id=\"itemJSON\" label=\"JSON (item)\"\/&gt;\r\n&lt;\/comboBox&gt;<\/pre>\n<p>Da <b>comboBox<\/b> dieselben Callbacks <b>getText<\/b> und <b>onChange<\/b> verwendet wie <b>editBox<\/b>, funktionieren unsere vorhandenen Callback-Funktionen auch hier ohne &Auml;nderungen.<\/p>\n<h2>Das radioGroup-Element<\/h2>\n<p>Eine <b>radioGroup<\/b> zeigt mehrere Optionsschaltfl&auml;chen, von denen der Benutzer genau eine ausw&auml;hlen kann. Die Kindelemente hei&szlig;en <b>radioButton<\/b>. Genau wie beim <b>dropDown<\/b> verwenden wir im Backstage-Bereich den Callback <b>getSelectedItemIndex<\/b> f&uuml;r die Vorauswahl und <b>onAction<\/b> f&uuml;r &Auml;nderungen:<\/p>\n<pre>&lt;radioGroup id=\"rgModus\"     label=\"Betriebsmodus (radioGroup)\"\r\n    getSelectedItemIndex=\"getSelectedItemIndex\"\r\n    onAction=\"onActionRadio\"&gt;\r\n  &lt;radioButton id=\"rbNormal\" label=\"Normal\r\n      (radioButton)\"\/&gt;\r\n  &lt;radioButton id=\"rbDebug\" label=\"Debug\r\n      (radioButton)\"\/&gt;\r\n  &lt;radioButton id=\"rbSilent\" label=\"Lautlos\r\n      (radioButton)\"\/&gt;\r\n&lt;\/radioGroup&gt;<\/pre>\n<p>Die Prozedur <b>onActionRadio<\/b> hat die gleiche Signatur wie <b>onActionDropDown<\/b> &#8211; sie empf&auml;ngt die <b>id<\/b> des gew&auml;hlten Eintrags und den Index und verarbeitet diese:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>onActionDropDown(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n        selectedID<span style=\"color:blue;\"> As String<\/span>, selectedIndex<span style=\"color:blue;\"> As Integer<\/span>)\r\n    SaveSetting \"Backstage-Beispiel\", \"Optionen\", _\r\n        control.ID, CStr(selectedIndex)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Steuerelemente zur Laufzeit aktualisieren<\/h2>\n<p>Wenn wir aus dem VBA-Code heraus eine Einstellung &auml;ndern, die im Backstage-Bereich angezeigt wird, m&uuml;ssen wir die Anzeige manuell aktualisieren. Daf&uuml;r dient die <b>Invalidate<\/b>-Methode des <b>IRibbonUI<\/b>-Objekts, das wir beim <b>onLoad<\/b>-Callback gespeichert haben:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>m_objRibbon<span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n<span style=\"color:blue;\">Public Sub <\/span>onLoad(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n    <span style=\"color:blue;\">Set<\/span> m_objRibbon = ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Durch den Aufruf <b>m_objRibbon.Invalidate<\/b> veranlassen wir Access, alle Callback-Funktionen wie <b>getText<\/b>, <b>getPressed<\/b> und <b>getSelectedItemIndex<\/b> erneut aufzurufen, sodass die Steuerelemente die aktuellen Werte anzeigen. M&ouml;chten wir nur ein einzelnes Steuerelement aktualisieren, verwenden wir <b>m_objRibbon.InvalidateControl &#8220;txtServer&#8221;<\/b>.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Der Backstage-Bereich von Access l&auml;sst sich &uuml;ber die Tabelle <b>USysRibbons<\/b> und XML-Definitionen im Namespace <b>2009\/07<\/b> umfangreich anpassen. Wir k&ouml;nnen &uuml;ber das <b>button<\/b>-Element einfache Befehle in der Leiste platzieren, mit dem <b>tab<\/b>-Element vollst&auml;ndige Optionsseiten gestalten und eingebaute Bereiche per <b>idMso<\/b> und <b>visible=&#8221;false&#8221;<\/b> ausblenden.<\/p>\n<p>F&uuml;r Benutzereingaben stehen <b>editBox<\/b>, <b>checkBox<\/b>, <b>dropDown<\/b>, <b>comboBox<\/b> und <b>radioGroup<\/b> zur Verf&uuml;gung. Erg&auml;nzt werden sie durch <b>labelControl<\/b> f&uuml;r statische Texte und <b>hyperlink<\/b> f&uuml;r anklickbare Links.<\/p>\n<p>Im n&auml;chsten Artikel mit dem Titel <b>Backstage-Bereich von Office erweitern, Teil 2 <\/b>(<b>www.vbentwickler.de\/500<\/b>) erweitern wir den Backstage-Bereich um die Layout-Elemente <b>groupBox<\/b>, <b>layoutContainer<\/b> und <b>imageControl<\/b>. Au&szlig;erdem zeigen wir, wie man mit <b>taskFormGroup<\/b> und <b>taskGroup<\/b> komplexere Aufgabenbereiche aufbaut.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>BackstageBereichProgrammieren.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/C0848B89-81A1-42E3-A601-3A72BB410F74\/vbe_468.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Klickt man in Access auf den Registerreiter Datei, &ouml;ffnet sich der sogenannte Backstage-Bereich. Hier findet man Befehle wie Speichern, Drucken oder Optionen sowie verschiedene Informationsbereiche. Was viele nicht wissen: Dieser Bereich l&auml;sst sich per XML-Definition umfangreich anpassen. Wir k&ouml;nnen eigene Befehle und Registerkarten hinzuf&uuml;gen, eingebaute Bereiche ausblenden und sogar vollst&auml;ndige Optionsseiten mit Textfeldern, Kontrollk&auml;stchen und Auswahllisten gestalten. In diesem Artikel zeigen wir Schritt f&uuml;r Schritt, wie das in Access funktioniert &#8211; direkt &uuml;ber die Systemtabelle USysRibbons und VBA-Callback-Prozeduren.<\/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":[66022026,662025,662026,66032025,44000027,44000026,44000030,44000036],"tags":[],"yst_prominent_words":[],"class_list":["post-55000468","post","type-post","status-publish","format-standard","hentry","category-66022026","category-662025","category-662026","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}]}}