Das Access Ribbon und seine Programmierung enthält immer noch viele Geheimnisse für uns Access-Entwickler. Dieser Beitrag zeigt einige Techniken, mit denen Sie oft angefragte Konstellationen erhalten – beispielsweise das Ein- und Ausblenden zusätzlicher Ribbon-Elemente mit der Anzeige bestimmter Formulare oder auch das Aktivieren und Deaktivieren von Steuerelementen oder kompletter Ribbon-Bereiche in Abhängigkeit vom Vorhandensein bestimmter Elemente der Benutzeroberfläche.
Voraussetzungen
Für die nachfolgenden Beispiele zum Access Ribbon benötigen Sie ein paar Elemente:
Die Tabelle USysRibbons aus Bild 1 nimmt die Ribbon-Definitionen auf. Sie enthält drei Felder: ID ist das Primärschlüsselfeld, RibbonName speichert den Namen der Ribbon-Definition, der auch in der Eigenschaft Name des Menübands etwa von Formularen erscheint, und RibbonXML schließlich liefert die eigentliche Ribbon-Definition im XML-Format.
Bild 1: Die Tabelle USysRibbons speichert die Ribbon-Definitionen der Anwendung.
Die Tabelle MSysResources speichert die Bilddateien, die das Ribbon anzeigen soll (entweder in der Größe 16×16 oder 32×32) in einem Anlagefeld (s. Bild 2). Den Wert des Feldes Name benötigen Sie, wenn Sie eines der hier gespeicherten Bilder im Ribbon anzeigen möchten.
Bild 2: Die Tabelle MSysResources speichert Bilddateien.
Das Modul mdlRibbonImages enthält einige Funktionen rund um die Anzeige von Bildern im Ribbon, vor allem aber die Funktion PicFromSharedResource_Ribbon. Diese erwartet den Namen einer Bilddatei aus der Tabelle USysResources, also den Wert des Feldes Name der gewünschten Bilddatei.
Damit das Access Ribbon die Bilder anzeigt, müssen Sie dem Attribut loadImage des customUI-Elements den Wert loadImage zuweisen (loadImage=“loadImage“). Diese Funktion wird immer dann aufgerufen, wenn das Attribut image eines Ribbon-Elements den Namen eines Bildes enthält, also zum Beispiel close.
Die Funktion loadImage finden Sie im Modul mdlRibbon, wo wir gleich auch weitere Callback-Funktionen eintragen, die etwa das Anklicken eines Ribbon-Elements auslöst.
Außerdem benötigen Sie einen Verweis auf die Bibliothek Microsoft Office x.0 Object Library für die Verwendung einiger VBA-Elemente für den Zugriff auf das Ribbon.
Access Ribbon-Definition mit Formular einblenden
Wenn Sie eine Ribbon-Definition erstellen, die formular-abhängige Elemente enthält, müssen Sie einfach nur den Namen der in der Tabelle USysRibbons gespeicherten Definition als Wert der Eigenschaft Name des Menübands für das Formular hinterlegen. Wenn Sie dann noch das Attribut startFromScratch des Elements customUI auf True einstellen, blendet die Ribbon-Definition alle eingebauten Ribbon-Elemente aus und zeigt nur noch die benutzerdefinierten Elemente an.
Dies sieht dann beispielsweise wie in Bild 3 aus. Das Ribbon mit der Schaltfläche Formular schließen als einzigem Element wird eingeblendet, wenn der Benutzer das Formular frmFormularMitEigenerDefinition öffnet.
Bild 3: Beispiel für ein Ribbon-Tab, das zusammen mit einem Formular eingeblendet wird
Die Ribbon-Definition für dieses Beispiel finden Sie in Listing 1. Hier beginnen wir mit dem Element customUI, das für das Attribut loadImage den Wert loadImage enthält. Dies ist wichtig, damit Access später auftauchende image-Attribute so verarbeitet, dass es die Funktion loadImage im Modul mdlRibbon aufruft und so die Bilddatei aus der Tabelle USysResources einliest und im Ribbon anzeigt.
<xml version="1.0"> <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" loadImage="loadImage"> <ribbon startFromScratch="true"> <tabs> <tab id="tab1" label="Formulartab"> <group id="grp1" label="Formulargruppe"> <button id="btnFormularSchliessen" image="close" label="Formular schließen" onAction="onAction" size="large"/> </group> </tab> </tabs> </ribbon> </customUI>
Listing 1: Ribbon-Definition für ein Access Ribbon, das bei Anzeige seines Formulars alle anderen Elemente ausblendet
startFromScratch für ein leeres Access Ribbon
Das ribbon-Element enthält das Attribut startFromScratch mit dem Wert true, was dafür sorgt, dass alle eingebauten Elemente des Ribbons verschwinden.
Das tabs-Element fasst ein oder mehrere tab-Elemente zusammen, die den Registerreitern im Ribbon entsprechen. Das einzige tab-Element ist dann auch das mit der Beschriftung Formulartab aus der Abbildung. Gleiches gilt für das group-Element, das im Wesentlichen die Benennung der Gruppe beisteuert.
Fehlt noch die Schaltfläche mit dem Wert btnFormularSchliessen für das Attribut id. Der Wert close für das Attribut image sorgt dafür, dass das Bild namens close aus der Tabelle USysResources geladen wird. Dieses wird nach dem Laden groß dargestellt, also mit einer Auflösung von 32×32 Pixeln (size=“large“). Schließlich soll ein Klick auf die Schaltfläche die VBA-Funktion onAction auslösen (onAction=“onAction“). Diese Funktion sieht so aus:
Sub onAction(control As IRibbonControl) Select Case control.ID Case Else DoCmd.Close acForm, Screen.ActiveForm.Name End Select End Sub
Die Callback-Funktion enthält eine Select Case-Bedingung, weil verschiedene Schaltflächen die Callback-Funktion aufrufen. In unserem Fall soll diese standardmäßig das aktuelle Formular schließen, was die Anweisung DoCmd.Close acForm, Screen.ActiveForm.Name zuverlässig erledigt.
Ribbon-Tab mit Formular einblenden
Sie können auch, wie es etwa bei der Datenblattansicht der Fall ist, einfach ein zusätzliches Tab einfügen, das speziell gekennzeichnet und direkt im Vordergrund angezeigt wird – ein sogenanntes kontextabhängiges tab-Element.
Dies sieht dann beispielsweise wie in Bild 4 aus.
Bild 4: Beispiel für ein kontextabhängiges Ribbon-Tab
Die notwendige Ribbon-Definition finden Sie in Listing 2. Statt des tabs-Elements verwenden wir hier das contextualTabs-Element, dem wiederum ein tabSet-Element untergeordnet ist.
<xml version="1.0">
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" loadImage="loadImage">
<ribbon>
<contextualTabs>
<tabSet idMso="TabSetFormReportExtensibility">
<tab id="tab1" label="Formulartab">
<group id="grp1" label="Formulargruppe">
<button image="close" label="Formular schließen" id="btnFormularSchliessen" onAction="onAction"
size="large"/>
</group>
</tab>
</tabSet>
</contextualTabs>
</ribbon>
</customUI>
Listing 2: Ribbon-Definition für ein Ribbon, das mit einem Formular eingeblendet wird
Erst darunter geht es wie gewohnt weiter – und zwar mit dem tab-Element, dem group-Element und dem button-Element (und weiteren Elementen, je nach Ihren Anforderungen). Das tabSet-Element müssen Sie unbedingt mit dem Wert TabSetFormReportExtensibility für das Attribut idMso ausstatten. Dies gibt an, dass danach benutzerdefinierte Elemente folgen, die beim Aktivieren eines Formulars oder Berichts erscheinen, dessen Eigenschaft Name des Menübands auf den Namen der Ribbon-Definition eingestellt ist.
Dummerweise wird das zusätzliche Tab nur dann direkt in den Vordergrund geholt, wenn Sie das Formular zum ersten Mal öffnen. Außerdem stört noch etwas die übergeordnete Beschriftung, die sich scheinbar nach dem Formularnamen richtet (hier FRMFORMULARMITZUSATZTAB).
Dies lässt sich leicht ändern: Wir tragen einfach den Wert Formular mit Zusatztab in die Eigenschaft Beschriftung des Formulars frmFormularMitZusatztab ein, um die Überschrift zu ändern.
Aktivierung beim Öffnen des Formulars
Fehlt allerdings noch die direkte Aktivierung auch nach dem ersten Öffnen des Formulars. Dazu ist ein kleiner Trick erforderlich: Sie müssen die Ribbon-Definition beim Erstellen mit einer entsprechenden VBA-Objektvariable referenzieren und können das gewünschte tab-Element dann nach öffnen des Formulars zuverlässig in den Vordergrund holen – auch nach dem ersten öffnen des Formulars, wo dies automatisch geschieht.
Dazu sind folgende Schritte nötig:
- Hinzufügen des Attributs onLoad zum Element custom-UI mit dem Wert OnLoad_Formularribbon
- Deklarieren einer Variablen namens objRibbon_Formularribbon des Typs IRibbonUI, welche den Verweis auf die Ribbon-Anpassung speichert im Modul mdlRibbons
- Anlegen einer Callback-Funktion namens OnLoad_Formularribbon, die beim Laden des Ribbons ausgelöst wird und die Variable objRibbon_Formularribbon mit dem Verweis auf die Ribbon-Erweiterung füllt (dies ist der einzige Zeitpunkt, an dem dies möglich ist)
- Anlegen einer Ereignisprozedur im Formular, welche das benutzerdefinierte tab-Element der Ribbon-Definition nach dem öffnen in den Vordergrund holt
Die Access Ribbon-Definition passen Sie wie folgt an und ergänzen dabei das Attribut onLoad des customUI-Elements mit dem Wert OnLoad_Formularribbon:
<xml version="1.0"> <customUI xmlns="..." onLoad="OnLoad_Formularribbon" loadImage="loadImage"> <ribbon> <contextualTabs> ... </contextualTabs> </ribbon> </customUI>
Die Deklaration der Variablen sieht wie folgt aus:
Public objRibbon_Formularribbon As IRibbonUI
Die Prozedur, die durch das Ereignis onLoad der Ribbon-Anpassung ausgelöst wird, sieht so aus:
Sub onLoad_Formularribbon(ribbon As IRibbonUI) Set objRibbon_Formularribbon = ribbon End Sub
Sie speichert lediglich den mit dem Parameter ribbon gelieferten Verweis auf die Ribbon-Anpassung in der Variablen objRibbon_Formularribbon.
Nun müssen wir noch dafür sorgen, dass unser gewünschtes tab-Element beim Öffnen des Formulars aktiviert wird.
Access Ribbon beim Öffnen des Formulars anzeigen
In einem ersten Versuch würden wir dazu die folgende Prozedur nutzen, die durch das Ereignis Beim Laden des Formulars ausgelöst wird und mit der Methode ActivateTab das tab-Element namens tabForm aktivieren soll:
Private Sub Form_Load() objRibbon_Formularribbon.ActivateTab "tabForm" End Sub
Dies gelingt allerdings nicht: Anscheinend ist das tab-Element zu diesem Zeitpunkt noch gar nicht geladen, also liefert der Zugriff auf die Variable objRibbon_Formularribbon eine Fehlermeldung. Also probieren wir es mit ein wenig Verzögerung. Dazu stellen Sie die Eigenschaft Zeitgeberintervall des Formulars auf den Wert 100 ein. Dies löst im Abstand von 100 Millisekunden die für die Ereigniseigenschaft Bei Zeitgeber hinterlegte Ereignisprozedur aus. Damit dies nur einmal geschieht, stellen wir in dieser Prozedur gleich das Zeitgeberintervall auf den Wert 0 ein – neben dem Aktivieren des tab-Elements natürlich:
Private Sub Form_Timer() objRibbon_Formularribbon.ActivateTab "tabForm" Me.TimerInterval = 0 End Sub
Auf diese Weise erhalten Sie zuverlässig direkt mit dem öffnen des Formulars auch Zugriff auf die gewünschten Ribbon-Befehle.
Verhindern, dass eingebaute kontextabhängige Ribbon-Tabs erscheinen
Wenn Sie nicht möchten, dass beispielsweise beim Anzeigen eines Formulars in der Datenblattansicht auch die Befehle zum Bearbeiten des Datenblatts erscheinen (s. Bild 5), können Sie diese ebenfalls deaktivieren.
Bild 5: Eingebaute kontextabhängige Ribbon-Tabs
Dazu greifen Sie nicht wie üblich über die Struktur customUI|ribbon|tabs|tab auf das tab-Element zu und stellen seine Eigenschaft visible auf false ein, sondern über customUI|ribbon|contextualTabs|tabSet.
Folgendes würde beispielsweise dafür sorgen, dass das in der Abbildung darstellte tab-Element beim Aktivieren eines Formulars in der Datenblattansicht ausgeblendet wird:
<xml version="1.0">
<customUI xmlns="...">
<ribbon>
<contextualTabs>
<tabSet idMso="TabSetFormDatasheet" visible="false"/>
</contextualTabs>
</ribbon>
</customUI>
Damit Sie, wenn Sie einmal ein kontextabhängiges Element ausblenden möchten, nicht lange suchen müssen, finden Sie hier eine Liste der möglichen Elemente:
- TabSetFormToolsLayout: Formularlayouttools (für Layout-Ansicht von Formularen)
- TabSetFormTools: Formularentwurfstools (für Entwurfsansicht von Formularen)
- TabSetReportToolsLayout: Berichtslayouttools
- TabSetReportTools: Berichtsentwurfstools
- TabSetRelationshipTools: Beziehungstools|Entwurf für das Beziehungen-Fenster
- TabSetQueryTools: Abfragetools|Entwurf
- TabSetMacroTools: Makrotools|Entwurf
- TabSetPivotTableAccess: ab Access 2013 nicht mehr unterstützt
- TabSetPivotChartAccess: ab Access 2013 nicht mehr unterstützt
- TabSetTableToolsDatasheet: Tabellentools|Felder/Entwurf
- TabSetTableToolsDesign: Tabellentools|Entwurf
- TabSetFormDatasheet: Formulartools|Datenblatt
- TabSetAdpFunctionAndViewTools: für Access Data Projects, werden in aktuellen Versionen nicht mehr unterstützt
- TabSetAdpStoredProcedure: für Access Data Projects, diese werden in aktuellen Versionen allerdings nicht mehr unterstützt
- TabSetAdpSqlStatement: für Access Data Projects, werden in aktuellen Versionen nicht mehr unterstützt
- TabSetAdpDiagram: für Access Data Projects, werden in aktuellen Versionen nicht mehr unterstützt
- TabSetFormReportExtensibility: Spezialfall für benutzerdefinierte kontextabhängige Ribbon-Tabs, die mit Formularen oder Berichten eingeblendet werden können.
Kontextabhängige tab-Elemente für Unterformulare
Sollten Sie eine Konstellation aus Haupt- und Unterformular nutzen, wobei beispielsweise das Unterformular Daten in der Datenblattansicht anzeigt, möchten Sie vielleicht verhindern, dass immer beim Aktivieren der Datenblattansicht der Ribbonbereich Formulartools|Datenblatt eingeblendet wird.
Das haben wir doch weiter oben besprochen, denken Sie nun vielleicht. Stimmt: Allerdings haben wir dort das Ribbon mit dem Namen KontextTabsDeaktivieren für die Eigenschaft Name des Menübands des Hauptformulars ausgewählt.
Wenn der Benutzer dann allerdings den Fokus auf das Unterformular verschiebt, gelten die Ribbon-Definitionen für das Hauptformular nicht mehr, sondern die des Unterformulars. Und dort haben wir zu diesem Zeitpunkt ja noch gar keine Einstellung der Eigenschaft Name des Menübands vorgenommen.
Dies holen wir wie in Bild 6 nach: Markieren Sie das Unterformular und wählen Sie für Name des Menübands den Wert KontextTabsDeaktivieren aus. Nun können Sie in die Formularansicht wechseln und den Fokus auf das Unterformular verschieben – die Anzeige des Ribbon-Bereichs Formulartools|Datenblatt bleibt aus.
Bild 6: Ribbon für das Unterformular festlegen
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo