Ribbon für VBA – Button in Action

OK, also im ersten Teil haben wir eine wundervolle Oberfläche gebaut, aber bisher passiert nichts wenn irgendwas angeklickt wird. Das werden wir jetzt ändern. 😊

Und Action

Die Geschichte startet wieder im Ribbon X Editor. Der erste Button bekommt eine neue Eigenschaft hinzugefügt: onAction="vbaCoreRibbonButton_Click". Der Name wird selbst vergeben und es ist nicht das Dümmste dabei eine Struktur zu benutzen. Unser Projekt hieß ja VBACore, dann wollen wir das ganze in einem Modul namens Ribbon ablegen und das was passiert ist ein geklickter Button – Button_Click.

Die aufzurufende Funktion hat also einen Namen bekommen, muss aber einer bestimmten Vorgabe entsprechen. Dabei hilft Generate Callbacks des Editors, das erzeugt den sehr groben Rumpf der Funktion. Die kopieren wir uns direkt aus dem Fenster. Speichern nicht vergessen!

Der Ribbon Editor kann jetzt erstmal geschlossen werden, oder man schließt die Datei. Alternativ kann man die auch mal offen lassen und todesmutig die Reload on Save Funktionalität probieren.

Weiter gehts in Word. Die VBACore.dotm wird per Rechtsklick > Öffnen gestartet. Mit Alt+F11 geht´s direkt in den VBA-Editor. Die Normal.dotm ignorieren wir vollständig und packen in unser VBACore Projekt per Rechtsklick ein neues Modul.

Das jetzt eingefügte Modul wird direkt mal in Ribbon umbenannt und der Funktionsrumpf aus dem Ribbon Editor eingefügt. Soweit so toll, noch macht der Button nix.

Der Klassiker ist was einfaches, machen wir doch direkt auch mal. Eine simple MessageBox > Speichern > Hurra der Button lebt! Nachdem wir unserer Genialität mit einem leckeren Keks genügend gehuldigt haben, stellen wir aber fest – Moment mal, das ist ja jetzt nur der eine Button. Was´n mit dem anderen? Dafür holen wir kurz aus und uns davor einen Kaffee.

Aufbrezeln

Im Ribbon Editor hatten wir per onAction gesagt, wohin sich der Button bei einem Click wenden soll. Ja dann machen wir doch einfach eine zweite Funktion für den anderen Button. *stolz wie Bolle ✨ *

Das ist nur bedingt clever, denn bei 30 Buttons würde das 30 Funktionen bedeuten. Das ist erstmal ziemlich unübersichtlich. Das geht besser. Wir wissen schon, dass alle Elemente im Ribbon eine eindeutige ID haben müssen. Was wir jetzt dazu lernen: in der Funktion wird das geklickte Elemente übergeben, das ist das control As IRibbonControl hinter dem Namen.

Und mit diesem pfiffigen Einfall passen wir jetzt unsere Button_Click Funktion so an, dass sie mit jedem Element vom Typ Button umgehen kann. Und zwar wird dafür ein Select Case benutzt, welches seine Entscheidung anhand der ID des geklickten Buttons trifft. Sollte die Methode aufgerufen werden und keine Auswahl passen, gibt es den Case Else. Das dient hauptsächlich dem Anwender, nix ist verstörender als ein geklickter Button der nix macht. So erhält man wenigstens die Info, dass der Button nix macht.

Chic chic, damit haben wir dem Button Leben eingehaucht und bekommen sogar raus, welcher Button geklickt wurde. Zum Verständnis, das Modul Ribbon dient dem Verteilen und Aufrufen der Funktionen. Dort drin werden möglichst keine sonstigen Funktionalitäten definiert. Praktisch ist es immer das Schema Click > Select Case ID > rufe Funktion() woanders im Projekt auf.

Hingewiesenes

Abschließend noch ein Hinweis zum onAction selbst. Word benötigt einen eindeutigen Funktionsnamen über alle Projekte hinweg. Unsere Funktion heißt vbaCoreRibbonButton_Click und die ist nur in unserem Projekt. Wenn ich eine zweite zentrale Datei vorhalten möchte, dann muss die Struktur anders heißen, z. B. projekt2RibbonButton_Click. Würden beide Funktionen nur Button_Click heißen, dann wüsste VBA nicht, welche aufgerufen werden soll. Im Regelfall genau die falsche.

Excel hingegen kann sogar ganz tolle Sachen die Word nicht kann, es kann die Objektstruktur im Projekt als Aufruf abbilden. Was willste?!? 😨Ganz einfach, das kann onAction="vbaCore.Ribbon.Button_Click". Wie genial ist das denn, die aufzurufende Funktion kann also ganz einfach Sub Button_Click(control As IRibbonControl) heißen und alles was ich bei einem zweiten Projekt ändern müsste wäre vbaCore > projekt2. Solange das Modul und die Funktion gleich heißen, kann ich alles übernehmen. Die Excel Jungs sind halt cooler bei Microsoft. 😁