TreeView FULL für Microsoft Access
TreeView FULL bringt einen vollständigen hierarchischen Baum in Microsoft Access — ohne externe DLLs, in drei Betriebsmodi, und mit einer VBA-Klasse, die in wenigen Zeilen einsatzbereit ist.
Was TreeView FULL ist
Ein Baumsteuerelement gehört zu den Steuerelementen, die Access von Haus aus nicht mitbringt — zumindest nicht in einer Form, die mit modernen Betriebssystemen zuverlässig zusammenarbeitet. TreeView FULL schließt diese Lücke: Es läuft innerhalb eines eingebetteten Edge-Browsers (acEdgeBrowser) direkt auf dem Access-Formular und kommuniziert über eine Timer-gesteuerte Polling-Schnittstelle mit VBA. Keine externen DLLs, keine COM-Registrierung — drei VBA-Klassen importieren, einen Browser-Control auf das Formular legen, fertig.
Das Ergebnis ist ein hierarchischer Baum mit Suchfunktion, Kontextmenüs, Badge-Anzeige für die Kindanzahl, Unicode-Icons und vollständig konfigurierbaren Farben — und das in drei voneinander unabhängigen Betriebsmodi.
Drei Modi für drei Situationen
Tabellenmodus liest eine Access-Tabelle mit festem Schema (ID, ParentID, Caption, …) und zeigt deren Inhalt als aufklappbaren Baum. Wer die Baumstruktur interaktiv pflegen möchte, setzt TreeEdit = True — damit erscheint ein vollständiges CRUD-Kontextmenü mit Drag & Drop direkt im Baum, ohne eine einzige Zeile Formular-Code.
SQL-Modus funktioniert wie der Tabellenmodus, wird aber aus einer beliebigen SELECT-Abfrage gespeist. Gefilterte oder berechnete Baumstrukturen aus mehreren verknüpften Tabellen sind damit kein Problem.
Explorer-Modus zeigt das Dateisystem eines lokalen Pfades. Unterordner werden erst beim Aufklappen geladen (Lazy Loading), sodass auch tiefe Verzeichnisbäume ohne spürbares Warten navigierbar sind.
Einbau
Drei Klassen werden in die Zieldatenbank importiert — in dieser Reihenfolge:
DPcore.cls— Laufzeitkern für Fehlerbehandlung, Cache, JSON und SQL-SchutzclsDPwebBridge.cls— Kommunikationsbrücke zwischen Browser-Control und VBAclsDPtreeView.cls— das Steuerelement selbst mit der öffentlichen API
Auf dem Formular genügt ein acEdgeBrowser-Steuerelement. Textfelder für Rückgabewerte sind optional. Zusätzliche VBA-Verweise werden nicht benötigt — alle drei Klassen arbeiten ausschließlich mit Late Binding.
Schnellstart: ein Baum in zwölf Zeilen
Option Compare Database
Option Explicit
Private objTreeView As clsDPtreeView ' Modulvariable — nicht lokal!
Private Sub Form_Open(Cancel As Integer)
Set objTreeView = New clsDPtreeView
objTreeView.AttachForm _
Me, Me.webTreeView, "webTreeView", "tblTreeView_Demo"
End Sub
Private Sub webTreeView_DocumentComplete(URL As Variant)
If Not objTreeView Is Nothing Then
objTreeView.HandleNavigationComplete
End If
End Sub Das ist der vollständige Mindestcode. AttachForm setzt den Formular-Timer und verankert die Klasse per WithEvents direkt im Host-Formular — die Klasse empfängt dessen Timer- und Unload-Ereignisse selbst. Form_Timer und Form_Close müssen im Formular nicht geschrieben werden.
Farben, Schrift und Access-Theme
Alle Farbeigenschaften erwarten CSS-Hex-Strings ("#rrggbb"). Die wichtigsten auf einen Blick:
| Eigenschaft | Standard | Bedeutung |
|---|---|---|
BackColor | #ffffff | Hintergrundfarbe des Baums |
ForeColor | #333333 | Textfarbe der Knoten |
AccentColor | #1976d2 | Farbe ausgewählter Knoten und Symbole |
HoverColor | (= AccentColor) | Hover-Farbe für Knoten und Schaltflächen |
BadgeBackColor | #cc3300 | Hintergrund des Kindanzahl-Badges |
Wer das Farbschema des Formulars nicht manuell übertragen möchte, nutzt ApplyAccessTheme: Die Methode liest Farbe, Hover-Zustand, Schriftart und Schriftgröße von einem beliebigen CommandButton des Formulars und überträgt sie in einem Aufruf auf den Baum. Einzelne Werte können danach noch überschrieben werden — die zuletzt gesetzte Zuweisung gewinnt.
Private Sub Form_Open(Cancel As Integer)
Set objTreeView = New clsDPtreeView
With objTreeView
.ApplyAccessTheme Me.btnBeliebig ' Theme vom Button übernehmen
.HoverColor = "#b4befe" ' einzelne Farbe anpassen
.ShowBadge = True
.ShowContext = True
.DefaultId = 5 ' Knoten 5 beim Öffnen vorauswählen
.AttachForm Me, Me.webTreeView, "webTreeView", "tblTreeView_Produkte"
End With
Set objTreeView.OnChangeTargetId = Me.txtId
Set objTreeView.OnChangeTargetCaption = Me.txtCaption
End Sub
Private Sub webTreeView_DocumentComplete(URL As Variant)
If Not objTreeView Is Nothing Then
objTreeView.HandleNavigationComplete
End If
End Sub Alle Eigenschaften müssen vor AttachForm gesetzt sein — danach sind ohne vollständigen Neuaufbau nur noch Datenaktualisierungen per InjectTreeData und Tabellenquellenwechsel per SetDataSource möglich.
Rückgabewerte empfangen
Beim Anklicken eines Knotens werden optional registrierte Textfelder automatisch befüllt:
Set objTreeView.OnChangeTargetId = Me.txtId
Set objTreeView.OnChangeTargetCaption = Me.txtCaption
Set objTreeView.OnChangeTargetValue = Me.txtValue Alternativ steht das Ereignis NodeSelected(ByVal sId As String) per WithEvents zur Verfügung, sowie die Cache-Eigenschaften SelectedId, SelectedCaption und SelectedValue zum direkten Lesen.
Vor einem Speichern-Button empfiehlt sich FlushNow — es leert die JavaScript-Warteschlange sofort, ohne auf den nächsten Timer-Tick zu warten, und stellt sicher, dass kein veralteter Wert gelesen wird:
Private Sub btnSpeichern_Click()
objTreeView.FlushNow
Dim lngId As Long
lngId = CLng(Nz(objTreeView.SelectedId, 0))
' ... weiterverarbeiten
End Sub Explorer-Modus: Dateisystem als Baum
Der Explorer-Modus benötigt keinen Tabellennamen, nur einen Startpfad:
With objTreeView
.Path = Environ$("ProgramFiles")
.ShowFiles = True
.FileFilter = "*.accdb;*.accdr"
.ShowNodeValue = True ' zeigt Dateigröße neben dem Namen
.ShowComment = True ' zeigt Änderungsdatum als Tooltip
.AttachFormExplorer Me, Me.webTreeView, "webTreeView"
End With
Set objTreeView.OnChangeTargetPath = Me.txtPfad
Set objTreeView.OnChangeTargetDate = Me.txtDatum Der Dateifilter akzeptiert einfache Endungen (pdf), Punkt-Endungen (.pdf), Wildcards (*.pdf) und Semikolon-getrennte Listen (*.cls;*.bas). Ordner werden immer alphabetisch vor den Dateien angezeigt; für Dateien lässt sich Sortierkriterium (Name, Date, Size, Type) und Richtung (ASC/DESC) frei wählen.
Wichtig: Der stabile Identifier einer Datei ist immer SelectedPath — synthetische Knoten-IDs werden bei jedem Scan neu vergeben und sind nicht persistierbar.
CRUD, Drag & Drop und Icon-Picker
Mit TreeEdit = True erscheint im Tabellen- und SQL-Modus ein vollständiges Bearbeitungsmenü: Knoten anlegen, duplizieren, löschen, innerhalb der Geschwister verschieben, eine Ebene hoch- oder runterstufen. Drag & Drop ist ebenfalls enthalten — sein Abschluss meldet sich als EditAction-Ereignis mit dem Muster DRAGDROP:dragId:targetId:zone (zone = before, inside oder after).
Der Icon-Picker zeigt 1377 Unicode-Symbole in einem durchsuchbaren Raster und wird an ein zweites acEdgeBrowser-Steuerelement angebunden. Er wird pro Farbkombination einmal aufgebaut und im Session-Cache gehalten — mehrere Instanzen oder Tabellenwechsel kosten keinen zweiten Ladevorgang.
Im Lieferumfang ist außerdem frmDPtreeView_Builder enthalten: ein fertiges Formular, das tblTreeView_*-Tabellen visuell verwaltet — neue Tabelle anlegen, Knoten bearbeiten, Icons zuweisen, Reihenfolge per Drag & Drop anpassen. Der Builder wechselt zwischen Tabellen ohne den Icon-Picker neu zu laden, was die Umschaltzeit auf unter 100 ms reduziert.
Wie die Kommunikation intern funktioniert
VBA kann aus einem Browser-Ereignis heraus nicht direkt lesen — ein synchroner Zugriff würde den WebView2-Renderer und den Access-UI-Thread in eine Verklemmung treiben. Die Lösung ist eine Timer-gesteuerte Polling-Schleife: Jede Interaktion im Browser (Klick, Auswahl, Drag & Drop) schreibt einen Befehl in eine JavaScript-seitige Queue. Bei jedem Timer-Tick leert HandleTimer die gesamte Queue auf einmal und liefert sie als JSON-Array zurück.
Der Idle-Gate-Mechanismus sorgt dafür, dass nur tatsächlich gelesen wird, wenn der Anwender mindestens IdleGateMs Millisekunden (Standard: 250 ms) ruhig war. Reines Timer-Ticken ohne Lesezugriff ist dagegen praktisch kostenlos. Wer den Wert anpassen möchte:
objTreeView.IdleGateMs = 200 ' etwas früher pollen
objTreeView.IdleGateMs = 0 ' Gate deaktivieren, immer sofort pollen Ladezeit
Der zeitbestimmende Schritt ist nicht das Erzeugen der HTML-Daten in VBA, sondern das Rendern durch WebView2 — dieser Anteil bestimmt praktisch die gesamte Ladezeit und liegt außerhalb des Einflussbereichs dieser Komponente. Wer die wahrgenommene Ladezeit senken möchte, setzt an der Datenmenge an: Der Explorer-Modus lädt Unterordner erst beim Aufklappen (Lazy Loading) — genau aus diesem Grund. Im Tabellen- und SQL-Modus aktualisiert InjectTreeData den laufenden Baum ohne Seitenneuladung, was die häufigste Operation deutlich beschleunigt.
Systemvoraussetzungen
| Voraussetzung | Wert |
|---|---|
| Microsoft Access | 2024 oder Microsoft 365 (32 oder 64 Bit) |
| Windows | 10 oder 11 |
| WebView2 Runtime | muss installiert sein (wird mit Microsoft Edge ausgeliefert) |
| VBA-Verweise | keine — ausschließlich Late Binding |
clsDPtreeView prüft beim Start, ob DPcore mindestens Version 1.0.7 vorhanden ist. Fehlt diese Version, erscheint einmalig eine Meldung — in diesem Fall DPcore.cls aus dem aktuellen Paket neu importieren.
Alle Fehler werden automatisch in dp_log.jsonl neben der Datenbankdatei protokolliert. Ein schneller Überblick über den Systemzustand:
MsgBox DPcore.SysSelfTest 



