Dein Ratgeber zu VBA objektorientiert

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

FeatureVBA-KlasseBemerkung
Eigenschaften & MethodenJaProperty Get/Let/Set, Sub, Function
KapselungJaPrivate, Public, Friend
KonstruktorHalbClass_Initialize nur ohne Parameter
VererbungNeinNur manuell via Komposition
InterfacesJaĂŒber Implements
EventsJaz. 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 ParameternInit-Methode schreiben
Keine VererbungKomposition per Referenz
Keine NamespacesPrÀfix im Klassennamen
Kein Debuggen von Interfaces direktWrapper 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.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

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