Alphabetisches Register

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Kennen Sie auch noch die guten alten Register-Einlagen für Aktenordner, die den Inhalt entweder nach Zahlen oder Buchstaben sortieren Ein solches Register können Sie auch unter Access in einem Formular nachbilden, beispielsweise für den schnellen Zugriff auf die Daten aller Kunden, deren Name mit einem bestimmten Buchstaben beginnt. Dieser Beitrag zeigt, wie Sie schnell ein solches Register erstellen und mit der gewünschten Funktion versehen.

Zu Beispielzwecken verwenden wir die Kundentabelle aus der Südsturm-Datenbank, unserer optimierten Version der Nordwind-Beispieldatenbank von Access 2003. Das Formular zur Anzeige des alphabetischen Registers soll den Namen frmKunden erhalten.

Fügen Sie diesem Formular ein Registersteuerelement hinzu und nennen Sie es tabKunden. Stellen Sie außerdem die Eigenschaft Feste Registerbreite so ein, dass die Großbuchstaben wie in Bild 1 noch sichtbar sind, aber die Registerlaschen nicht zu viel Platz wegnehmen.

Obwohl Bild 1 bereits alle Buchstaben anzeigt, sind Sie noch nicht so weit: Das Registersteuerelement zeigt beim Anlegen erst einige wenige Registerlaschen, die überdies noch nicht die gewünschten Beschriftungen enthalten.

Listing 3: Code der Klasse clsCommandbutton

Dim WithEvents m_cmd As Commandbutton
Public Property Set Commandbutton(cmd As Commandbutton)
    Set m_cmd = cmd
    m_cmd.OnClick = "[Event Procedure]"
End Property
Private Sub m_cmd_Click()
    m_cmd.Parent.KundenFiltern
End Sub

pic001.png

Bild 1: Alphabetisches Register in der Entwurfsansicht

Außerdem sollten Sie den Registerlaschen auch entsprechende Namen geben.

Auch wenn der Aufwand für das Erstellen von 26 Registerlaschen und die Vergabe der Beschriftungen und Namen in einigen Minuten erledigt ist, geschieht dies per VBA-Code zuverlässiger.

Die Prozedur aus Listing 1 braucht hierzu kaum eine Sekunde: Sie öffnet das Formular frmKunden in der Entwurfsansicht, erstellt einen Verweis auf das Registersteuerelement tabKunden, löscht alle enthaltenen Registerseiten und erstellt 26 neue – für jeden Buchstaben des Alphabets eine, versehen mit dem Buchstaben als Beschriftung und einem Namen, der sich aus dem Präfix pge und dem jeweiligen Buchstaben zusammensetzt (pgeA, pgeB und so weiter).

Listing 1: Einstellen der Eigenschaften der Registerseiten

Public Sub RegisterEinrichten()
    Dim i As Integer
    Dim objTabControl As TabControl
    DoCmd.OpenForm "frmKunden", acDesign
    Set objTabControl = Forms!frmKunden!tabKunden
    Do While objTabControl.Pages.Count > 0
         objTabControl.Pages.Remove objTabControl.Pages.Count - 1
    Loop
    For i = 1 To 26
         With objTabControl
            .Pages.Add
            .Pages(i - 1).Caption = Chr(64 + i)
            .Pages(i - 1).Name = "pge" & Chr(64 + i)
        End With
    Next i
End Sub

Anzeige der Kunden im Unterformular

Jede Registerseite soll die Kunden anzeigen, deren Name mit dem Buchstaben auf der Registerlasche beginnt. Zur Darstellung der Kundenliste verwenden wir ein Unterformular, das seine Daten in der Datenblattansicht darstellt. Dazu erstellen Sie ein neues Formular, speichern es unter dem Namen sfmKunden, stellen die Datenherkunft auf die Tabelle tblKunden ein, ziehen alle benötigten Felder aus der Feldliste in den Detailbereich des Formularentwurfs (s. Bild 2) und stellen schließlich die Eigenschaft Standardansicht auf Datenblatt ein.

pic002.png

Bild 2: Das Unterformular zur Anzeige der Kundenliste in der Entwurfsansicht

Das Unterformular fügen Sie zum Formular mit dem Registersteuerelement hinzu, indem Sie es aus dem Datenblattfenster beziehungsweise dem Navigationsbereich in den Entwurf des Zielformulars ziehen.

