Menüs per VBA programmieren

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

Hinzufügen eines Verweises auf die Office-Bibliothek

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.

Alle Symbolleisten des VBA-Editors

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

Ermitteln des Typs einer Eigenschaft

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:

Ermitteln der Werte eines Eigenschaft

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

 

Schreibe einen Kommentar