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

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2005.

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

Zusammenfassung

Erstellen Sie Symbolleisten mit Text- und Kombinationsfeldern, um beispielsweise eine Suchfunktion für Formulare zu realisieren.

Techniken

Symbolleisten, VBA

Voraussetzungen

Access 97 oder höher

Beispieldateien

Suchleiste97.mdb, Suchleiste00.mdb

Suchleiste für Formulare

Martin Hoffmann, Düsseldorf; André Minhorst, Duisburg

Mit den im Beitrag "Menüs für die Anwendung" (Shortlink 300) beschriebenen Techniken lassen sich lediglich Symbolleisten mit Schaltflächen gestalten, die Text, ein Symbol oder beides enthalten. In vielen Anwendungen gibt es aber noch andere Elemente in Symbolleisten wie zum Beispiel Text- oder Kombinationsfelder. Diese Steuerelemente können Sie auch in Ihrer Datenbank nutzen, um den Komfort der Oberfläche zu erhöhen. Das folgende Beispiel zeigt, wie Sie eine Suchen-Symbolleiste erzeugen, die eine ähnliche Funktionalität wie der Suchen-Dialog hat. Im Gegensatz zum Dialog ist die Symbolleiste aber jederzeit präsent und nimmt wesentlich weniger Platz weg.

Symbolleistenprogrammierung

Für die Realisierung einer Symbolleiste mit Text- und Kombinationsfeldern ist nur geringer Programmieraufwand nötig, um dieses Steuerelement anzulegen.

Auf Symbolleisten zugreifen

Access verwaltet alle Menü- und Symbolleisten der aktuellen Datenbank über die Commandbars-Auflistung. Damit Sie die Commandbars-Auflistung in VBA verwenden können, aktivieren Sie im Verweis-Dialog die Referenz auf die Microsoft Office x.0 Object Library, wobei x für die verwendete Office-Version steht. Den Dialog Verweise rufen Sie über den gleichnamigen Befehl des Menüs Extras auf, wenn ein beliebiges Modulfenster geöffnet ist.

Eine bestimmte Symbolleiste sprechen Sie über ihren Namen an, Eigenschaften trennen Sie durch einen Punkt vom Objekt:

Commandbars(<Symbolleistenname>)
.<Eigenschaft>

Um beispielsweise eine Symbolleiste einzublenden, verwenden Sie die Visible-Eigenschaft des entsprechenden Commandbar-Objekts. Die folgende Programmzeile blendet die benutzerdefinierte Symbolleiste mit dem Namen Suchen-Symbolleiste ein:

CommandBars("Suchen-Symbolleiste")
.Visible = True

Wenn Sie auf die Access-internen Symbolleisten zugreifen wollen, müssen Sie die englischen Namen verwenden. Für die Symbolleiste Datenbank ist das beispielsweise der Name Database. Mit der folgenden Programmschleife geben Sie alle englischen Symbolleistennamen im Testfenster aus:

Dim cmb As CommandBar

For Each cmb In CommandBars

    Debug.Print cmb.Name

Next cmb

Auf Symbolleisten-Steuerelemente zugreifen

Auf ein bestimmtes Steuerelement in einer Symbolleiste greifen Sie mittels der Controls-Auflistung zu. Zur Identifikation können Sie entweder den Index oder den Namen des Steuerelements angeben. Der Index innerhalb einer Symbolleiste startet mit 1 beim ersten Steuerelement. Der Zugriff über den Namen ist jedoch vorzuziehen, da sich dieser nicht ändert, wenn Sie die Steuerelemente der Symbolleiste neu anordnen, der Index hingegen schon.

Den Namen eines Symbolleisten-Steuerelements legen Sie über die Eigenschaft Caption fest. Achten Sie darauf, dass alle Steuerelemente einer Befehlsleiste unterschiedliche Beschriftungstexte haben, da ein Befehl sonst nicht mehr eindeutig identifiziert werden kann.

Für den Zugriff auf eine Steuerelement-Eigenschaft verwenden Sie die folgende Syntax:

Commandbars(<Symbolleistenname>).
Controls(<Steuerelementname>).
<Eigenschaft>

oder

Commandbars(<Symbolleistenname>).
Controls(<Index>).<Eigenschaft>

Um beispielsweise die Schaltfläche Weitersuchen der Symbolleiste Suchen-Symbolleiste zu deaktivieren, verwenden Sie die folgende Zeile:

