Wenn das klassische Click-Ereignis nicht mehr reicht

Neue ActiveX-Elemente, WebView2, TreeView, ListView, DatePicker –
die klassischen Formularelemente in Access sind in die Jahre gekommen.

Aber es gibt Alternativen.
Und neue Events.
Und wenn Du darauf sauber reagieren willst, brauchst Du ein paar Tricks.

Warum die Standard-Ereignisse nicht reichen

Access kennt Click, Change, AfterUpdate.
Aber moderne Steuerelemente bringen eigene Events mit.

Beispiel: TreeView-Knoten erweitert, WebView2 lÀdt fertig, DatePicker-Datum gewÀhlt.
Das geht nicht mit [Form_Feldname]_Click().

Du brauchst ein Klassenmodul.
Und WithEvents.

Schritt 1: Das Klassenmodul anlegen

In Access: MenĂŒ → EinfĂŒgen → Klassenmodul
Speichern unter clsTreeHandler oder Àhnlich

Option Compare Database
Option Explicit

Public WithEvents tvw As MSComctlLib.TreeView

Private Sub tvw_NodeClick(ByVal Node As MSComctlLib.Node)
    MsgBox "Knoten: " & Node.Text
End Sub

Private Sub tvw_Expand(ByVal Node As MSComctlLib.Node)
    Debug.Print "Erweitert: " & Node.Text
End Sub

Jetzt wird bei Klick und Expand ein Event ausgelöst.

Schritt 2: Instanz im Formular halten

Im Formularmodul brauchst Du eine Objektvariable.
Sonst wird das Klassenobjekt gleich wieder aus dem Speicher geworfen.

Private clsTVW As clsTreeHandler

Private Sub Form_Load()
    Set clsTVW = New clsTreeHandler
    Set clsTVW.tvw = Me!treeview0.Object
End Sub

Ab jetzt funktionieren die Events aus dem Klassenmodul.
Und Du kannst sie nutzen wie native Ereignisse.

Beispiel: WebView2 – Ladeereignis abfangen

Wenn Du z. B. das neue WebView2-Control eingebunden hast:

' Klassenmodul: clsWebViewEvents
Public WithEvents web As WebView2

Private Sub web_NavigationCompleted(ByVal sender As Object, ByVal args As Object)
    MsgBox "Seite geladen."
End Sub

Dann im Formular:

Private clsWeb As clsWebViewEvents

Private Sub Form_Load()
    Set clsWeb = New clsWebViewEvents
    Set clsWeb.web = Me.WebView2Control.Object
End Sub

Typische Stolperfallen

  • WithEvents funktioniert nur mit COM-Objekten, nicht mit Standardmodulen
  • Wenn Du das Objekt im Formular nicht referenzierst, fliegt das Klassenobjekt raus
  • Manche Steuerelemente brauchen ein .Object, manche .Value, manche .Control

Tipp: Direkt TypeName(Me!Steuerelement.Object) prĂŒfen im Direktfenster

Tabelle: Klassische vs. moderne Ereignisbehandlung

Klassisch (z. B. Textfeld)Modernes Control (z. B. TreeView)
Sub txtName_AfterUpdate()Klassenmodul + WithEvents nötig
Direkte Behandlung im FormularIndirekte Behandlung ĂŒber Klasse
Nur Access-EreignisseCOM-Ereignisse + eigene Event-Objekte
Kein Lebenszyklus-ManagementKlassenvariable nötig

Erweiterung: mehrere Steuerelemente abbilden

Wenn Du z. B. mehrere TreeViews oder ListViews hast, kannst Du mit Collection arbeiten:

Private colHandlers As Collection

Private Sub Form_Load()
    Set colHandlers = New Collection

    Dim h1 As New clsTreeHandler
    Set h1.tvw = Me!tvwProjekt.Object
    colHandlers.Add h1

    Dim h2 As New clsTreeHandler
    Set h2.tvw = Me!tvwMitarbeiter.Object
    colHandlers.Add h2
End Sub

Solange colHandlers lebt, bleiben auch die Eventhandler aktiv.

Mein Setup fĂŒr moderne Controls mit VBA

ControlTechnik
TreeViewMSComctlLib + Klassenmodul
ListViewMSComctlLib + Events mit Klassenmodul
WebView2WebView2 ActiveX + NavigationCompleted
DateTimePickerMicrosoft Date and Time Picker Control
ModernUI (z. B. Office Ribbon)Callbacks ĂŒber XML + VBA

Neue Steuerelemente machen Access nicht schöner – aber nĂŒtzlicher.

Und wenn Du weißt, wie Du Events richtig kapselst,
dann wird’s auch stabil.
Nicht klicken. Nicht hoffen.
Sondern kontrolliert reagieren.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

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