Backstage-Bereich von Access erweitern, Teil 1

Klickt man in Access auf den Registerreiter Datei, ö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ässt sich per XML-Definition umfangreich anpassen. Wir können eigene Befehle und Registerkarten hinzufügen, eingebaute Bereiche ausblenden und sogar vollständige Optionsseiten mit Textfeldern, Kontrollkästchen und Auswahllisten gestalten. In diesem Artikel zeigen wir Schritt für Schritt, wie das in Access funktioniert – direkt über die Systemtabelle USysRibbons und VBA-Callback-Prozeduren.

Beispieldatenbank

Die Beispiele zu diesem Artikel findest Du in der Beispieldatenbank. Diese enthält ein Modul mdlBackstageReferenz, das die Tabelle USysRibbons anlegt und mit der XML-Definition befüllt. Die Callback-Prozeduren befinden sich im Modul mdlBackstageCallbacks. Führe im Direktbereich die Prozedur BackstageReferenz aus, um die Tabelle zu erstellen.

Danach trägst Du unter Datei|Optionen|Aktuelle Datenbank den Ribbon-Namen BackstageRef ein und startest Access neu (siehe Bild 1).

Auswählen der aktuellen Ribbon-Definition

Bild 1: Auswählen der aktuellen Ribbon-Definition

Hilfsformular zum Bearbeiten der Ribbon-Definitionen

In der Beispieldatenbank findest Du ein Formular namens frmRibbonXML, mit dem Du die Ribbon-Definitionen einfacher bearbeiten kannst, als direkt in der Tabelle (siehe Bild 2).

Formular zum Bearbeiten der Ribbon-Definitionen

Bild 2: Formular zum Bearbeiten der Ribbon-Definitionen

Voraussetzungen

Die Backstage-Definition verwendet den Namespace http://schemas.microsoft.com/office/2009/07/customui. Dieser wurde mit Office 2010 eingeführt und ist die Voraussetzung dafür, dass das backstage-Element überhaupt zur Verfügung steht. Der ältere Namespace 2006/01 kennt kein backstage-Element.

Jede Backstage-Definition beginnt daher mit dem folgenden Grundgerüst:

<customUI xmlns=
    "http://schemas.microsoft.com/office/2009/07/customui"
      onLoad="onLoad">
  <backstage>
    ...
  </backstage>
</customUI>

Das Attribut onLoad im customUI-Element verweist auf eine VBA-Callback-Prozedur, die beim Laden der Ribbon-Definition aufgerufen wird. Sie übergibt ein IRibbonUI-Objekt, das wir in einer Modulvariablen speichern. Darüber können wir später die Anzeige aller Steuerelemente aktualisieren. Dazu legen wir im Modul mdlBackstage die folgenden Elemente an:

Dim m_objRibbon As IRibbonUI
Public Sub onLoad(ribbon As IRibbonUI)
    Set m_objRibbon = ribbon
End Sub

Die Tabelle USysRibbons

In Access speichern wir Ribbon- und Backstage-Definitionen in der Systemtabelle USysRibbons. Diese Tabelle enthält mindestens die Spalten RibbonName (Textfeld) und RibbonXml (Memofeld) – siehe Bild 3.

Die Tabelle USysRibbons

Bild 3: Die Tabelle USysRibbons

Den Namen aus der Spalte RibbonName tragen wir unter Datei|Optionen|Aktuelle Datenbank im Feld Name des Menübands ein. Beim nächsten Start der Datenbank liest Access die zugehörige XML-Definition ein und wendet sie an. Die Tabelle ist als Systemtabelle nur sichtbar, wenn Du im Navigationsbereich unter Navigationsoptionen die Option Systemobjekte anzeigen aktivierst.

Die eingebauten Backstage-Elemente

Bevor wir eigene Elemente hinzufügen, werfen wir einen Blick auf die eingebauten Elemente des Backstage-Bereichs. Jedes Element besitzt einen eindeutigen idMso-Wert, über den wir es referenzieren. In der Reihenfolge ihres Erscheinens sind das: PlaceTabHome (Startseite), TabOfficeStart (Office-Start), TabRecent (Zuletzt verwendet), TabInfo (Informationen), FileSave (Speichern-Befehl), TabSave (Speichern unter), TabPrint (Drucken), FileCloseDatabase (Schließen-Befehl), TabHelp (Hilfe), TabOfficeFeedback (Feedback) und ApplicationOptionsDialog (Optionen-Befehl).

Es gibt also zwei Typen:

tab-Elemente öffnen beim Anklicken einen Inhaltsbereich auf der rechten Seite, button-Elemente führen direkt eine Aktion aus (siehe Bild 4).

Der Standard-Backstage-Bereich von Access mit allen eingebauten Elementen

Bild 4: Der Standard-Backstage-Bereich von Access mit allen eingebauten Elementen

Ein eigener Befehl im Backstage-Bereich

Wir starten mit einem einfachen Befehl: einem button-Element direkt unterhalb von backstage.

Den folgenden Code fügen wir wie in Bild 5 in die Tabelle USysRibbons ein und öffnen die Anwendung danach neu. Du findest die Ribbon-Definition in der Tabelle USysRibbons unter EigenerBefehl. Dann stellen wir in den Optionen die Eigenschaft Menüband auf EigenerBefehl ein, also auf den Wert der Spalte RibbonName:

Ribbon-Definition für eine neue Schaltfläche im Backstage-Bereich

Bild 5: Ribbon-Definition für eine neue Schaltfläche im Backstage-Bereich

<customUI     xmlns="http://schemas.microsoft.com/office/2009/07/        customui" onLoad="onLoad">
  <backstage>
     <button id="btnSchnell" 
       label="Schnellbefehl (button)"         insertAfterMso="TabInfo"        imageMso="FileSave"        onAction="onAction"/>
  </backstage>
</customUI>

Dieses Element erscheint in der linken Befehlsleiste – genau wie die eingebauten Befehle Speichern oder Schließen (siehe Bild 6).

Neuer Befehl im Backstage-Bereich

Bild 6: Neuer Befehl im Backstage-Bereich

Das Attribut insertAfterMso=”TabInfo” sorgt dafür, dass der Befehl nach dem Informationen-Bereich eingefügt wird. Mit imageMso weisen wir eines der eingebauten Office-Icons zu. Der Callback onAction verweist auf die VBA-Prozedur, die beim Klick aufgerufen wird. Die Signatur dieser Prozedur sieht so aus:

Public Sub onAction(control As IRibbonControl)
    MsgBox "onAction: " & control.Id
End Sub

Die Prozedur empfängt ein IRibbonControl-Objekt. Über dessen Eigenschaft Id lässt sich ermitteln, welches Steuerelement den Aufruf ausgelöst hat. So können wir mit einer einzigen Prozedur die Klicks mehrerer Backstage-Elemente verarbeiten.

Eine eigene Registerkarte anlegen

Über das tab-Element legen wir eine eigene Registerkarte an. Diese erzeugt einen Eintrag in der linken Befehlsleiste, der beim Anklicken einen Inhaltsbereich auf der rechten Seite öffnet. Das tab-Element enthält bis zu zwei Spalten: firstColumn und optional secondColumn:

<tab id="tabSteuer"
    label="Steuerelemente (tab)"
    insertAfterMso="TabInfo">
  <firstColumn>
    ...
  </firstColumn>
  <secondColumn>
    ...
  </secondColumn>
</tab>

Innerhalb der Spalten platzieren wir group-Elemente, die Steuerelemente thematisch zusammenfassen. Die Hierarchie lautet: tab enthält firstColumn/secondColumn, diese enthalten group-Elemente, und darin befinden sich die Steuerelemente.

Ohne diese group-Elemente sehen wir noch keine Elemente, wenn wir diese Ribbon-Definition anwenden. Also fügen wir diese nun hinzu. Den vollständigen Code findest Du in der Tabelle USysRibbons unter EigeneRegisterkarte. Wir erläutern diesen im Anschluss schrittweise.

Gruppen mit primaryItem, topItems und bottomItems

Das group-Element im Backstage-Bereich unterscheidet sich deutlich von dem im Ribbon. Es kann drei Unterbereiche enthalten: primaryItem, topItems und bottomItems. Das primaryItem zeigt ein großes Steuerelement (einen Button oder ein Menü) auf der linken Seite der Gruppe (siehe Bild 7).

Ein Element im Bereich primaryItem

Bild 7: Ein Element im Bereich primaryItem

topItems und bottomItems enthalten die regulären Steuerelemente oberhalb beziehungsweise unterhalb einer gedachten Trennlinie. Das Attribut helperText zeigt einen erläuternden Text unterhalb des Gruppennamens:

<group id="grpTexte"
    label="Texteingaben (group)"
    helperText="Dieser Text kommt aus dem Attribut helperText.">
  <primaryItem>
    <button id="btnSpeichern"
        label="Speichern
        (primaryItem > button)"
        imageMso="FileSave"
        onAction="onAction"/>
  </primaryItem>
  <topItems>
    ...
  </topItems>
  <bottomItems>
    ...
  </bottomItems>
</group>

Elemente im Bereich topItems

Im Bereich topItems haben wir einige Elemente wie ein labelControl– und mehrere editBox-Elemente untergebracht. Diese werden wie folgt definiert:

<topItems>
  <labelControl id="lblHinweis"     label="Dies ist ein labelControl"/>
  <editBox id="txtServer" label="Server (editBox)"     getText="getText" onChange="onChange"     sizeString="yyyyyyyyyyyyyyyyyy"/>
  <editBox id="txtDatenbank" label="Datenbank (editBox)"     getText="getText" onChange="onChange"     sizeString="yyyyyyyyyyyyyyyyyy"/>
  <editBox id="txtBenutzer" label="Benutzer (editBox)"     getText="getText" onChange="onChange"     sizeString="yyyyyyyyyyyyyyyyyy"/>
</topItems>

Das Ergebnis sehen wir in Bild 8.

Ein Element im Bereich topItem

Bild 8: Ein Element im Bereich topItem

Wichtig: Die Überschrift

Wie wir in der Abbildung sehen, “kleben” die Elemente alle am oberen Rand. Das liegt daran, dass wir die Überschrift noch ausgespart haben. Diese fügen wir nicht etwa als eigenes Element ein, aondern wir legen diese direkt für das tab-Element fest:

<tab id="tabSteuer" label="Steuerelemente (tab)" 
  insertBeforeMso="FileSave" 
  title="Beispiele für Steuerelemente">

Damit sieht der Bereich bereits viel harmonischer aus (siehe Bild 9).

Klickt man in Access auf den Registerreiter Datei, ö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ässt sich per XML-Definition umfangreich anpassen. Wir können eigene Befehle und Registerkarten hinzufügen, eingebaute Bereiche ausblenden und sogar vollständige Optionsseiten mit Textfeldern, Kontrollkästchen und Auswahllisten gestalten. In diesem Artikel zeigen wir Schritt für Schritt, wie das in Access funktioniert – direkt über die Systemtabelle USysRibbons und VBA-Callback-Prozeduren.

Beispieldatenbank

Die Beispiele zu diesem Artikel findest Du in der Beispieldatenbank. Diese enthält ein Modul mdlBackstageReferenz, das die Tabelle USysRibbons anlegt und mit der XML-Definition befüllt. Die Callback-Prozeduren befinden sich im Modul mdlBackstageCallbacks. Führe im Direktbereich die Prozedur BackstageReferenz aus, um die Tabelle zu erstellen.

Danach trägst Du unter Datei|Optionen|Aktuelle Datenbank den Ribbon-Namen BackstageRef ein und startest Access neu (siehe Bild 1).

Auswählen der aktuellen Ribbon-Definition

Bild 1: Auswählen der aktuellen Ribbon-Definition

Hilfsformular zum Bearbeiten der Ribbon-Definitionen

In der Beispieldatenbank findest Du ein Formular namens frmRibbonXML, mit dem Du die Ribbon-Definitionen einfacher bearbeiten kannst, als direkt in der Tabelle (siehe Bild 2).

Formular zum Bearbeiten der Ribbon-Definitionen

Bild 2: Formular zum Bearbeiten der Ribbon-Definitionen

Voraussetzungen

Die Backstage-Definition verwendet den Namespace http://schemas.microsoft.com/office/2009/07/customui. Dieser wurde mit Office 2010 eingeführt und ist die Voraussetzung dafür, dass das backstage-Element überhaupt zur Verfügung steht. Der ältere Namespace 2006/01 kennt kein backstage-Element.

Jede Backstage-Definition beginnt daher mit dem folgenden Grundgerüst:

<customUI xmlns=
    "http://schemas.microsoft.com/office/2009/07/customui"
      onLoad="onLoad">
  <backstage>
    ...
  </backstage>
</customUI>

Das Attribut onLoad im customUI-Element verweist auf eine VBA-Callback-Prozedur, die beim Laden der Ribbon-Definition aufgerufen wird. Sie übergibt ein IRibbonUI-Objekt, das wir in einer Modulvariablen speichern. Darüber können wir später die Anzeige aller Steuerelemente aktualisieren. Dazu legen wir im Modul mdlBackstage die folgenden Elemente an:

