Ein Kombinationsfeld mit hunderten Einträgen ist mehr Last als Hilfe. Wählt der Benutzer aber zuerst eine Kategorie, lässt sich die Liste im zweiten Feld auf eine überschaubare Handvoll eindampfen. Genau das leisten abhängige Kombinationsfelder: Die Auswahl im ersten Feld bestimmt, was im zweiten zur Verfügung steht. Wie das gelingt – vom einfachen Grundgerüst bis zu den Feinheiten, die im Alltag den Unterschied machen -, zeigt der vorliegende Beitrag.
Das Datenmodell
Als Beispiel dienen zwei Tabellen. In tblKategorien stehen die Kategorien mit den Feldern KategorieID und Kategorie, in tblProdukte die Produkte mit ProduktID, Produkt und dem Fremdschlüssel KategorieID (siehe Bild 1). Jedes Produkt gehört damit zu genau einer Kategorie – die klassische 1:n-Beziehung.

Bild 1: Das Datenmodell aus Kategorien und Produkten, verknüpft über die KategorieID
Die beiden Kombinationsfelder
Auf einem Formular platzieren wir zwei Kombinationsfelder, wie Bild 2 zeigt. Das erste, cboKategorieID, führt die Kategorien; das zweite, cboProduktID, später die dazu passenden Produkte. Beide arbeiten mit zwei Spalten, wobei wir die erste – die ID – über die Spaltenbreite 0 ausblenden. So sieht der Benutzer nur den Namen, während im Hintergrund der Schlüsselwert gebunden ist.

Bild 2: Die beiden Kombinationsfelder im Entwurf – oben die Kategorie, darunter das Produkt
Als Datensatzherkunft bekommt cboKategorieID eine Abfrage über alle Kategorien:
SELECT tblKategorien.KategorieID, tblKategorien.Kategorie FROM tblKategorien ORDER BY tblKategorien.Kategorie;
Und cboProduktID? Zunächst schlicht alle Produkte – diese Liste schränken wir gleich per VBA ein:
SELECT tblProdukte.ProduktID, tblProdukte.Produkt FROM tblProdukte ORDER BY tblProdukte.Produkt;
Der Grundmechanismus
Der Kern steckt in einem einzigen Ereignis. Sobald der Benutzer eine Kategorie gewählt hat, bauen wir die Datensatzherkunft des zweiten Feldes neu auf – gefiltert auf eben diese Kategorie. Das übernimmt die Prozedur cboKategorieID_AfterUpdate aus dem folgenden Listing, das wir für die Ereignisprozedur Nach Aktualisierung des Kombinationsfeldes cboKategorieID hinterlegen:
Private Sub cboKategorieID_AfterUpdate() Dim strSQL As String strSQL = "SELECT ProduktID, Produkt " _ & "FROM tblProdukte WHERE KategorieID = " _ & Me.cboKategorieID & " ORDER BY ProduktID" Me.cboProduktID.RowSource = strSQL End Sub
Wir setzen eine SELECT-Anweisung zusammen, die nur die Produkte der gewählten Kategorie liefert – das Kriterium bildet der gebundene Wert von cboKategorieID, also die KategorieID.
Diese Zeichenkette weisen wir der Eigenschaft RowSource von cboProduktID zu, und schon enthält das zweite Feld ausschließlich die passenden Produkte (siehe Bild 3).

Bild 3: Nach der Wahl einer Kategorie führt das Produktfeld nur noch die dazugehörigen Einträge
Die Liste gleich aufklappen
Ein kleiner Handgriff macht die Bedienung flüssiger, wie wir im Formular frmAbhaengigeKombinationsfelder_Dropdown zeigen.
Statt den Benutzer nach der Kategoriewahl selbst das Produktfeld öffnen zu lassen, geben wir ihm den Fokus und öffnen die Liste automatisch, wie folgendes Listing zeigt:
Private Sub cboKategorieID_AfterUpdate() Dim strSQL As String strSQL = "SELECT ProduktID, Produkt " _ & "FROM tblProdukte WHERE KategorieID = " _ & Me.cboKategorieID & " ORDER BY ProduktID" Me.cboProduktID.RowSource = strSQL Me.cboProduktID.SetFocus Me.cboProduktID.Dropdown End Sub
Neu sind die beiden letzten Zeilen: SetFocus setzt den Cursor ins Produktfeld, Dropdown klappt dessen Liste auf.
Der Benutzer sieht seine Auswahl sofort und muss nur noch zugreifen.
Ein tückischer Nebeneffekt
Bis hierher funktioniert alles – solange der Benutzer der Reihe nach vorgeht. Doch was geschieht, wenn er nach getroffener Produktwahl noch einmal die Kategorie wechselt? Dann behält cboProduktID seinen alten Wert, obwohl dieser in der neuen Liste gar nicht mehr vorkommt.
Das Feld zeigt daraufhin – scheinbar grundlos – nichts mehr an, denn ein Kombinationsfeld kann einen Wert nur darstellen, wenn er auch in seiner Liste steht.
Den im Kombinationsfeld cboProduktID in der Eigenschaft Value gespeicherten Wert können wir am einfachsten per VBA sichtbar machen.
Dazu geben wir im Direktbereich des VBA-Editors den folgenden Befehl ein (in einer Zeile), und betätigen die Eingabetaste:
Unser exklusives Angebot für Dich!
(Gilt für den Abschluss eines Jahres-Abonnements im ersten Jahr, danach 189,-/Jahr)
Hier geht’s weiter →Die ersten 4 Wochen kostenlos testen – voller Zugriff auf alle Artikel, vollständigen Code und Beispieldatenbanken. Kein Risiko: Wenn es nicht passt, kündigst Du einfach innerhalb der ersten vier Wochen.
Hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?
Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?
In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.
Jetzt kostenloses Access-Audit anfordern →