CommandBars("Suchen-Symbolleiste").
Controls("Weitersuchen").Enabled = False

Äquivalent dazu können Sie auch den Index des Steuerelements angeben. Wenn das Weitersuchen-Symbol der zweite Befehl in der Symbolleiste ist, dann lautet der Aufruf wie folgt:

CommandBars("Suchen-Symbolleiste").
Controls(2).Enabled = False

Suchen-Symbolleiste anlegen

Im Folgenden erzeugen Sie Schritt für Schritt die Suchen-Symbolleiste mit allen nötigen Steuerelementen und dem zugehörigen Programmcode. Legen Sie zunächst über den Dialog Anpassen eine neue Symbolleiste mit dem Namen Suchen-Symbolleiste an und beenden Sie anschließend den Dialog (s. Abb. 1).

Abb. 1: Erzeugen einer neuen Symbolleiste

Steuerelemente erzeugen

Für die Symbolleiste benötigen Sie zwei Schaltflächen für das Suchen und Weitersuchen, ein Kombinationsfeld zur Auswahl des Suchfeldes und ein Textfeld für die Eingabe des Suchtextes. Außerdem soll über ein Kombinationsfeld die Art des Suchtextvergleichs vorgegeben werden.

Quellcode 1: Anlegen eines Steuerelements in einer Symbolleiste

Public Sub SteuerelementAnlegen(Symbolleiste As String, Typ As Office.MsoControlType, _
    Beschriftung As String)

    Dim c As CommandBarControl

    Set c = CommandBars(Symbolleiste).Controls.Add(Type:=Typ)

    c.Caption = Beschriftung

End Sub

Quellcode 2: Steuerelemente der Suchen-Symbolleiste anlegen

Public Sub SuchleisteAnlegen()

    Dim strSymbolleiste As String

    strSymbolleiste = "Suchen-Symbolleiste"

    SteuerelementAnlegen strSymbolleiste, msoControlButton, "Suche starten"

    SteuerelementAnlegen strSymbolleiste, msoControlButton, "Weitersuchen"

    SteuerelementAnlegen strSymbolleiste, msoControlComboBox, "Im Feld"

    SteuerelementAnlegen strSymbolleiste, msoControlEdit, "Suchen nach"

    SteuerelementAnlegen strSymbolleiste, msoControlComboBox, "Vergleichen"

End Sub

Neue Symbolleisten-Steuerelemente legen Sie mit der Add-Methode des Control-Objekts an. Den Steuerelementtyp geben Sie über die Type-Eigenschaft vor. Die Prozedur aus Quellcode 1 können Sie universell zum Erzeugen von Schaltflächen, Text- und Kombinationsfeldern einsetzen. Der Parameter Symbolleiste bestimmt die Symbolleiste, der das Steuerelement hinzugefügt werden soll. Als Typ geben Sie eine der drei Konstanten aus Tab. 1 an.

Konstante

Wert

Steuerelementtyp

msoControlButton

1

Schaltflächen

msoControlEdit

2

Textfelder

msoControlComboBox

4

Kombinationsfelder

Tab. 1: Konstanten der Type-Eigenschaft eines Symbolleisten-Steuerelements

Die Beschriftung des Steuerelements ist gleichzeitig der Name, über den Sie auf das Steuerelement zugreifen. Rufen Sie die Prozedur SteuerelementAnlegen mit der Routine aus Quellcode 2 fünf Mal auf, um die Steuerelemente für die Suchen-Symbolleiste zu erzeugen (s. Abb. 2).

Abb. 2: Die erste Version der Suchen-Symbolleiste lässt Beschriftungen vermissen.

Eigenschaften einstellen

Im nächsten Schritt stellen Sie die Eigenschaften der einzelnen Steuerelemente ein. Für die Schaltflächen Suchen und Weitersuchen kopieren Sie einfach die Symbole der Standardschaltflächen von Access. Sie finden diese im Anpassen-Dialog im Register Befehle in der Rubrik Bearbeiten.

Um die Symbole zu kopieren, ziehen Sie die beiden Befehle Suchen... und Weitersuchen temporär in die neue Symbolleiste, wählen dort den Kontextmenüeintrag Schaltflächenbild kopieren aus, markieren dann die Zielschaltfläche und fügen das Symbol mit dem entsprechenden Befehl des Kontextmenüs ein (s. Abb. 3). Die temporären Schaltflächen löschen Sie anschließend wieder.

