Zum Hauptinhalt springen

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_Initialize und Class_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?

SzenarioStandardmodulKlassenmodul
Einfache Makros (5-20 Zeilen)IdealÜbertrieben
Wiederkehrende GeschäftslogikMöglich, aber unübersichtlichEmpfohlen
Datenvalidierung mit RegelnFehleranfälligSicher durch Kapselung
Zusammenarbeit im TeamSchwer wartbarKlar strukturiert
Wiederverwendung über ProjekteCopy-Paste-ProblemeExport/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:

Unsere Services

Projekt anfragen