VBA Klassenmodule: Objektorientiert programmieren in Excel
Lesedauer: 9 Min. • Datum: 11. April 2026 • Kategorie: VBA-Programmierung
Die meisten VBA-Entwickler arbeiten ausschließlich mit Standardmodulen und Prozeduren. Dabei bietet VBA mit Klassenmodulen ein leistungsfähiges Werkzeug für objektorientierten Code. Klassenmodule ermöglichen es, eigene Objekte mit Eigenschaften und Methoden zu definieren – und damit Code zu schreiben, der wartbarer, testbarer und wiederverwendbarer ist.
1. Was sind Klassenmodule?
Ein Klassenmodul ist eine Blaupause für ein Objekt. Während ein Standardmodul (.bas) Prozeduren und Funktionen enthält, definiert ein Klassenmodul (.cls) einen eigenen Datentyp mit:
- Properties – Eigenschaften, die Daten kapseln (Get/Let/Set)
- Methods – Prozeduren und Funktionen, die auf den Daten arbeiten
- Events – Ereignisse wie
Class_InitializeundClass_Terminate
Ein Klassenmodul fügen Sie im VBA-Editor über Einfügen → Klassenmodul hinzu und benennen es im Eigenschaftenfenster.
2. Erste Klasse erstellen: CRechnungsposition
Erstellen Sie ein neues Klassenmodul mit dem Namen CRechnungsposition:
' Klassenmodul: CRechnungsposition
Option Explicit
' Private Variablen (Datenkapselung)
Private pBeschreibung As String
Private pMenge As Long
Private pEinzelpreis As Currency
Private pMwStSatz As Double
' Konstruktor
Private Sub Class_Initialize()
pMwStSatz = 0.19 ' Standard-MwSt
pMenge = 1
End Sub
' Properties
Public Property Get Beschreibung() As String
Beschreibung = pBeschreibung
End Property
Public Property Let Beschreibung(ByVal wert As String)
If Len(wert) = 0 Then
Err.Raise vbObjectError + 1, "CRechnungsposition", _
"Beschreibung darf nicht leer sein."
End If
pBeschreibung = wert
End Property
Public Property Get Menge() As Long
Menge = pMenge
End Property
Public Property Let Menge(ByVal wert As Long)
If wert < 1 Then
Err.Raise vbObjectError + 2, "CRechnungsposition", _
"Menge muss mindestens 1 sein."
End If
pMenge = wert
End Property
Public Property Get Einzelpreis() As Currency
Einzelpreis = pEinzelpreis
End Property
Public Property Let Einzelpreis(ByVal wert As Currency)
pEinzelpreis = wert
End Property
Public Property Get MwStSatz() As Double
MwStSatz = pMwStSatz
End Property
Public Property Let MwStSatz(ByVal wert As Double)
pMwStSatz = wert
End Property
' Berechnete Properties (nur lesbar)
Public Property Get Nettobetrag() As Currency
Nettobetrag = pMenge * pEinzelpreis
End Property
Public Property Get MwStBetrag() As Currency
MwStBetrag = Nettobetrag * pMwStSatz
End Property
Public Property Get Bruttobetrag() As Currency
Bruttobetrag = Nettobetrag + MwStBetrag
End Property
3. Die Klasse verwenden
In einem Standardmodul können Sie nun Instanzen Ihrer Klasse erzeugen:
Sub RechnungspositionTesten()
Dim pos As New CRechnungsposition
pos.Beschreibung = "Excel-Vorlage Projektplanung"
pos.Menge = 3
pos.Einzelpreis = 249.5
Debug.Print "Position: " & pos.Beschreibung
Debug.Print "Netto: " & Format(pos.Nettobetrag, "#,##0.00 EUR")
Debug.Print "MwSt: " & Format(pos.MwStBetrag, "#,##0.00 EUR")
Debug.Print "Brutto: " & Format(pos.Bruttobetrag, "#,##0.00 EUR")
End Sub
Die Ausgabe im Direktfenster zeigt die korrekt berechneten Werte – die Logik ist vollständig in der Klasse gekapselt.
4. Collections: Mehrere Objekte verwalten
Erstellen Sie ein zweites Klassenmodul CRechnung, das mehrere Positionen verwaltet:
' Klassenmodul: CRechnung
Option Explicit
Private pPositionen As Collection
Private pKundenname As String
Private pRechnungsnummer As String
Private Sub Class_Initialize()
Set pPositionen = New Collection
End Sub
Public Property Let Kundenname(ByVal wert As String)
pKundenname = wert
End Property
Public Property Get Kundenname() As String
Kundenname = pKundenname
End Property
Public Property Let Rechnungsnummer(ByVal wert As String)
pRechnungsnummer = wert
End Property
Public Property Get Rechnungsnummer() As String
Rechnungsnummer = pRechnungsnummer
End Property
Public Sub PositionHinzufuegen(pos As CRechnungsposition)
pPositionen.Add pos
End Sub
Public Property Get AnzahlPositionen() As Long
AnzahlPositionen = pPositionen.Count
End Property
Public Property Get Gesamtbetrag() As Currency
Dim pos As CRechnungsposition
Dim summe As Currency
For Each pos In pPositionen
summe = summe + pos.Bruttobetrag
Next pos
Gesamtbetrag = summe
End Property
Public Sub InTabelleSchreiben(ws As Worksheet)
Dim pos As CRechnungsposition
Dim zeile As Long
zeile = 2
ws.Range("A1:E1").Value = Array("Beschreibung", "Menge", _
"Einzelpreis", "Netto", "Brutto")
Dim item As Variant
For Each item In pPositionen
Set pos = item
ws.Cells(zeile, 1).Value = pos.Beschreibung
ws.Cells(zeile, 2).Value = pos.Menge
ws.Cells(zeile, 3).Value = pos.Einzelpreis
ws.Cells(zeile, 4).Value = pos.Nettobetrag
ws.Cells(zeile, 5).Value = pos.Bruttobetrag
zeile = zeile + 1
Next item
End Sub
5. Wann lohnen sich Klassenmodule?
| Szenario | Standardmodul | Klassenmodul |
|---|---|---|
| Einfache Makros (5-20 Zeilen) | Ideal | Übertrieben |
| Wiederkehrende Geschäftslogik | Möglich, aber unübersichtlich | Empfohlen |
| Datenvalidierung mit Regeln | Fehleranfällig | Sicher durch Kapselung |
| Zusammenarbeit im Team | Schwer wartbar | Klar strukturiert |
| Wiederverwendung über Projekte | Copy-Paste-Probleme | Export/Import der .cls-Datei |
6. Fortgeschritten: Interfaces mit Implements
VBA unterstützt eine einfache Form von Interfaces über das Schlüsselwort Implements. So können Sie einen Vertrag definieren, den mehrere Klassen erfüllen müssen:
' Klassenmodul: IExportierbar
Public Function AlsText() As String
End Function
Public Function AlsCSVZeile() As String
End Function
' In CRechnungsposition: Interface implementieren
Implements IExportierbar
Private Function IExportierbar_AlsText() As String
IExportierbar_AlsText = pBeschreibung & " | " & _
pMenge & " x " & Format(pEinzelpreis, "#,##0.00")
End Function
Private Function IExportierbar_AlsCSVZeile() As String
IExportierbar_AlsCSVZeile = pBeschreibung & ";" & _
pMenge & ";" & pEinzelpreis & ";" & Nettobetrag
End Function
Fazit
Klassenmodule sind kein akademisches Konzept, sondern ein praktisches Werkzeug für jeden VBA-Entwickler, der über einfache Makros hinausgeht. Sie bringen Struktur, Sicherheit durch Datenkapselung und Wiederverwendbarkeit. Beginnen Sie mit einem einfachen Datenobjekt und erweitern Sie schrittweise – der Aufwand zahlt sich spätestens bei der nächsten Änderungsanfrage aus.
Das könnte Sie auch interessieren:
- VBA objektorientiert: Grundlagen und Best Practices
- VBA Performance-Optimierung: Schnellerer Code
- VBA Regex & Pattern Matching