Dim m_objRibbon As IRibbonUI
Public Sub onLoad(ribbon As IRibbonUI)
    Set m_objRibbon = ribbon
End Sub

Die Tabelle USysRibbons

In Access speichern wir Ribbon- und Backstage-Definitionen in der Systemtabelle USysRibbons. Diese Tabelle enthält mindestens die Spalten RibbonName (Textfeld) und RibbonXml (Memofeld) – siehe Bild 3.

Die Tabelle USysRibbons

Bild 3: Die Tabelle USysRibbons

Den Namen aus der Spalte RibbonName tragen wir unter Datei|Optionen|Aktuelle Datenbank im Feld Name des Menübands ein. Beim nächsten Start der Datenbank liest Access die zugehörige XML-Definition ein und wendet sie an. Die Tabelle ist als Systemtabelle nur sichtbar, wenn Du im Navigationsbereich unter Navigationsoptionen die Option Systemobjekte anzeigen aktivierst.

Die eingebauten Backstage-Elemente

Bevor wir eigene Elemente hinzufügen, werfen wir einen Blick auf die eingebauten Elemente des Backstage-Bereichs. Jedes Element besitzt einen eindeutigen idMso-Wert, über den wir es referenzieren. In der Reihenfolge ihres Erscheinens sind das: PlaceTabHome (Startseite), TabOfficeStart (Office-Start), TabRecent (Zuletzt verwendet), TabInfo (Informationen), FileSave (Speichern-Befehl), TabSave (Speichern unter), TabPrint (Drucken), FileCloseDatabase (Schließen-Befehl), TabHelp (Hilfe), TabOfficeFeedback (Feedback) und ApplicationOptionsDialog (Optionen-Befehl).

Es gibt also zwei Typen:

tab-Elemente öffnen beim Anklicken einen Inhaltsbereich auf der rechten Seite, button-Elemente führen direkt eine Aktion aus (siehe Bild 4).

Der Standard-Backstage-Bereich von Access mit allen eingebauten Elementen

Bild 4: Der Standard-Backstage-Bereich von Access mit allen eingebauten Elementen

Ein eigener Befehl im Backstage-Bereich

Wir starten mit einem einfachen Befehl: einem button-Element direkt unterhalb von backstage.

Den folgenden Code fügen wir wie in Bild 5 in die Tabelle USysRibbons ein und öffnen die Anwendung danach neu. Du findest die Ribbon-Definition in der Tabelle USysRibbons unter EigenerBefehl. Dann stellen wir in den Optionen die Eigenschaft Menüband auf EigenerBefehl ein, also auf den Wert der Spalte RibbonName:

Ribbon-Definition für eine neue Schaltfläche im Backstage-Bereich

Bild 5: Ribbon-Definition für eine neue Schaltfläche im Backstage-Bereich

<customUI     xmlns="http://schemas.microsoft.com/office/2009/07/        customui" onLoad="onLoad">
  <backstage>
     <button id="btnSchnell" 
       label="Schnellbefehl (button)"         insertAfterMso="TabInfo"        imageMso="FileSave"        onAction="onAction"/>
  </backstage>
</customUI>

Dieses Element erscheint in der linken Befehlsleiste – genau wie die eingebauten Befehle Speichern oder Schließen (siehe Bild 6).

Neuer Befehl im Backstage-Bereich

Bild 6: Neuer Befehl im Backstage-Bereich

Das Attribut insertAfterMso=”TabInfo” sorgt dafür, dass der Befehl nach dem Informationen-Bereich eingefügt wird. Mit imageMso weisen wir eines der eingebauten Office-Icons zu. Der Callback onAction verweist auf die VBA-Prozedur, die beim Klick aufgerufen wird. Die Signatur dieser Prozedur sieht so aus:

Public Sub onAction(control As IRibbonControl)
    MsgBox "onAction: " & control.Id
End Sub

Die Prozedur empfängt ein IRibbonControl-Objekt. Über dessen Eigenschaft Id lässt sich ermitteln, welches Steuerelement den Aufruf ausgelöst hat. So können wir mit einer einzigen Prozedur die Klicks mehrerer Backstage-Elemente verarbeiten.

Eine eigene Registerkarte anlegen

