Moin. Ich bin Sönke SchĂ€fer, der DatenschĂ€fer. Wenn Du Daten hast, die sich selbst referenzieren – also Kategorien, Unterkategorien, ĂŒbergeordnete Elemente – dann brauchst Du eine Strategie. Und die heiĂt in der Regel: Rekursion. Heute zeig ich Dir, wie Du das in VBA umsetzt. Trocken, aber grĂŒndlich.
Worum geht’s hier eigentlich?
Ein typisches Beispiel: Du hast eine Tabelle tblKategorie.
- ID (PrimĂ€rschlĂŒssel)
- Bezeichnung
- ParentID (FremdschlĂŒssel auf ID)
Und nun willst Du die ganze Struktur durchlaufen. Zum Beispiel, um:
- eine Liste mit EinrĂŒckung zu erzeugen
- alle Unterknoten zu zÀhlen
- eine Navigation zu bauen
Das geht mit VBA – rekursiv, aber robust.
Das Grundprinzip: Funktion ruft sich selbst
Wir schreiben eine Funktion, die eine Kategorie-ID nimmt und alle Unterkategorien darunter durchlÀuft.
Variante: Hierarchie in die Immediate-Window schreiben
Sub ZeigeKategoriebaum(Optional parentID As Variant = Null, Optional einzug As String = "") Dim rs As DAO.Recordset Dim sql As String If IsNull(parentID) Then sql = "SELECT * FROM tblKategorie WHERE ParentID IS NULL" Else sql = "SELECT * FROM tblKategorie WHERE ParentID = " & parentID End If Set rs = CurrentDb.OpenRecordset(sql) Do While Not rs.EOF Debug.Print einzug & rs!Bezeichnung ZeigeKategoriebaum rs!ID, einzug & " " rs.MoveNext Loop rs.Close Set rs = NothingEnd Sub
Aufruf einfach mit:
Call ZeigeKategoriebaum
Du bekommst im Direktfenster die ganze Struktur, eingerĂŒckt nach Tiefe.
Was geht damit noch?
Du kannst mit dieser Logik auch:
- Dropdowns mit Unterstruktur aufbauen
- Kategoriepfade erzeugen (z. B. „BĂŒro > Möbel > StĂŒhle“)
- EintrÀge sortiert ausgeben
Beispiel: Kategoriepfad ermitteln
Jetzt drehen wir’s um – von unten nach oben:
Function GetKategoriePfad(katID As Long) As String Dim rs As DAO.Recordset Dim pfad As String Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblKategorie WHERE ID = " & katID) If Not rs.EOF Then If Not IsNull(rs!ParentID) Then pfad = GetKategoriePfad(rs!ParentID) & " > " End If pfad = pfad & rs!Bezeichnung End If rs.Close Set rs = Nothing GetKategoriePfad = pfadEnd Function
Einfach aufrufen mit:
Debug.Print GetKategoriePfad(42)
Ergebnis: „BĂŒro > Möbel > StĂŒhle“
Stolperfallen
- Endlosschleifen bei zyklischen Daten (ID verweist auf sich selbst)
- Null-Handling nicht vergessen
- Sortierung immer mitdenken (z. B. `ORDER BY`)
„Rekursion ist wie Kaffee: Gut, aber zu viel davon macht nervös.“
Fazit vom DatenschÀfer
Wenn Du Hierarchiedaten in Access verarbeiten willst, brauchst Du Rekursives Denken – und sauberen Code. Mit ein bisschen Planung kannst Du damit komplexe Navigationsstrukturen, Pfade, Berichte und UI-Elemente bauen. Wenn Du magst, unterstĂŒtz ich Dich gern dabei. Ich hab das schon oft fĂŒr KMU gebaut – ganz ohne Aufheben.
DatenschĂ€fer: Analyse, Auswertung und Automatisierung fĂŒr KMU im Norden đ