Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Das Menüsystem des VBA-Editors lässt sich über die Benutzeroberfläche bereits einfach anpassen. Das haben wir im Artikel “Menüsystem im VBA-Editor anpassen” (www.vbentwickler.de/434) gezeigt. Außerdem haben wir uns im Artikel “Kontextmenüs per VBA programmieren” (www.vbentwickler.de/368) bereits angeschaut, wie wir per VBA Kontextmenüs erstellen und anpassen können. Es fehlen also noch die Informationen, wie wir die eigentlichen Menüleisten und Symbolleisten mit VBA programmieren können. Wie das gelingt, schauen wir uns im vorliegenden Artikel an. Wir zeigen, wie vorhandene Menüs angepasst und wie neue Menüs erstellt werden können.
Warum haben wir eigentlichen einen eigenen Artikel zum Thema Kontextmenüs per VBA programmieren veröffentlicht und nicht direkt etwas weiter ausgeholt und die Menü- und Symbolleisten ebenfalls beschrieben? Weil es damals darum ging, die Benutzeroberfläche der Office-Anwendungen zu erweitern.
Und da diese bekanntlich seit Office 2007 keine Menü- und Symbolleisten mehr verwenden, sondern das Ribbon, haben wir uns auf die Kontextmenüs beschränkt.
Das wirft nun die Frage auf, warum wir uns dann jetzt mit den Menü- und Symbolleisten beschäftigen wollen. Nun: Es gibt noch das gallische Dorf unter den Microsoft-Anwendungen, in denen noch Menü- und Symbolleisten verwendet werden.
Dabei handelt es sich um die Anwendung, mit der wir täglich arbeiten: den VBA-Editor. Dieser verwendet noch das gute, alte Menü- und Symbolleistensystem, das jüngere VBA-Entwickler möglicherweise von Office selbst gar nicht mehr kennen.
Und da wir beispielsweise mit twinBASIC den VBA-Editor erweitern wollen und das Menüsystem nun einmal der Hauptort zum Unterbringen von Steuerelementen zum Aufrufen der Funktionen der entsprechenden COM-Add-Ins ist, schauen wir uns nun doch noch einmal die Grundlagen zu den Menü- und Symbolleisten an.
Office-Verweis sinnvoll
Dazu ist es sinnvoll, dem VBA-Projekt erst einmal einen Verweis auf die Bibliothek Microsoft Office 16.0 Object Library hinzuzufügen.
Das erledigen wir über den Verweise-Dialog, den wir über den Menüeintrag Extras|Verweise des VBA-Editors öffnen (siehe Bild 1).
Bild 1: Hinzufügen eines Verweises auf die Office-Bibliothek
Alles ist eine Symbolleiste
Um direkt zu Beginn eine Begrifflichkeit zu klären: Im Sinne von VBA sind sowohl Menüleisten, Symbolleisten als auch Kontextmenüs alles Symbolleisten, unter VBA CommandBar genannt.
Menüleisten und Kontextmenüs unterscheiden sich nur durch bestimmte Eigenschaften von den anderen Elementen.
Symbolleisten durchlaufen
Mit der Office-Bibliothek holen wir uns das Objektmodell zum Verwalten von CommandBar-Elementen in das VBA-Projekt.
Vom VBA-Editor aus können wir gleich zwei CommandBars-Auflistungen durchlaufen, nämlich die des VBA-Editors als auch die der jeweiligen Host-Anwendung – also beispielsweise Access, Excel, Outlook, PowerPoint oder Word.
Die folgende Prozedur gibt zuerst alle Elemente des VBA-Editors aus (referenziert mit VBE.CommandBars) und dann die Elemente der aktuellen Host-Anwendung, hier Access (referenziert mit Access.Commandbars):
Public Sub AlleCommandbars() Dim cbr As CommandBar For Each cbr In VBE.CommandBars Debug.Print "VBA-Editor: " & cbr.Name Next cbr For Each cbr In Access.CommandBars Debug.Print "Access: " & cbr.Name Next cbr End Sub
Wir wollen hier besonderes Augenmerk auf die Elemente des VBA-Editors legen. Die Menge ist überschaubar, wie Bild 2 zeigt.
Bild 2: Alle Symbolleisten des VBA-Editors
Unterscheidung der Symbolleisten nach Typ
Wie aber können wir nun die Menüleisten, Symbolleisten und Kontextmenüleisten voneinander unterscheiden?
Dabei hilft uns die Eigenschaft Type. Sie liefert uns verschiedene Werte (0, 1 und 2). Wie finden wir heraus, welcher Wert welche Bedeutung hat? Da IntelliSense uns hier keine Hinweise gibt, schauen wir im Objektkatalog nach.
Hier finden wir, wenn wir unter Klassen das CommandBar-Element selektieren und in den Elementen den Eintrag Type, die Information, dass es sich hierbei um die Auflistung msoBarType handelt (siehe Bild 3).
Bild 3: Ermitteln des Typs einer Eigenschaft
Ein Klick auf diese Auflistung zeigt direkt die Elemente dieser Auflistung und somit die möglichen Werte (siehe Bild 4). Klicken wir diese nacheinander an, erhalten wir die folgenden Zahlenwerte samt zugehörigen Konstanten plus Bedeutung:
Bild 4: Ermitteln der Werte eines Eigenschaft
- 0 (msoBarTypeNormal): Symbolleiste
- 1 (msoBarTypeMenuBar): Menüleiste
- 2 (msoBarTypePopup): Kontextmenü
Diese Werte können wir uns gleich merken, denn wir benötigen diese später zum Anlegen neuer CommandBar-Elemente.
Passen wir also unsere Prozedur zur Ausgabe der VBA-Editor-Symbolleisten wie folgt an:
Public Sub AlleCommandbars() Dim cbr As CommandBar For Each cbr In VBE.CommandBars Select Case cbr.Type Case msoBarTypeNormal Debug.Print "Symbolleiste: " & cbr.Name Case msoBarTypeMenuBar Debug.Print "Menüleiste: " & cbr.Name Case msoBarTypePopup Debug.Print "Kontextmenü: " & cbr.Name End Select Next cbr End Sub
Damit erhalten wir bereits genauere Informationen darüber, welche Typ ein CommandBar-Objekt hat (siehe Bild 5).