Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 4/2003.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

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.

Einführung

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

    Menüleisten, Symbolleisten und Kontextmenüs

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

    Objektmodell

    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

    Speicherort von
    Menü-Informationen

    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.

    Funktionen zur Anpassung von Menüs

    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

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Verwandte Beiträge:

    Platzhalterauswahl per Kontextmenü

    Dynamische Ribbons

    Vertikale Menüleisten

    Auswahlfelder im Ribbon

    Kontextmenüs von A bis Z

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.