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