Was ist objektorientiertes VBA â und warum interessiert uns das?
VBA ist prozedural. Klar.
Aber es kann objektorientiert â zumindest in GrundzĂŒgen.
Und wenn Du in Access halbwegs sauber entwickeln willst, kommst Du da nicht drum rum.
Du willst Struktur, Wiederverwendung, Testbarkeit?
Dann trenn Logik von OberflĂ€che â und bau Dir Klassen.
Was geht â und was nicht
Feature | VBA-Klasse | Bemerkung |
---|---|---|
Eigenschaften & Methoden | Ja | Property Get/Let/Set , Sub , Function |
Kapselung | Ja | Private , Public , Friend |
Konstruktor | Halb | Class_Initialize nur ohne Parameter |
Vererbung | Nein | Nur manuell via Komposition |
Interfaces | Ja | ĂŒber Implements |
Events | Ja | z.âŻB. in Formularlogik |
Klassenmodul: Das Fundament
Ein Klassenmodul ist eine .cls
-Datei.
Du erstellst es ĂŒber EinfĂŒgen â Klassenmodul.
Dann gibst Du ihm einen Namen, z.âŻB. clsKunde
.
Beispiel: Klasse clsKunde
' Klassenmodul: clsKunde
Private pName As String
Private pKundennummer As Long
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Name(ByVal v As String)
pName = v
End Property
Public Property Get Kundennummer() As Long
Kundennummer = pKundennummer
End Property
Public Property Let Kundennummer(ByVal v As Long)
pKundennummer = v
End Property
Public Sub BegrĂŒĂen()
MsgBox "Moin " & pName & ", Deine Kundennummer ist: " & pKundennummer
End Sub
Verwendung im Standardmodul:
Public Sub TestKunde()
Dim k As clsKunde
Set k = New clsKunde
k.Name = "Martens"
k.Kundennummer = 12345
k.BegrĂŒĂen
End Sub
Klassen mit Interface (Implements
)
Du kannst Schnittstellen definieren. Sauber, wenn Du viele gleichartige Klassen brauchst.
Interface-Modul: IKunde
' Klassenmodul: IKunde (kein Code, nur Signaturen)
Public Property Get Name() As String
End Property
Public Property Let Name(ByVal v As String)
End Property
Public Sub BegrĂŒĂen()
End Sub
Umsetzung:
' Klassenmodul: clsKundeMitInterface
Implements IKunde
Private pName As String
Private Property Get IKunde_Name() As String
IKunde_Name = pName
End Property
Private Property Let IKunde_Name(ByVal v As String)
pName = v
End Property
Private Sub IKunde_BegrĂŒĂen()
MsgBox "Hallo " & pName
End Sub
Verwendung:
Dim obj As IKunde
Set obj = New clsKundeMitInterface
obj.Name = "Schmidt"
obj.BegrĂŒĂen
Objektlisten mit Collection
Wenn Du viele Objekte brauchst:
Dim kunden As Collection
Dim k As clsKunde
Set kunden = New Collection
Set k = New clsKunde
k.Name = "Maier"
k.Kundennummer = 1001
kunden.Add k
Set k = New clsKunde
k.Name = "Meier"
k.Kundennummer = 1002
kunden.Add k
Dim eintrag As clsKunde
For Each eintrag In kunden
Debug.Print eintrag.Name
Next
Objektorientiertes Design in Access
Objekte helfen Dir bei:
- Trennung von Daten und Formularlogik
- Wiederverwendung ĂŒber Projekte hinweg
- sauberem Unit Testing (mit eigenem Runner)
- Entkopplung von Code und UI (Modell-Logik statt Formular-Makro)
Grenzen und Workarounds
Was fehlt? | Was Du tun kannst |
---|---|
Kein Konstruktor mit Parametern | Init -Methode schreiben |
Keine Vererbung | Komposition per Referenz |
Keine Namespaces | PrÀfix im Klassennamen |
Kein Debuggen von Interfaces direkt | Wrapper verwenden |
VBA ist kein modernes OOP-Wunder.
Aber es reicht, um Access-Projekte zu strukturieren â wenn Du willst.
Und genau da liegt der Unterschied zwischen einem Skript und einer Lösung.
Wenn Du willst, zeig ich Dir, wie Du Dein Access-Projekt sauber kapselst.
Mit Klassen. Ohne Schnörkel. Und vor allem: wartbar.
Keine Antworten