Rekursive Verarbeitung von Hierarchiedaten in VBA

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 🐑

Kategorien: