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.
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:
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.