CLS: Tipps & Tricks: Ribbons



Tipps & Tricks: Ribbons

Auf dieser Seite finden Sie 10 Tipps & Tricks für Ribbons. Soweit keine Einschränkungen dazu genannt werden, gelten diese Tipps & Tricks für alle Office-Versionen ab 2007.

Wenn in den folgenden Erläuterungen Texte wie MsgBox formatiert sind, handelt es sich um konkret einzugebende Inhalte wie VBA-Code oder die Eingabe von Werten. Menüs wie Datei Speichern sind wie hier zu sehen formatiert. Schaltflächen oder Registerkarten auf Dialogen werden wie Menüs behandelt.

Alle Tipps sind nach bestem Wissen geprüft, aber selbstverständlich ohne Gewähr. Sollten Sie doch einen Fehler darin entdecken, würden wir uns freuen, wenn Sie uns per E-Mail Bescheid sagen.

Der Custom UI Editor zeigt die geladenen Bilder erst an, wenn Sie den XML-Code wenigstens einmal in der Datei gespeichert haben. Ansonsten scheinen die Bilder ohne Fehlermeldung nicht geöffnet zu werden. Der Custom UI Editor zeigt die geladenen Bilder erst an, wenn Sie den XML-Code wenigstens einmal in der Datei gespeichert haben. Ansonsten scheinen die Bilder ohne Fehlermeldung nicht geöffnet zu werden.

Wer mal ein eigenes Ribbon anlegen will, meint meistens gar nicht das ganze Ribbon, sondern "nur" eine eigene Registerkarte darin. Starten Sie dazu den Custom UI Editor und öffnen die bereits vorher erstellte Datei (bei Word beispielsweise MeinRibbon.dotm, es müssen Makros darin speicherbar sein). Der Custom UI Editor zeigt nur den Ribbon-XML-Code und die Icons der Datei, nicht aber den VBA-Code.

Da es noch keine XML-Beschreibung gibt, klicken Sie am besten auf Sample Custom Tab. Damit erzeugen Sie automatisch eine komplette Struktur für eine Schaltfläche "Custom Button" in einem Register "Custom Tab".

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="customTab" label="Custom Tab">
<group id="customGroup" label="Custom Group">
<button id="customButton" label="Custom Button" imageMso="HappyFace" size="large" onAction="Callback" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Das Bild auf dem Ribbon ist eines der intern vorhandenen Bilder, daher wird hier das imageMso-Attribut auf den vorhandenen Namen HappyFace gesetzt.

Damit die Schaltfläche nach dem Anklicken auch eine Reaktion zeigt, müssen Sie in der Datei in einem beliebigen Modul eine VBA-Prozedur Callback vorbereiten:

Sub Callback(control As IRibbonControl)
MsgBox "Hallo!"
End Sub

Der Prozedurname Callback ist allerdings im automatisch erzeugten Beispiel nicht sehr glücklich gewählt, sinnvoller wäre etwas wie OnActionButton.

Wenn Sie tatsächlich komplett eigene Ribbons für eine Datei anlegen wollen, müssen Sie im XML-Code <ribbon startFromScratch="true"> einstellen. Sie blenden damit alle vorhandenen Ribbon-Register (in dieser Datei) aus und müssen diese notfalls wieder selber codieren, wenn Sie Teile davon trotzdem brauchen.

Diese Einstellung ist zwingend, wenn Sie Änderungen an der Schnellzugriffsleiste (QAT = Quick Access Tool) per XML vornehmen wollen. Es ist also nicht möglich, zusätzlich zu einem selbst hinzugefügten (!) Register Befehle in die Schnellzugriffsleiste aufzunehmen. Sobald Sie Befehle in die Schnellzugriffsleiste per XML einbauen, verlieren Sie ja die eingebauten Ribbons.

Wie Sie im Tipp "Eigenes Ribbon anlegen / Schnellzugriffsleiste" bereits gelesen haben, ist es offiziell nicht möglich, die Schnellzugriffsleiste per Vorgabe zu verändern, wenn Sie eigene Ribbons erzeugen wollen. Und es geht doch!

Der Trick besteht darin, dass Sie die Schnellzugriffsleiste manuell verändern können, ohne eine XML-Definition dafür einzusetzen. Mit XML ginge es tatsächlich nicht, so dass Sie hier auf die Programmierbarkeit der Befehle via Callback verzichten müssen. Für das Einfügen von vorhandenen Systembefehlen reicht es aber völlig aus.

Klicken Sie im DropDown-Menü der Schnellzugriffsleiste auf den Eintrag Weitere Befehle und stellen in der Kategorie "Anpassen" rechts oben das Kombinationsfeld "Symbolleiste für den Schnellzugriff anpassen" auf den zweiten Eintrag Für 'meinDokumentname'. Dann wählen Sie beliebige Befehle für die Schnellzugriffsleiste aus.

Unabhängig davon können Sie eigene Register mit <ribbon startFromScratch="false"> im XML-Code definieren.

Die Ribbons können endlich das, was bei Menüs oder gar Symbolleisten kaum brauchbar zu organisieren war: Ihre Inhalte entstehen gemischt aus mehreren Dateien. Typischerweise ist das ein AddIn für die allgemeinen Inhalte und eine Dokumentvorlage für Spezielles.

Es können nicht zwei Dokumentvorlagen als Quelle sein, weil diese nicht gleichzeitig geöffnet sein können. Zwei AddIns hingegen sind durchaus für dieselbe Datei geöffnet, damit wäre es auch möglich. Das folgende Beispiel zeigt die Technik mit einem Addin namens GemischtHaupt.dotm und einer Dokumentvorlage namens GemischtUnter.dotm.

Die Dateien selber sind hier noch völlig leer und erhalten zuerst einmal die XML-Beschreibung der Ribbons, hier für das Haupt-Addin GemischtHaupt.dotm:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:Q="Gemischt" >
<ribbon startFromScratch="false">
<tabs>
<tab idQ="Q:tabGemischt" label="Gemischt">
<group id="grpHaupt" label="Hauptgruppe">
<button id="btnHaupttest" label="Test aus Haupt-Addin" imageMso="HappyFace" size="large" onAction="OnActionButton" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Dabei besteht der wesentliche Unterschied zu einem "normalen" XML-Code im Attribut xmlns:Q beziehungsweise idQ. Das Haupt-Ribbon erzeugt so einen eigenen Namespace. Darauf können Sie in der anderen XML-Beschreibung des Unter-Ribbons in der Unter-Dokumentvorlage GemischtUnter.dotm Bezug nehmen:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:Q="Gemischt" >
<ribbon startFromScratch="false">
<tabs>
<tab idQ="Q:tabGemischt" >
<group id="grpUnter" label="Untergruppe">
<button id="btnUntertest" label="Test aus Unter-Vorlage" imageMso="HappyFace" size="large" onAction="OnActionButton" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Ohne weitere Programmierung erzeugt das AddIn dieses Ribbon:

Sobald Sie eine Datei auf Basis der Dokument-Vorlage GemischtUnter.dotm anlegen, sehen Sie die zweite Schaltfläche im gleichen Ribbon (genau genommen im gleichen Register = tab des Ribbons):

Jetzt geht es noch um die Programmierung der OnAction-Callbacks. Im Addin GemischtHaupt.dotm schreiben Sie in einem Modul folgenden Code:

Sub OnActionButton(control As IRibbonControl)
Select Case control.ID
Case "btnHaupttest": MsgBox "Das ist der Haupttest."
Case "btnUntertest": MsgBox "Das ist der Untertest aus der Hauptdatei."
Case Else: MsgBox "Fehlt noch!", vbCritical
End Select
End Sub

Tatsächlich enthält die Unter-Dokumentvorlage derzeit noch überhaupt keinen Callback-Code, trotzdem werden beide Schaltflächen korrekt reagieren.

Sie können diese Technik auch umkehren und beide Aktionen in der Unter-Dokumentvorlage GemischtUnter.dotm verarbeiten:

Sub OnActionButton(control As IRibbonControl)
Select Case control.ID
Case "btnHaupttest": MsgBox "Das ist der Haupttest in der Unter-Dokumentvorlage."
Case "btnUntertest": MsgBox "Das ist der Untertest."
Case Else: MsgBox "Fehlt noch!", vbCritical
End Select
End Sub

Diesmal werden beim Anklicken der Schaltflächen jeweils die Aktionen aus der Unter-Dokumentvorlage aufgerufen. Die Callback-Prozeduren werden also zuerst in der Dokumentvorlage und danach gleichnamig in einem AddIn gesucht. Sobald die Unter-Dokumentvorlage geschlossen ist, reagiert wieder die OnActionButton-Prozedur des Addins.

Menüs hinzufügen ID 429 Aktuell

Auch wenn offiziell seit Office 2007 die bisherigen Menüs durch die Fluent-Oberfläche mit Ribbons abgeschafft wurde, gibt es weiterhin Menüs, sogar noch mit erweiterten Fähigkeiten. Erstellen Sie in einer leeren Word-Datei mit dem folgenden XML-Code die drei folgenden Versionen für Menüs:

Die ersten Menüs enthalten die einfache Variante, bei der wie bisher nur der Menütitel enthalten ist. Neu ist dabei schon das menuSeparator-Element, welches einen Zwischentitel für Menüs erlaubt.

Sie müssen beim menuSeparator-Element jedoch aufpassen, weil das Attribut dort nicht label, sondern title heißt. Die Menüeinträge lassen sich erwartungsgemäß auch mit Bildern versehen, da es sich ja ohnehin um button-Objekte handelt:

Anders als bisher lassen sich die Menüeinträge nicht nur mit großen Bildern anzeigen (Achtung: diese Einstellung ist ein itemSize-Attribut im übergeordneten menu-Element!), sondern auch mit einer zusätzlichen description versehen:

Die description darf auch mehrzeilig sein, wie Sie sehen können. Der benutzte VBA-Code entspricht demjenigen aus dem Tipp "Schaltflächen hinzufügen".

Die Office 2007-Oberfläche wird komplett anders beschrieben und programmiert als bisherige Menüs. Die Beschreibung wird in XML gespeichert und die Programmierung weiterhin in VBA durchgeführt. Eine Schaltfläche hätte beispielsweise die folgende XML-Beschreibung:

<button label="Klick mich!">

Damit ist die Schaltfläche zwar mit einem Text versehen, aber dieser ist statisch. Wenn Sie diese oder andere Eigenschaften dynamisch per VBA regeln möchten, brauchen Sie so genannte Callback-Prozeduren. Im XML-Code stehen dabei frei wählbare Prozedur-Namen hinter dem jeweiligen Attribut, welches mit get... beginnt:

<button getLabel="GetButtonLabel">

Sobald Sie getLabel einsetzen, darf label für dieses Element nicht mehr benutzt werden. Im VBA-Code muss dann eine solche Prozedur GetButtonLabel mit einer vorgegebenen Signatur (also Reihenfolge und Datentyp der Argumente) existieren:

Sub GetButtonLabel(control As IRibbonControl, ByRef returnedVal)
returnedVal = "Dynamisch " & Now()
End Sub

Theoretisch kann jedes Element dabei eine eigene GetButtonLabelXXX-Prozedur aufrufen. Das wird aber recht unübersichtlich, deswegen lässt sich über die control.ID abfragen, welches Element diese Prozedur aufgerufen hat. Natürlich muss das Element dann auch eine ID als Attribut im XML-Code vergeben haben:

<button id="btnSmiley" getLabel="GetButtonLabel">

Dann können Sie die GetButtonLabel-Prozedur so ändern, dass sie je nach ID unterschiedliche Werte zurückgibt. Am übersichtlichsten geschieht das in einer Select Case-Struktur:

Sub GetButtonLabel(control As IRibbonControl, ByRef returnedVal)
Select Case control.ID
Case "btnSmiley": returnedVal = "Dynamisch " & Now()
Case Else: returnedVal = control.ID &"??"
End Select
End Sub

Achtung: auch bei der Prüfung der ID im VBA-Code müssen Sie entweder die Groß-/Kleinschreibung berücksichtigen oder mit der LCase-Funktion arbeiten! Daher ist hier für eventuelle Schreibfehler der Case Else-Zweig eingebaut. Dieser zeigt dann als Beschriftung die vergessene ID an.

Das typische Bedienungselement in Oberflächen ist eine Schaltfläche (engl. button). Sie können diese mit dem Custom UI Editor innerhalb einer Ribbon-Gruppe wie im folgenden XML-Code einfügen:

Im Ergebnis sehen Sie jeweils drei Schaltflächen vor und nach der Trennlinie (engl. separator), welche jeweils mit gleicher Funktionalität und Bildern ausgestattet sind. Sie unterscheiden sich nur in der Größe, wobei die Bilder vom Office-Programm automatisch angepasst werden:

Die eigentlichen Aktionen beim Anklicken der Schaltflächen bestehen hier lediglich in einfache Meldungen durch den folgenden Code:

Sub OnActionButton(control As IRibbonControl)
Select Case control.ID
Case "btnAutor", "btnAutor1": MsgBox "Autor: Lorenz Hölscher"
Case "btnInfo", "btnInfo1": MsgBox "Dateiname: " & ActiveDocument.Name
Case "btnOrdner", "btnOrdner1": MsgBox "Dateipfad: " & ActiveDocument.Path
Case Else: MsgBox "Fehlt noch: " & control.ID
End Select
End Sub

Der Separator (ein senkrechter Trennstrich) kennt zwar das Attribut getVisible wie viele andere Elemente auch, dessen Rückgabewert wird aber ignoriert. Das ist ein Fehler in Ribbons, Sie können also Separator-Elemente nicht dynamisch ein- oder ausblenden.

Eine beliebte Fehlerquelle beim Ändern oder Erstellen von XML-Code ist die Groß- und Kleinschreibung. Die meisten tags (engl. für Etikett, hier Bezeichner) sind klein geschrieben wie ribbon oder tabs. Auch die meisten Attribute wie label oder visible stehen in Kleinbuchstaben.

"Zusammengesetzte" Bezeichnungen sind jedoch typischerweise am Anfang klein und in den nächsten Wortteilen groß geschrieben wie bei customUI oder startFromScratch. Insbesondere die Callback-Attribute haben diese Struktur: statt label heißt es getLabel oder statt visible dann getVisible.