Über das tab-Element legen wir eine eigene Registerkarte an. Diese erzeugt einen Eintrag in der linken Befehlsleiste, der beim Anklicken einen Inhaltsbereich auf der rechten Seite öffnet. Das tab-Element enthält bis zu zwei Spalten: firstColumn und optional secondColumn:

<tab id="tabSteuer"
    label="Steuerelemente (tab)"
    insertAfterMso="TabInfo">
  <firstColumn>
    ...
  </firstColumn>
  <secondColumn>
    ...
  </secondColumn>
</tab>

Innerhalb der Spalten platzieren wir group-Elemente, die Steuerelemente thematisch zusammenfassen. Die Hierarchie lautet: tab enthält firstColumn/secondColumn, diese enthalten group-Elemente, und darin befinden sich die Steuerelemente.

Ohne diese group-Elemente sehen wir noch keine Elemente, wenn wir diese Ribbon-Definition anwenden. Also fügen wir diese nun hinzu. Den vollständigen Code findest Du in der Tabelle USysRibbons unter EigeneRegisterkarte. Wir erläutern diesen im Anschluss schrittweise.

Gruppen mit primaryItem, topItems und bottomItems

Das group-Element im Backstage-Bereich unterscheidet sich deutlich von dem im Ribbon. Es kann drei Unterbereiche enthalten: primaryItem, topItems und bottomItems. Das primaryItem zeigt ein großes Steuerelement (einen Button oder ein Menü) auf der linken Seite der Gruppe (siehe Bild 7).

Ein Element im Bereich primaryItem

Bild 7: Ein Element im Bereich primaryItem

topItems und bottomItems enthalten die regulären Steuerelemente oberhalb beziehungsweise unterhalb einer gedachten Trennlinie. Das Attribut helperText zeigt einen erläuternden Text unterhalb des Gruppennamens:

<group id="grpTexte"
    label="Texteingaben (group)"
    helperText="Dieser Text kommt aus dem Attribut helperText.">
  <primaryItem>
    <button id="btnSpeichern"
        label="Speichern
        (primaryItem > button)"
        imageMso="FileSave"
        onAction="onAction"/>
  </primaryItem>
  <topItems>
    ...
  </topItems>
  <bottomItems>
    ...
  </bottomItems>
</group>

Elemente im Bereich topItems

Im Bereich topItems haben wir einige Elemente wie ein labelControl– und mehrere editBox-Elemente untergebracht. Diese werden wie folgt definiert:

<topItems>
  <labelControl id="lblHinweis"     label="Dies ist ein labelControl"/>
  <editBox id="txtServer" label="Server (editBox)"     getText="getText" onChange="onChange"     sizeString="yyyyyyyyyyyyyyyyyy"/>
  <editBox id="txtDatenbank" label="Datenbank (editBox)"     getText="getText" onChange="onChange"     sizeString="yyyyyyyyyyyyyyyyyy"/>
  <editBox id="txtBenutzer" label="Benutzer (editBox)"     getText="getText" onChange="onChange"     sizeString="yyyyyyyyyyyyyyyyyy"/>
</topItems>

Das Ergebnis sehen wir in Bild 8.

Ein Element im Bereich topItem

Bild 8: Ein Element im Bereich topItem

Wichtig: Die Überschrift

Wie wir in der Abbildung sehen, “kleben” die Elemente alle am oberen Rand. Das liegt daran, dass wir die Überschrift noch ausgespart haben. Diese fügen wir nicht etwa als eigenes Element ein, aondern wir legen diese direkt für das tab-Element fest:

<tab id="tabSteuer" label="Steuerelemente (tab)" 
  insertBeforeMso="FileSave" 
  title="Beispiele für Steuerelemente">

Damit sieht der Bereich bereits viel harmonischer aus (siehe Bild 9).

Access, SQL und Cloud Automation

Unser exklusives Angebot für Dich!

VB-Entwickler
12,50 € im Monat*

(Gilt für den Abschluss eines Jahres-Abonnements.)

Hier geht’s weiter →

Die ersten 4 Wochen kostenlos testen – voller Zugriff auf alle Artikel, vollständigen Code und Beispieldatenbanken. Kein Risiko: Wenn es nicht passt, kündigst Du einfach innerhalb der ersten vier Wochen.

PayPal VISA Mastercard SEPA
Kostenlos & unverbindlich

Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?

Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?

In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.

Jetzt kostenloses Access-Audit anfordern →