Bei den Text- und Kombinationsfeldern ändern Sie über das Eigenschaften-Fenster den Stil in Bezeichnungsfeld anzeigen. Geben Sie außerdem bei allen Steuerelementen noch einen sinnvollen QuickInfo-Text ein.

Einige Eigenschaften können Sie nicht über das Eigenschaftsfenster einstellen, sondern nur mittels VBA über die Eigenschaften des Control-Objekts. Das gilt zum Beispiel für die Breite der Text- und Kombinationsfelder. Um die Breite eines Steuerelements neu zu definieren, benutzen Sie die Eigenschaft Width. Die folgenden drei Codezeilen passen die Breite der Steuerelemente an:

Abb. 3: Anpassen der Symbole der beiden Schaltflächen zum Suchen. Die übrigen Eigenschaften wurden ebenfalls schon wie im Text beschrieben eingestellt.

Quellcode 3: Erzeugen von Listeneinträgen eines Symbolleisten-Kombinationsfeldes

Sub KombinationsfeldEinträgeAnlegen()

    Dim c As CommandBarComboBox

    Set c = CommandBars("Suchen-Symbolleiste").Controls("Vergleichen:")

    

    'Alle Einträge löschen

    c.Clear

    

    'Einträge hinzufügen

    c.AddItem "Teil des Feldinhaltes", 1

    c.AddItem "Anfang des Feldes", 2

    c.AddItem "Ende des Feldes", 3

    c.AddItem "Ganzes Feld", 4

    'Standardwert festlegen

    c.Text = "Teil des Feldinhaltes"

End Sub

Quellcode 4: Konstanten und Variablen für die Funktionalität der Suchen-Symbolleiste

Const CommandbarName As String = "Suchen-Symbolleiste"

Const CommandbarControlFeld As String = "Im Feld:"

Const CommandbarControlSuchenNach As String = "suchen nach:"

Const CommandbarControlVergleichen As String = "Vergleichen:"

Public CommandbarRecordset As Recordset

CommandBars("Suchen-Symbolleiste"). _
    Controls("Im Feld:").Width = 220

CommandBars("Suchen-Symbolleiste"). _
Controls("suchen nach:").Width = 200

CommandBars("Suchen-Symbolleiste"). _
Controls("Vergleichen:").Width = 200

Listeneinträge und Standardwert für das Kombinationsfeld eintragen

Das Kombinationsfeld Vergleichen: soll dem Benutzer vier Möglichkeiten zur Wahl stellen, wie Access den Suchtext mit den Daten eines Formulars vergleicht. Dazu legen Sie für das Kombinationsfeld die entsprechenden Listeneinträge über die AddItem-Methode an. Die Prozedur aus Quellcode 3 erzeugt die Listeneinträge.

Die Zahlenwerte bei der AddItem-Methode geben die Position in der Liste vor. Am Ende der Prozedur wird über die Text-Eigenschaft der Standardwert festgelegt, der im Kombinationsfeld erscheint.

Steuerelemente mit Programmcode
verknüpfen

Die Symbolleiste ist nun soweit fertig konfiguriert. Jetzt fehlt noch eine Funktion zum Suchen und Weitersuchen, die beim Klicken auf eine der entsprechenden Schaltflächen ausgeführt wird.

Diese Aufgabe übernimmt die Funktion CommandbarSuchen, die Sie in einem Standardmodul namens mdlSuchenSymbolleiste anlegen. Fügen Sie zunächst im Deklarationsbereich des Moduls die Zeilen aus Quellcode 4 ein. Durch die Deklaration der Konstanten können Sie die Namen der Steuerelemente leichter umbenennen. Sie müssen nicht den gesamten Programmcode durchsuchen, wenn Sie einen Steuerelementnamen ändern. Die Variable rstCommandbar nimmt bei der Suche die Daten des aktuellen Formulars auf.

Quellcode 5: Diese Funktion wird beim Suchen ausgelöst.