Dabei gibt es zwei Möglichkeiten: Entweder Sie ziehen das Unterformular auf die aktuell ausgewählte Seite des Registersteuerelements, was sich dadurch bemerkbar macht, dass Access diese Seite schwarz einfärbt. Oder Sie ziehen das Unterformular an irgendeine Stelle außerhalb des Registersteuerelements.

Letzteres ist die richtige Variante: Wenn Sie das Unterformular auf eine Registerseite ziehen, würde Access dieses auch nur dann anzeigen, wenn der Benutzer die entsprechende Registerseite des Formulars ausgewählt hat. Während dies bei individuell gestalteten Registerseiten der richtige Weg ist, würde er bei unserer Lösung zur Überladung des Formulars führen: Wir müssten dann für jeden Buchstaben ein eigenes Unterformularsteuerelement zur Anzeige der Kunden mit dem jeweiligen Anfangsbuchstaben anlegen, was der Performance nicht zuträglich ist – selbst, wenn Sie dieses Unterformular jeweils erst dann füllen, wenn der Benutzer die entsprechende Registerseite aktiviert.

Wir legen also einfach ein einziges Unterformular neben dem Registersteuerelement ab und verschieben es dann wie in Bild 3 über das Registersteuerelement.

pic003.png

Bild 3: Das Registersteuerelement mit dem darüber platzierten Unterformular

Nun müssen wir noch dafür sorgen, dass das Unterformularsteuerelement nur diejenigen Datensätze der Tabelle tblKunden anzeigt, deren Name mit dem Buchstaben der gewählten Registerseite beginnt. Für diesen Zweck definieren wir im Klassenmodul zwei Ereignisprozeduren und eine weitere private Prozedur.

Klicken Sie in der Entwurfsansicht im Eigenschaftsfenster auf die Eigenschaft Beim Laden, wählen Sie dort den Eintrag [Ereignisprozedur] aus, klicken Sie auf die Schaltfläche mit den drei Punkten und ergänzen Sie die Prozedur Form_Load im VBA-Editor wie folgt:

Private Sub Form_Load()
    KundenFiltern
End Sub

Markieren Sie dann das Registersteuerelement im Formular und gehen Sie genau so für die Eigenschaft Bei änderung vor:

Private Sub tabKunden_Change()
    KundenFiltern
End Sub

Nun fehlt noch die hier bereits zweimal referenzierte Prozedur KundenFiltern. Diese sieht wie folgt aus und stellt den Filter des Unterformulars so ein, dass dieses nur die Kunden anzeigt, deren Feld Firma mit dem auf der Registerlasche angezeigten Buchstaben übereinstimmt:

Private Sub KundenFiltern()
    Me!sfmKunden.Form.Filter = "Firma LIKE ''" & Me!tabKunden.Pages(Me!tabKunden.Value).Caption & "*''"
    Me!sfmKunden.Form.FilterOn = True
End Sub

Fertig: Die Prozedur KundenFiltern sorgt sowohl gleich beim Laden des Formulars als auch nach jedem Mausklick auf eine der Registerlaschen für die Aktualisierung der im Unterformular angezeigten Kunden (s. Bild 4).

pic004.png

Bild 4: Die Kunden werden nun nach dem auf der Registerlasche angezeigten Buchstaben gefiltert.

Optimierung: Nur benötigte Registerlaschen anzeigen

Unter Umständen zeigt das Formular auf manchen Registerseiten keine Daten an, weil es schlicht keine Kunden gibt, deren Firmenname mit dem gewählten Buchstaben beginnt – dies kommt vor allem bei Buchstaben wie Q, X oder Y vor. Können wir dem Formular beibringen, die entsprechende Registerlasche erst gar nicht anzuzeigen Natürlich: Jedes Page-Objekt besitzt die Eigenschaft Visible, mit der Sie eine Registerseite ein- oder ausblenden können. Sie brauchen lediglich die folgenden Zeilen zur Prozedur Form_Load hinzuzufügen:

Dim i As Integer
For i = 1 To 26
    If Nz(DLookup("KundeID", "tblKunden", "Firma LIKE ''" & Chr(64 + i) & "*''")) = "" Then
          Me!tabKunden.Pages(i - 1).Visible = False
    End If
Next i

Die Prozedur durchläuft alle Buchstaben des Alphabets und prüft per DLookup-Funktion, ob es einen Kunden gibt, dessen Firmenname mit diesem Buchstaben beginnt. Falls nicht, wird die Visible-Eigenschaft auf Nein eingestellt.

Vertikale Registerlaschen

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