Ribbon für VBA – Der TiTaToggle-Bär

Ganz hervorragend klappt unser Ribbon mit einem Button, aber es gibt da ja Momente wo man mehr möchte als nur eine Routine starten. Manchmal will man etwas an oder abschalten, in Dialogen setzt man solche Optionen mit der Checkbox. Das Äquivalent im Ribbon ist der Toggle Button. Gucken wir doch mal wie der so funktioniert. 🎨

Hin …

Word ist geschlossen, der Ribbon Editor geöffnet. Der Code unterscheidet sich gar nicht so doll vom einfachen Button, alles irgendwie schon bekannt. Nur die onAction Zeile benutzt eine andere Funktion. Hier im Beispiel mopsen wir uns mal die iox Funktionalität, die ist schön einfach und zeigt das Prinzip gut.

<toggleButton id="ToggleEmbedFonts" 
                    label="Einbetten" 
                    size="normal" 
                    imageMso="QuickStylesSets" 
                    screentip="Schriftarten einbetten" 
                    supertip="Schaltet die Schrifteinbettung für das aktuelle Dokument ein oder aus, sofern es die Schriftart zulässt." 
                    onAction="vbaCoreRibbonToggle_Click" />

Nicht vergessen zu validieren, zu speichern und dann per Generate Callbacks den neuen Funktionsrumpf zu kopieren. Danach den Editor sicherheitshalber schließen, unsere dotm öffnen und im VBA Editor den neuen Rumpf einfügen.

Die Gemeinsamkeiten in der Funktion sind unverkennbar. Es wird wieder ein control As IRibbonControl übergeben, das ganze werten wir mit Select Case control.ID aus um zu wissen welcher Button geklickt wurde. Was aber neu ist: pressed As Boolean. Dieser zweite Parameter übergibt den Zustand des Buttons, wurde er gesetzt/aktiviert (true) oder gelöst/deaktiviert (false). Diese zusätzliche Information können wir jetzt erfolgreich in einem If Block verwenden um unterschiedliche Aktionen auszuführen. Jippie!! 👌😁

OK, wir wollen aber keine knuffigen Dialoge aufrufen, sondern die benutzten Schriftarten einbetten. Normalerweise wäre das eine Funktionalität abseits des reinen Ribbons, würde also in ein eigenes Modul gehören da wir ja brav aufräumen. Das ganze lässt sich aber super in einer Zeile umsetzen, deshalb packen wir das trotzdem hier rein.

Das ganze If Gedöns ist dafür unnötig und kann raus. Wir übergeben direkt den Status des Toggle Button an die entsprechende Dokumenteigenschaft: ActiveDocument.EmbedTrueTypeFonts = pressed. Dass das funktioniert kann man anhand der Dateigröße verifizieren, man muss dafür das Dokument nur speichern. Ohne Schriften sind es etwa 22 kb zum aktuellen Zeitpunkt, mit Schriften fast 1,4 MB.

… und her

Klasse, der Toggle Button toggelt kräftig vor sich hin und tut was er soll. Wenn man aber die Schriften einbettet, speichert, schließt und das Dokument wieder öffnet, dann ist der Button nicht aktiviert. So ein Mist, das Ribbon hat keine Ahnung vom Zustand und zeigt den Button immer falsch an. Da müssen wir was tun. 🔨

Word schließen, Ribbon Editor öffnen und dann bekommt unser Toggle Button eine weitere Eigenschaft: getPressed="vbaCoreRibbonGetToggle_State". Validieren, speichern, Generate Callbacks und wir finden die dritte Funktion die wir flott kopieren. Ribbon Editor zu, dotm in Word auf. Ein lustiges Hin und her ist das.

Im VBA Editor kommt die neue Funktion dazu. Die unterscheidet sich kaum vom Toggle_Click. Anstatt pressed As Boolean wird jetzt aber ByRef returnedVal als zweiter Parameter angegeben. Und unser Select Case besitzt keinen Case Else Zweig. Den brauchen wir auch nicht, hier werden ausschließlich existierende Toggle-Button eingebunden die dann auch etwas zurückliefern müssen. Im Prinzip passiert jetzt das umgedrehte vom Toggle_Click. Anstatt die Eigenschaft anhand pressed zu setzen, wird diese ausgelesen und als Referenz an den Button zurückgegeben.

Select Case control.ID
        Case "ToggleEmbedFonts": returnedVal = ActiveDocument.EmbedTrueTypeFonts
    End Select

Probieren wir das aus. Schriften einbetten, speichern, schließen. Dokument wieder öffnen, gucken, jubeln. 🎉

Das Prinzip funktioniert, das Ribbon holt sich beim Öffnen die Information aus dem aktuellen Dokument und setzt den Zustand des Toggle Buttons 1:1. Was aber nicht funktioniert: Das Aktualisieren des Buttons während Word läuft. Das kann man einfach testen, die Einbettung der Schriftart lässt sich über Optionen > Speichern > Schriftarten in der Datei einbetten ebenfalls steuern. Da müssen wir wohl doch noch mit der Feile nachjustieren damit auch das funktioniert. 😪