Dynamische Menüs mit VBA

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.

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

    Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

    Workplace

    Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

    Schreibe einen Kommentar