Mit Access 2007 hat Microsoft das Ribbon eingeführt und Access seiner Werkzeuge beraubt, Menüleisten und Kontextmenüs über die Benutzeroberfläche zu erstellen. Nun gut: Menüleisten gibt es nicht mehr, aber Kontextmenüs können in professionellen Anwendung doch sehr hilfreich und vor allem ergonomisch sein. Dieser Artikel zeigt den alternativen Weg zur Erstellung von Kontextmenüs – den über VBA.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1310_Kontextmenues.mdb.
Kontextmenüs
In Access 2003 und jünger konnten Sie nicht nur Kontextmenüs, sondern auch andere Menüs zusammenklicken. Wenn Sie jedoch einmal dynamisch generierte Kontextmenüs benötigten, mussten Sie auch dort zu VBA greifen – beispielsweise, um verschiedene Werte einer Tabelle per Kontextmenü zur Auswahl anzubieten. Dementsprechend können Sie die in diesem Artikel vorgestellten Techniken auch in Datenbanken einsetzen, die mit Access älteren Jahrgangs als 2007 erstellt wurden.
Sollte Ihnen der Begriff Kontextmenü fremd sein: Das sind diejenigen Menüs, die aufgeklappt werden, wenn Sie mit der rechten Maustaste auf ein Objekt klicken (zum Beispiel auf eine Datei oder einen Ordner im Windows Explorer). Diese Kontextmenüs können Sie auch für Ihre eigenen Anwendungen anlegen und an den entsprechenden Stellen anbieten.
Einsatzbereiche
Access selbst bietet ja bereits eine ganze Reihe eingebauter Kontextmenüs für die verschiedenen Objekte an – für die Spaltenköpfe oder die Felder der Datenblattansicht, für Steuerelemente in Formularen, für Formulare selbst et cetera (siehe Bild 1). Warum sollten Sie also eigene Kontextmenüs hinzufügen Oder sogar die vorhandenen Kontextmenüs ersetzen Ganz einfach: Wenn Sie eine eigene Anwendung erstellen, dann enthält diese auch die von Ihnen definierte Benutzeroberfläche – und dieser können Sie neben den üblichen Ribbons, Formularen und Steuerelementen auch Kontextmenüs hinzufügen.
Bild 1: Beispiel für ein eingebautes Kontextmenü
Sehr sinnvoll sind Kontextmenüs beispielsweise in Zusammenhang mit TreeView-Steuerelementen, da Sie so leicht Funktionen zu den angezeigten Elementen hinzufügen können – etwa zum Bearbeiten des angeklickten Eintrags, zum Löschen des Beitrags oder auch zum Anlegen neuer Einträge.
Vielleicht möchten Sie auch nur eingebaute Steuerelemente anpassen, indem Sie vorhandene Einträge ausblenden oder deaktivieren oder eigene Einträge hinzufügen. So könnten Sie zum Beispiel das Kontextmenü eines Textfeldes um den Kopieren- oder den Ausschneiden-Befehl erleichtern, wenn Sie nicht möchten, dass der Benutzer auf einfache Weise die Inhalte des Textfeldes in die Zwischenablage einfügt. Für all diese Zwecke müssen wir zunächst einen Blick auf die VBA-Objekte zum Steuern des Aussehens von Kontextmenüs werfen.
Kontextmenüs per VBA
Dazu müssen Sie zunächst wissen, dass die Kontextmenüs keine Access-interne Komponente sind, sondern dass die notwendigen Objekte in der Office-Bibliothek enthalten sind. Und da diese einem VBA-Projekt standardmäßig nicht zugewiesen ist, fügen Sie den entsprechenden Verweis nun zunächst hinzu. Dazu öffnen Sie den VBA-Editor (zum Beispiel mit Strg + G) und betätigen den Menübefehl Extras|Verweise. Fügen Sie dort den Eintrag Microsoft Office x.0 Object Library hinzu (siehe Bild 2).
Bild 2: Verweis auf die Office-Bibliothek
Anschließend können Sie im Code-Fenster auf die Objekte dieser Bibliothek zugreifen. Zu Testzwecken wollen wir zunächst eine Liste aller aktuell in der Datenbankdatei enthaltenen Kontextmenüs im Direktfenster ausgeben. Dabei lernen Sie dann gleich einige Objekte und Eigenschaften der Kontextmenüs unter VBA kennen. Der dazu notwendige Code steckt in der Prozedur AlleMenues und sieht wie folgt aus:
Public Sub AlleMenues() Dim cbr As Office.CommandBar For Each cbr In Application.CommandBars Debug.Print cbr.Name Next cbr End Sub
Die Prozedur deklariert eine Variable des Typs CommandBar, was einer Menüleiste, einer Symbolleiste oder einem Kontextmenü entspricht. Mithilfe dieser Variablen durchläuft die Prozedur in einer For Each-Schleife alle Elemente der CommandBars-Auflistung des Application-Objekts, was der aktuellen Instanz von Access entspricht. Sie gibt dann über die Eigenschaft Name den Namen des aktuellen CommandBar-Objekts aus.
Wenn Sie diese Prozedur eingeben und starten, rauschen eine ganze Reihe Einträge durch den Direktbereich. Wieviele waren das Das finden Sie durch Absetzen der folgenden Anweisung im Direktfenster heraus:
Commandbars.Count 209
Unter Access 2010 etwa gibt es also über 200 Menüs! Allerdings sind dies nicht alles Kontextmenüs. Informationen über die Art des Menüs liefert die Eigenschaft Type. Wollen wir die Namen der Menüs mit Typ ausgeben, erweitern Sie die Debug.Print-Zeile der obigen Prozedur wie folgt:
Debug.Print cbr.Name, cbr.Type
Eingebaut oder nicht
Eine weitere interessante Eigenschaft des CommandBar-Objekts heißt BuiltIn. Diese Eigenschaft gibt den Wert True zurück, wenn es sich um ein benutzerdefiniertes Menü handelt, also eines, dass durch den Code der Anwendung, durch Import oder durch Erstellen mit den Tools von Access 2003 und älter erstellt wurde. Wenn Sie also beispielsweise einmal alle eingebauten Kontextmenüs entfernen möchten, liefert die Eigenschaft Builtin alle notwendigen Informationen.
Arten von Menüleisten
Um herauszufinden, welche der CommandBar-Objekte Kontextmenüs repräsentieren, müssen wir zunächst ermitteln, was die Zahlenwerte 0, 1 und 2 bedeuten. Dazu bemühen wir den Objekt-Explorer (F2), siehe Bild 3. Dort filtern wir zunächst nach der Bibliothek, in der sich die entsprechenden Konstanten befinden könnten, also Office (für Microsoft Office x.0 Object Library).
Bild 3: Ermitteln der Bedeutung der Type-Werte von CommandBar-Objekten
Dann suchen wir nach dem Namen der Eigenschaft, hier Type. Darüber gelangen wir an die Type-Eigenschaft des CommandBar-Objekts. Wählen Sie diese aus, erhalten Sie unten weitere Informationen – nämlich den Namen der Enumeration, welche die Konstanten für die Eigenschaft Type enthält (Sie hätten auch direkt den Weg über das CommandBar-Objekt gehen und dann nach der Eigenschaft Type suchen können). Klicken Sie dort auf die Enumeration msoBarType, finden Sie schnell die möglichen Werte:
- 0: msoBarTypeNormal (Symbolleiste)
- 1: msoBarTypeMenuBar (Menüleiste)
- 2: msoBarTypePopup (Kontextmenü)
Es gibt allerdings noch einen anderen Weg, um an die Konstanten zu gelangen. Dazu geben Sie einfach eine Anweisung in den VBA-Editor ein, mit der Sie der Eigenschaft Type einen Wert zuweisen wollen.
Dank IntelliSense liefert der VBA-Editor an dieser Stelle die gewünschten Informationen (siehe Bild 4).
Bild 4: Auch IntelliSense liefert die Namen der Konstanten einer Enumeration.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: