Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
André Minhorst, Duisburg
Menüs sind – ergonomisch betrachtet – das Salz in der Suppe beim Benutzen von Softwareprodukten. Viele Anwendungen bieten mehrere Möglichkeiten, bestimmte Funktionen aufzurufen – innerhalb von Elementen der Benutzeroberfläche, per Tastatur oder eben in Menüs. Letztere haben einen Vorteil: Sie sind eigentlich immer präsent (wenn sie nicht gerade kontextsensitiv sind) und geben dem Anwender daher die Möglichkeit, sich gut an sie zu gewöhnen. Im vorliegenden Beitrag erfahren Sie, wie Sie Ihre mit Access erstellten Anwendungen mit benutzerdefinierten Menüs ausstatten. Dabei liegt der Schwerpunkt nicht auf dem Zusammensetzen von Menüs per Anpassen-Dialog oder per Makro, sondern auf der flexibelsten Art und Weise: mit VBA.
Menüs sind eine Funktion von Office und nicht nur von Access. Sie können Menüs über die Benutzeroberfläche von Access hinzufügen, anpassen und wieder entfernen oder VBA verwenden.
Die Anpassung eingebauter oder benutzerdefinierter Menüs unter Verwendung der Benutzeroberfläche wird im vorliegenden Beitrag nicht behandelt. Damit können Sie lediglich statisch für zusätzlichen Komfort sorgen, die Menüs würden sich aber nicht dynamisch an die jeweiligen Anforderungen anpassen. Daher lernen Sie im vorliegenden Beitrag, wie Sie Menüs mit VBA steuern können.
Hinweis
Wie immer, wenn ein bestimmtes Vorhaben mit VBA erreicht werden soll, sind gewisse grundlegende Kenntnisse hilfreich. Auch wenn Sie noch nie mit Menüs gearbeitet haben, ist die diesbezügliche Lektüre der Onlinehilfe von Access sicher ein guter Ansatz.
Zum Anzeigen und Steuern benutzerdefinierter Menüs enthält Office eine Bibliothek mit geeigneten Objekten, Methoden und Eigenschaften. Damit können Sie Menüs bei Bedarf anzeigen und wieder entfernen sowie einzelne Elemente aktivieren und deaktivieren.
In den folgenden Kapiteln finden Sie zunächst einige grundlegende Informationen zu den in der Bibliothek enthaltenen Objekten. Anschließend erfahren Sie, welche Schritte zum Anlegen und Anpassen der einzelnen Menüelemente erforderlich sind. Dabei verwenden Sie spezielle Funktionen, die das Anlegen der Menüelemente vereinfachen.
Der Schwerpunkt der vorgestellten Funktionen liegt darin, eine herkömmliche Access-Datenbank in eine Anwendung umzuwandeln, die menütechnisch völlig eigenständig ist und nur noch eines oder mehrere benutzerdefinierte Menüs für den Aufruf der benötigten Befehle zur Verfügung stellt.
Schließlich möchten Sie den Endbenutzer nicht mit all den Access-spezifischen Menüs und Symbolleisten verwirren, sondern ihm nur die in Zusammenhang mit der Anwendung erforderlichen Elemente zur Verfügung stellen.
Bild 1: Menüleiste für die Adressverwaltung
Hinweis
Als Beispiel für die Anwendung VBA-gesteuerter Menüs dient die Musterlösung Adressverwaltung mit Outlook-Schnittstelle der vorliegenden Ausgabe von Access im Unternehmen. Sie finden die hier vorgestellten Funktionen zum Steuern von Menüs in den entsprechenden Datenbanken in den Versionen für Access 97 (Adressverwaltung97.mdb) und Access 2000 (Adressverwaltung2000.mdb).
Die Beispielanwendung soll eine Menüleiste mit folgenden Funktionen erhalten:
Die fertige Menüleiste soll wie in Bild 1 aussehen.
Hinweis
Weitere Informationen zu den jeweiligen Funktionen zum Erstellen der Menüelemente erhalten Sie in Kapitel 5.
Im Englischen heißt der Oberbegriff für alle Menüleisten Command Bars. Dieser Begriff fasst die drei Arten von Menüleisten zusammen: Standard Menus (Menüleisten), Toolbars (Symbolleisten) und Shortcut Menus (Kontextmenüs).
Hinweis
Die Beschreibung des gesamten Objektmodells der Menüs würde vermutlich mehrere Hefte füllen. Daher werden nachfolgend nur Menüleisten beschrieben – die anderen Menüarten folgen ggf. in einer der nächsten Ausgaben von Access im Unternehmen.
Menüs lassen sich mit einem relativ einfachen Objektmodell beschreiben. Das Objektmodell umfasst zwei Auflistungen: CommandBars und CommandBarControls. Die Auflistung CommandBars enthält alle vorhandenen eingebauten und benutzerdefinierten Menüs. Jedes dieser CommandBar-Objekte enthält eine CommandBarControls-Auflistung mit den Elementen des jeweiligen Menüs.
Diese Elemente gibt es wiederum in drei Ausführungen:
Public Function MenuesAuflisten() Dim cbr As CommandBar For Each cbr In Application.CommandBars Debug.Print cbr.Name, cbr.NameLocal, cbr.Type, _ cbr.Position, cbr.BuiltIn Next cbr End Function
Quellcode 1
Public Function MenuesUndElementeAuflisten() Dim cbr As CommandBar Dim cbc As CommandBarControl For Each cbr In Application.CommandBars Debug.Print cbr.NameLocal For Each cbc In cbr.Controls Debug.Print cbc.Caption If cbc.Type = msoControlPopup Then ElementeAuflisten cbc, 1, " " End If Next cbc Next cbr End Function Public Function ElementeAuflisten(cbp As _ CommandBarPopup, Ebene As Integer, _ Leerraum As String) Dim cbc As CommandBarControl For Each cbc In cbp.CommandBar.Controls Debug.Print Leerraum & cbc.Caption If cbc.Type = msoControlPopup Then ElementeAuflisten cbc.Control, _ Ebene + 1, Leerraum & " " End If Next cbc End Function
Quellcode 2
Wenn Sie hierarchische Menüstrukturen verwenden möchten, benötigen Sie jeweils ein CommandBarControl des Typs CommandBarControlComboBox für jedes weitere Untermenü. Mit den folgenden Funktionen zum Anzeigen von Menüs und deren Einträgen lernen Sie die grundlegenden Objekte und einige ihrer Eigenschaften kennen.
Anzeigen aller Menüs
Die Funktion aus Quellcode 1 listet alle aktuell vorhandenen Menüs auf. Dabei gibt sie die Eigenschaften Name, NameLocal, Type, Position und BuiltIn aus. Dazu verwendet sie ein Commandbar-Objekt namens cbr, dem sie in einer For Each-Schleife nacheinander alle Elemente der Commandbars-Auflistung der Anwendung zuweist.
Die in den Eigenschaften enthaltenen Informationen werden in Tab. 1 beschrieben.
Anzeigen aller Elemente eines Menüs
Zur Anzeige aller Elemente eines Menüs verwenden Sie die beiden Funktionen aus Quellcode 2. Da bestimmte Elemente eines Menüs durchaus weitere Unterelemente enthalten können, verwenden Sie hier zwei Funktionen, von denen sich die eine bei Bedarf selbst aufruft und dadurch für eine rekursive Auflistung aller Menüelemente sorgt.
Die Auflistung erfolgt durch zwei ineinander verschachtelte For Each-Schleifen. Die äußere Schleife durchläuft alle CommandBar-Objekte der CommandBars-Auflistung, die innere alle CommandBarControl-Objekte der Controls-Auflistung des aktuellen CommandBar-Objektes.
Dabei kontrolliert die Funktion, ob die Eigenschaft Type des CommandBarControl-Objektes den Wert msoControlPopup hat. Falls ja, handelt es sich um ein Objekt, das weitere Elemente enthalten kann, und die rekursive Funktion ElementeAuflisten wird aufgerufen.
Public Sub AlleMenueleistenAusblenden() Dim cbr As Object For Each cbr In Application.CommandBars If cbr.Visible = True And _ cbr.Name <> "menu bar" Then cbr.Visible = False End If Next cbr End Sub
Quellcode 3
In jeder Ebene wird die Beschriftung der jeweiligen Steuerelemente ausgegeben, wobei die Ausgabe je Ebene um zwei Leerzeichen weiter eingerückt wird.
Eigenschaft |
Inhalt |
Name |
Englischer Name |
NameLocal |
Angezeigter Name, sprachabhängig |
Type |
Art des Menüs: msoBarTypeMenuBar, msoBarTypeNormal, msoBarTypeNormal |
Position |
Position des Menüs, Beispiele: msoBarMenuBar, msoBarPopup, msoBarTop, msoBarFloating |
BuiltIn |
True: eingebautes Menü, False: benutzerdefiniertes Menü |
Tab. 1: Eigenschaften und ihre Inhalte
Access speichert die Informationen über Menüs an verschiedenen Orten. Nimmt ein Benutzer änderungen an eingebauten Menüs vor, werden diese änderungen in der Registry gespeichert – und zwar in dem für diesen Benutzer vorgesehenen Bereich. Informationen über neue Menüs werden teils in der Datenbank und teils in der Registry gespeichert, Informationen über den Aufbau der benutzerdefinierten Menüs dagegen nur in der Datenbank. Lediglich Informationen über die Anzeigeart werden benutzerabhängig in der Registry abgelegt.
Das Anlegen, Bearbeiten und Löschen von Menüs und Menüelementen per VBA ist eine Abfolge einiger weniger, immer wiederkehrender Operationen. So brauchen Sie beispielsweise zum Anlegen von Schaltflächen für einen Menüpunkt immer wieder die gleichen Anweisungen. Daher lernen Sie in den folgenden Abschnitten einige Funktionen kennen, die zur Durchführung der gewünschten Schritte dienen und die nur noch die übergabe der entsprechenden Parameter beim Funktionsaufruf erfordern.
Menüs ausblenden
Wenn sichergestellt ist, dass Ihre neu erstellte Menüleiste alle für die Anwendung der Datenbank notwendigen Befehle enthält, können Sie alle anderen Menüs ausblenden. Diese Aufgabe nimmt Ihnen die Funktion aus Quellcode 3 ab. Sie durchläuft alle Menüleisten der aktuellen Anwendung und stellt deren Eigenschaft Visible auf den Wert False. Die einzige Ausnahme ist die Menüleiste menu bar, die allerdings später durch die neu erstellte Menüleiste ersetzt wird.
Anlegen eines Menüs
Das Anlegen eines Menüs erfolgt mit der Methode Add der Commandbars-Auflistung. Den Aufruf dieser Methode vereinfacht die Funktion aus Quellcode 4, der Sie beim Aufruf drei Parameter übergeben: den Namen der zu erstellenden Menüleiste, die Startposition und die Angabe, ob das Menü als Menüleiste verwendet werden soll.
Die Funktion dient als so genannter Wrapper für den eigentlichen Befehl für das Anlegen eines neuen Menüs. Ein Wrapper ist eine Art Schnittstelle, mit der die eigentliche Funktion umhüllt und entweder deren Aufruf vereinfacht oder mit zusätzlichen Funktionen versehen wird. Hier wird dem Aufruf z. B. eine Fehlerbehandlung hinzugefügt. Die Funktion gibt beim Auftreten eines Fehlers den Wert False zurück.
Public Function MenueleisteErstellen(Menueleistenname _ As String, Menueposition As Integer, _ Menueleiste As Boolean) On Error Resume Next Dim cbr As CommandBar Set cbr = CommandBars.Add(Menueleistenname, _ Position:=Menueposition, MenuBar:=Menueleiste) If Err.Number > 0 Then MenueleisteErstellen = False End If End Function
Quellcode 4
Public Function MenueeintragErstellen(cbr As _ CommandBar, Beschriftung As String, Bezeichnung _ As String, Aktion As String, NeueGruppe As Boolean) Dim cbc As CommandBarControl Set cbc = cbr.Controls.Add(Type:=1) cbc.Style = 2 cbc.Caption = Beschriftung cbc.OnAction = Aktion cbc.Tag = Bezeichnung cbc.BeginGroup = NeueGruppe End Function
Quellcode 5
MenueeintragErstellen _ Application.Commandbars("Adressverwaltung"), _ "&Detailsuche", "Detailsuche", "=Detailsuche()", _ False
Quellcode 6
Mit dem folgenden Aufruf der Funktion aus Quellcode 5 erstellen Sie beispielsweise eine neue Menüleiste namens Adressverwaltung, die anstelle der bisherigen Menüleiste angelegt wird.
MenueleisteErstellen _ "Adressverwaltung", msoBarTop, True
Praxis-Tipp
Die Parameter für Methoden wie die Add-Methode der Commandbars-Auflistung und andere finden Sie z. B. im Objektkatalog von Access, weitere Informationen hierzu im Beitrag Tipps und Tricks zum Programmieren in der vorliegenden Ausgabe. Dort erhalten Sie außerdem eine Erläuterung der Funktion von Wrappern.
Anlegen eines Eintrags in der Menüleiste
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo