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 = Nothing
End 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 = pfad
End 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 🐑

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert