Dynamische Menüs mit VBA

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:

  • Beenden der Anwendung
  • Anzeigen der Stammdaten für Personen und Unternehmen
  • Anzeige des Suchformulars
  • Schnellsuche per Kombinationsfeld
  • Schaltflächen zum Drucken, die ggf. aktiviert und deaktiviert werden
  • Export und Import von Adressen
  • 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:

  • CommandBarControlButton: Schaltfläche, die eine Aktion auslösen kann
  • 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

  • CommandBarControlComboBox: Kombinationsfeld zur Auswahl eines Eintrags
  • CommandBarControlPopup: Container für weitere Elemente
  • 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

    Schreibe einen Kommentar