Public Function Suchen()

    On Error GoTo Suchen_Err

    Dim c As CommandBarControl

    Dim f As Form

    Dim SuchenNach As String

    Dim SuchenIn As String

    Dim Vergleichen As String

    'In der Symbolleiste eingegebene Paremeter ermitteln

    Set c = CommandBars(CommandbarName).Controls(CommandbarControlSuchenNach)

    SuchenNach = c.Text

    Set c = CommandBars(CommandbarName).Controls(CommandbarControlFeld)

    SuchenIn = c.Text

    Set c = CommandBars(CommandbarName).Controls(CommandbarControlVergleichen)

    Vergleichen = c.Text

    'Das aktive Formular ermitteln

    Set f = Screen.ActiveForm

    'Das angeklickte Steuerelement ermiteln

    Set c = CommandBars.ActionControl

    If c.Caption <> "Weitersuchen" Then

        'Suchen-Schaltfläche wurde angeklickt oder

        'Suchen nach-Feld wurde mit der EIngabetaste bestätigt

        Set rstCommandbar = f.RecordsetClone

        Select Case Vergleichen

            Case "Teil des Feldinhaltes":

                rstCommandbar.FindFirst "[" & SuchenIn & "] like '*" & SuchenNach & "*'"

            Case "Anfang des Feldes":

                rstCommandbar.FindFirst "[" & SuchenIn & "] like '" & SuchenNach & "*'"

            Case "Ende des Feldes":

                rstCommandbar.FindFirst "[" & SuchenIn & "] like '*" & SuchenNach & "'"

            Case "Ganzes Feld":

                rstCommandbar.FindFirst "[" & SuchenIn & "] ='" & SuchenNach & "'"

        End Select

    Else

        'Weitersuchen-Schaltfläche wurde angeklickt

        Select Case Vergleichen

            Case "Teil des Feldinhaltes":

                rstCommandbar.FindNext "[" & SuchenIn & "] like '*" & SuchenNach & "*'"

            Case "Anfang des Feldes":

                rstCommandbar.FindNext "[" & SuchenIn & "] like '" & SuchenNach & "*'"

            Case "Ende des Feldes":

                rstCommandbar.FindNext "[" & SuchenIn & "] like '*" & SuchenNach & "'"

            Case "Ganzes Feld":

                rstCommandbar.FindNext "[" & SuchenIn & "] ='" & SuchenNach & "'"

        End Select

    End If

    If rstCommandbar.NoMatch Then

        MsgBox "Suchtext nicht gefunden!", vbExclamation, " "

        'Weitersuchen-Schaltflächen deaktivieren

        CommandBars(CommandbarName).Controls("Weitersuchen").Enabled = False

    Else

        'Im Formular auf den gefundenen Datensatz positionieren

        f.Bookmark = rstCommandbar.Bookmark

        'Weitersuchen-Schaltflächen aktivieren

        CommandBars(CommandbarName).Controls("Weitersuchen").Enabled = True

    End If

Suchen_Exit:

    Exit Function

Suchen_Err:

    MsgBox "Es ist kein Formular aktiv, in dem gesucht werden kann oder Sie haben keine " & _

    "Suchtext oder Suchfeld eingegeben!", vbInformation, "Fehler..."

    Resume Suchen_Exit

End Function

Die Funktion Suchen aus Quellcode 5 ermittelt zunächst die Inhalte der Symbolleisten-Steuerelemente und weist diese Variablen zu. Anschließend legt Sie das aktive Formular fest. Ist kein Formular aktiv, kommt es zu einem Fehler und die Funktion bricht mit einer Meldung ab.

Abb. 4: Einstellen der Funktion, die beim Betätigen eines Steuerelements ausgelöst werden soll.

Quellcode 6: Diese Routine füllt die Suchfelder der Suchen-Symbolleiste.

Function SuchfelderFuellen(Formularname As String, _
    Standard As String)

    On Error GoTo SuchfelderFuellen_Err

    Dim c As CommandBarComboBox

    Dim f As Form

    Dim r As Recordset

    Dim fld As Field

    Set c = CommandBars(CommandbarName). _
        Controls(CommandbarControlFeld)

    Set f = Forms(Formularname)

    Set r = f.RecordsetClone

    'Weitersuchen-Schaltflächen deaktivieren

    CommandBars(CommandbarName).Controls("Weitersuchen"). _
        Enabled = False

    'Kombifeld mit Feldnamen des aktuellen Formulars füllen

    c.Clear

    For Each fld In r.Fields

        c.AddItem fld.Name

    Next fld

    'Standardwert im Kombinationsfeld anzeigen

    c.Text = Standard

    r.Close

SuchfelderFuellen_Exit:

    Exit Function

SuchfelderFuellen_Err:

    Resume SuchfelderFuellen_Exit

End Function

Die nächste Anweisung stellt mit der ActionControl-Eigenschaft fest, welches Steuerelement betätigt wurde. Hat das Steuerelement nicht die Beschriftung Weitersuchen, dann wurde eine neue Suche gestartet, indem entweder auf die Schaltfläche Suche starten geklickt oder ein Suchtext im Feld suchen nach: eingegeben wurde. In diesem Fall legt die Funktion zunächst eine neue Datensatzgruppe auf Basis der Formular-Datensatzherkunft an und durchsucht diese anschließend mit der FindFirst-Methode nach der ersten Übereinstimmung. Den Vergleichen-Parameter berücksichtigt dabei eine Select Case-Anweisung.

Wurde auf die Weitersuchen-Schaltfläche geklickt, sucht die Funktion mit der FindNext-Methode nach dem nächsten Eintrag. Nach dem Suchvorgang prüft die Funktion, ob ein entsprechender Datensatz gefunden wurde. Wenn ja, wird im Formular auf diesen Datensatz positioniert und die Weitersuchen-Schaltfläche aktiviert. Wurde keine Übereinstimmung gefunden, macht eine Meldung darauf aufmerksam und die Weitersuchen-Schaltfläche wird deaktiviert. Den Funktionsaufruf =Suchen() tragen Sie in der Eigenschaft Bei Aktion der Symbolleistensteuerelemente Suche starten, Weitersuchen und Suchen nach: ein.

Symbolleiste mit Formularen
verknüpfen

Die Suchen-Symbolleiste erfüllt bereits in der jetzigen Form ihren Zweck (s. Abb. 5). Allerdings müssen Sie den Namen des Feldes, in dem gesucht werden soll, explizit angeben. Damit alle Datenfeldnamen automatisch bei Aktivierung eines Formulars in dem Kombinationsfeld Im Feld: eingetragen werden, legen Sie noch die Funktion Suchfelderfuellen aus Quellcode 6 in einem Standardmodul an.

Abb. 5: Die Suchen-Schaltfläche im Einsatz - hier am Beispiel eines Artikel-Formulars.

Sie übergeben der Funktion den Namen des Formulars, von dem aus die Funktion aufgerufen wird, und den Standardfeldnamen.

Mit der AddItem-Methode legt die Funktion dann eine Liste aller Feldnamen der Formular-Datensatzherkunft im Kombinationsfeld an. Am Schluss gibt die Text-Eigenschaft den Standardfeldnamen vor. Tragen Sie den Funktionsaufruf in allen Formularen der Datenbank, die eine Suchmöglichkeit erhalten sollen, in der Bei Aktivierung-Eigenschaft ein. Für das Formular frmArtikel lautet der Aufruf beispielsweise:

=SuchfelderFuellen("Artikel";
"Artikelname")

Damit die Feldnamen bei Deaktivierung eines Formulars wieder aus dem Kombinationsfeld gelöscht werden, tragen Sie noch in die gleichnamige Eigenschaft des Formulars den folgenden Ausdruck ein:

=SuchfelderLeeren()

Die Funktion löscht über die Clear-Methode die Inhalte des Kombinationsfeldes zur Auswahl des Suchfeldes.

Function SuchfelderLeeren()

    CommandBars("Suchen-Symbolleiste"). _
        Controls("Im Feld:").Clear

End Function

Symbolleisten importieren

Damit Sie aufwändig gestaltete Symbolleisten wie die oben beschriebene Suchen-Symbolleiste nicht für jede Datenbank neu erstellen müssen, können Sie mit Access Symbolleisten importieren. Gehen Sie wie folgt vor:

Abb. 6: Import von Menüs und Symbolleisten

Da Sie mit dieser Vorgehensweise alle Menü- und Symbolleisten einer Datenbank importieren, löschen Sie anschließend noch die nicht benötigten Symbolleisten über den Anpassen-Dialog. Natürlich müssen Sie noch die entsprechenden Ereigniseigenschaften für die Formulare einstellen, in denen Sie mit der Suchen-Symbolleiste suchen möchten.

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:

Download

Download

Die .zip-Datei enthält folgende Dateien:

Suchleiste97.mdb

Suchleiste00.mdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.