Kontextmenüs per VBA programmieren

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Vor sehr langer Zeit (2003) gab es für die Office-Anwendungen noch die Möglichkeit, Menüleisten, Symbolleisten und Kontextmenüs über die Benutzeroberfläche anzupassen. Die Menüleisten und Symbolleisten sind seit der Version 2007 Geschichte, und damit ist auch der Editor für die Gestaltung dieser Elemente verschwunden. Allerdings gibt es noch die Kontextmenüs, und diese lassen sich auch noch anpassen – zum Beispiel, um eigene Befehle hinzuzufügen. Diese könnten beispielsweise Teil von Add-Ins, COM-Add-Ins oder auch von Dokumenten sein. In diesem Artikel zeigen wir, wie man vorhandene Kontextmenüs bearbeitet oder eigene Kontextmenüs anlegt und diese bei Bedarf aufruft.

Unterschiede zwischen Outlook und den übrigen Office-Anwendungen

Zwischen Outlook und den übrigen Office-Anwendungen gibt es einen entscheidenden Unterschied für die individuelle Anpassungen von Kontextmenüs: Während wir unter Word, Excel, Access oder PowerPoint das Objektmodell aus der Bibliothek Microsoft Office x.0 Object Library nutzen können, um die gewünschten Anpassungen vorzunehmen, ist dies in Outlook nicht möglich. Hier sind die Kontextmenüs bereits Bestandteil des Ribbons. Änderungen der Kontextmenüs müssen wir in Outlook daher über die Ribbondefinition vornehmen, und zwar über die Einträge im Unterelement contextMenus. Dieses Thema behandeln wir im vorliegenden Artikel nicht, aber wir gehen im Detail darauf in einem weiteren Artikel namens Kontextmenüs in Outlook anpassen (www.vbentwickler.de/369) ein.

Beispieldateien

Da die CommandBars sich in den verschiedenen Office-Anwendungen Access, Excel und Word leicht unterschiedlich verhalten, haben wir jeweils eine Beispieldatei für jede Anwendung bereitgestellt:

  • Access: KontextmenuesPerVBA.accdb
  • Excel: KontextmenuesPerVBA.xlsm
  • Word: KontextmenuesPerVBA.docm

Objektmodell verfügbar machen

Um die Kontextmenüs anzupassen, benötigen wir Elemente der Bibliothek Microsoft Office x.0 Object Library. Diese ist in beispielsweise in den VBA-Projekten von Word und Excel bereits referenziert, nicht jedoch unter Access oder in anderen Projekten auf Basis von Visual Studio oder twinBASIC. Damit wir die Bibliothek etwa in Access unter Einsatz von IntelliSense nutzen können, fügen wir einen Verweis auf diese Bibliothek hinzu. Dazu öffnen wir zunächst den VBA-Editor der jeweiligen Anwendung, beispielsweise mit der Tastenkombination Alt + F11. Im VBA-Editor zeigen wir mit dem Menübefehl Extras|Verweise den Verweise-Dialog an. Hier selektieren Sie den Eintrag aus Bild 1 und fügen diese so hinzu.

Aktivieren des Verweises auf die Bibliothek Microsoft Office x.0 Object Library

Bild 1: Aktivieren des Verweises auf die Bibliothek Microsoft Office x.0 Object Library

Das Objektmodell zum Anpassen von Kontextmenüs

Zeigen wir nun mit F2 den Objektkatalog an, können wir dort die Bibliothek Office auswählen und finden dort beispielsweise die Auflistung CommandBars vor (siehe Bild 2). Diese bietet bereits einige interessante Elemente an. Unter anderem können wir damit die Anzahl aller aktuell verfügbaren CommandBar-Elemente ausgeben:

Die CommandBars-Auflistung im Objektkatalog

Bild 2: Die CommandBars-Auflistung im Objektkatalog

Debug.Print "Anzahl Commandbars: " _
     & Application.CommandBars.Count

Das liefert beispielsweise für Access die Anzahl von 247 CommandBar-Elemente, unter Excel immerhin noch 199 Einträge. Ob es sich dabei ausschließlich um Kontextmenüs handelt, finden wir gleich heraus. Unter Access können wir direkt auf die CommandBars-Auflistung zugreifen, unter Excel und Word müssen wir einen Verweis auf die Application-Klasse voranstellen. Bei dem Zugriff von COM-Add-Ins aus ist dies ohnehin obligatorisch, mehr dazu zeigen wir in einem Beispiel in einem weiteren Artikel namens Kontextmenü per COM-Add-In anpassen (www.vbentwickler.de/370).

CommandBar-Elemente durchlaufen

Mit den folgenden Zeilen aus der Prozedur CommandBarsDurchlaufen geben wir die Namen aller CommandBar-Elemente im Direktbereich des VBA-Editors aus:

Dim cbr As CommandBar
For Each cbr In Application.CommandBars
     Debug.Print cbr.Name
Next cbr

Das Gleiche gelingt auch per For…Next-Schleife über den 1-basierten Index:

Dim cbr As CommandBar
Dim i As Integer
For i = 1 To Application.CommandBars.Count
     Set cbr = Application.CommandBars.Item(i)
     Debug.Print cbr.Name
Next i

Die Ausgabe können wir noch verfeinern, indem wir zwei weitere Eigenschaften ausgeben lassen:

Debug.Print cbr.Name, cbr.Type, cbr.BuiltIn

Typ eines CommandBar-Elements ermitteln

Die erste hier verwendete Eigenschaft lautet Type. Type kann einen der folgenden drei Werte liefern:

  • 0 (msoBarTypeNormal): Das CommandBar-Element ist eine Symbolleiste.
  • 1 (msoBarTypeMenuBar): Das CommandBar-Element ist eine Menüleiste.
  • 2 (msoBarTypePopup): Das CommandBar-Element ist ein Kontextmenü.

Die ersten beiden Typen sind für unsere Zwecke nicht relevant. Bei diesen handelt es sich um die Typen der bis Office 2003 verwendeten Elemente, die dort angezeigt wurden, wo jetzt das Ribbon erscheint. Interessant wird es, wenn die Eigenschaft Type den Wert 2 liefert. Geben wie also nun alle Kontextmenüs aus und lassen uns, da wir deren Anzahl nicht über die Count-Eigenschaft bestimmen können, mit der Zählervariablen i den Index ausgeben:

Dim cbr As CommandBar
Dim i As Integer
For Each cbr In Application.CommandBars
     If cbr.Type = msoBarTypePopup Then
         i = i + 1
         Debug.Print i, cbr.Name, cbr.BuiltIn
     End If
Next cbr

Lassen wir die Prozedur unter Access laufen, erhalten wir 138 Kontextmenüs, unter Excel nur 67.

Eingebaute oder benutzerdefinierte Kontextmenüs

Mit der bereits verwendeten Eigenschaft BuiltIn können wir einen Boolean-Wert ausgeben, der angibt, ob es sich um ein eingebautes Kontextmenü handelt. Damit können wir die eingebauten Kontextmenüs von denen unterscheiden, die wir selbst per VBA hinzufügen.

Wozu die eingebauten Kontextmenüs nutzen?

Wozu sollten wir überhaupt wissen wollen, welche eingebauten Kontextmenü die jeweiligen Anwendungen anbieten? Weil es geschehen kann, dass wir nicht gleich ein vollständiges Kontextmenü mit neuen Funktionen hinzufügen wollen, sondern nur einzelne Funktionen, die in bestehenden Kontextmenüs angezeigt werden sollen.

 

Schreibe einen Kommentar