🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Property in Excel — Get, Let und Set (kontrollierter Zugriff auf die Felder einer Klasse)

|

VBA Property in Excel — Get, Let und Set (kontrollierter Zugriff auf die Felder einer Klasse)

TL;DR — Eine Property verwandelt ein Feld einer Klasse in ein Tor. Aus Sicht des Aufrufers sieht emp.Salary = 65000 wie eine ganz normale Variable aus, aber hinter dieser Zuweisung läuft Ihr Code — Sie können also prüfen, berechnen oder das Schreiben verweigern. Property Get ist das Lese-Tor, Property Let empfängt einen Wert und Property Set empfängt ein Objekt. Let und Set zu verwechseln ist der Fehler Nummer eins; das Let absichtlich wegzulassen ist die Art, ein Feld schreibgeschützt zu machen.

' --- Innerhalb eines Class module (clsEmployee) ---
Private mSalary As Currency          ' das hinterlegte Feld, von außen verborgen

Public Property Get Salary() As Currency   ' LESE-Tor
    Salary = mSalary
End Property

Public Property Let Salary(ByVal value As Currency)   ' Tor zum SCHREIBEN eines Werts
    If value < 0 Then Err.Raise 5, , "Salary cannot be negative"
    mSalary = value                  ' vor dem Speichern geprüft
End Property

' --- Die Verwendung liest sich genau wie ein einfaches Feld ---
' emp.Salary = 65000   -> führt Property Let aus (prüft, speichert)
' Debug.Print emp.Salary -> führt Property Get aus (gibt mSalary zurück)
' emp.Salary = -100    -> löst „Salary cannot be negative“ aus

Ein Class module kann seine Daten als einfache Public-Variablen freigeben — und manchmal ist das die richtige Wahl. Aber der Grund, warum sich Klassen solider anfühlen als ein Sack öffentlicher Felder, sind Property-Prozeduren: Sie sind der Haken, an dem Sie entscheiden, was die Außenwelt mit jedem Feld tun darf.

Was Sie lernen

  • Das mentale Modell — ein Tor vor einem Feld, keine rohe Variable
  • Warum eine Property eine einfache Public-Variable schlägt
  • Get, Let und Set — und die eine Unterscheidung, über die jeder stolpert
  • Das Muster mit dem hinterlegten Feld, das alles zum Laufen bringt
  • Wie Sie eine schreibgeschützte Property bauen (und warum das ein Feature ist)
  • Wann eine einfache Public-Variable die ehrliche Wahl ist

Das mentale Modell: ein Tor vor einem Feld

Eine Property ist ein Tor vor einem Feld. Für jeden, der Ihr Objekt verwendet, sieht es aus wie eine ganz normale Variable — man schreibt emp.Salary = 65000 und liest x = emp.Salary — aber jede dieser Berührungen führt eine kleine Prozedur aus, die Sie geschrieben haben. Das Lesen führt Property Get aus; das Schreiben führt Property Let (bei Werten) oder Property Set (bei Objekten) aus.

Diese Indirektion ist der ganze Sinn. Weil Ihr Code im Tor sitzt, können Sie den Wert prüfen, bevor Sie ihn speichern, einen Wert berechnen, der gar nicht gespeichert wird, oder schlicht kein Schreib-Tor anbieten, sodass das Feld schreibgeschützt wird. Der Aufrufer muss davon nie etwas wissen — die Syntax ist in jedem Fall dieselbe.

Warum eine Property eine einfache Public-Variable schlägt

Ein Public-Feld ist ein Loch direkt in Ihr Objekt: Jeder kann jederzeit alles hineinschreiben, ohne jede Prüfung. emp.Age = -5 gelingt. emp.Id = 999 überschreibt eine Identität, die eigentlich dauerhaft sein sollte. Es gibt keinen Ort für eine Regel, weil es keinen Code zwischen Aufrufer und Feld gibt.

Eine Property gibt Ihnen diesen Ort. Der Fehler, den sie verhindert, ist das stille Fehlschreiben — das negative Alter, das Gehalt, das auf eine Zeichenfolge gesetzt wird, die später eine Berechnung sprengt, die „eindeutige“ Id, die klammheimlich neu vergeben wird. Mit einem Property Let wird das unzulässige Schreiben an der Stelle abgefangen, an der es passiert, mit einer klaren Meldung, statt drei Prozeduren später als rätselhaft falsches Ergebnis aufzutauchen.

Get, Let und Set: die eine Unterscheidung, über die jeder stolpert

Es gibt drei Property-Prozeduren, und die Aufteilung zwischen den beiden Schreib-Prozeduren ist der klassische VBA-Stolperstein:

Prozedur Richtung Empfängt / gibt zurück Verwenden für
Property Get Lesen Gibt einen Wert oder ein Objekt zurück Lesen jeder Property
Property Let Schreiben Empfängt einen Wert (Long, String, Date, Currency…) Schreiben einer Wert-Property
Property Set Schreiben Empfängt ein Objekt (Range, Class-Instanz…) Schreiben einer Objekt-Property

Die Regel ist dieselbe, die auch die gewöhnliche Zuweisung in VBA bestimmt: Werte nutzen Let, Objekte nutzen Set. Hält eine Property einen Range und Sie schreiben ein Property Let dafür, dann schlägt emp.HomeCell = Range("A1") fehl, weil das Zuweisen eines Objekts Set braucht — und VBA sucht nach einem Property Set, das es nicht findet. Passen Sie die Prozedur an die Art des Dings an, das das Feld hält:

Private mRange As Range

Public Property Get HomeCell() As Range
    Set HomeCell = mRange          ' Hinweis: Set, weil wir ein Objekt zurückgeben
End Property

Public Property Set HomeCell(ByVal r As Range)   ' Set, nicht Let — es ist ein Objekt
    Set mRange = r
End Property
' Verwendung:  Set emp.HomeCell = Range("A1")

Beachten Sie, dass selbst innerhalb von Property Get das Zurückgeben eines Objekts Set HomeCell = ... verwendet. Die Unterscheidung Let/Set folgt überall der Art der Daten.

Das Muster mit dem hinterlegten Feld

Properties kommen fast immer als Paar, das ein verborgenes Feld umschließt. Das Feld ist Private (das m-Präfix ist Konvention für „member“), und die Welt erreicht es nur durch die Tore:

Private mName As String                    ' verborgenes hinterlegtes Feld

Public Property Get Name() As String
    Name = mName
End Property

Public Property Let Name(ByVal value As String)
    mName = Trim$(value)                    ' beim Hereinkommen normalisieren
End Property

Das ist die Form, die Kapselung real macht: Die Daten leben in einer einzigen Private-Variablen, und jedes Lesen und Schreiben geht durch Code, den Sie kontrollieren. Ändern Sie später, wie ein Name gespeichert wird — getrimmt, in Großbuchstaben, gegen eine Liste geprüft —, und Sie ändern ein einziges Property Let, nicht jeden Aufrufer.

Wie Sie eine schreibgeschützte Property bauen (und warum das ein Feature ist)

Lassen Sie das Property Let weg, und das Feld wird von außen schreibgeschützt: Die Klasse kann das hinterlegte Feld intern setzen, aber Aufrufer können es nur lesen.

Private mId As Long

Public Property Get Id() As Long     ' nur Get — kein Let
    Id = mId
End Property

Friend Sub AssignId(ByVal newId As Long)   ' die Klasse setzt es intern
    mId = newId
End Sub
' emp.Id            -> funktioniert (lesen)
' emp.Id = 42       -> Compilerfehler: „Zuweisung zu einer schreibgeschützten Eigenschaft nicht möglich“

Dieser Compilerfehler ist kein Hindernis — er ist die Garantie. Eine schreibgeschützte Property ist die Art, wie Sie ausdrücken „dieser Wert wird einmal gesetzt und nie mehr bearbeitet“, und der Compiler erzwingt es für Sie. Dieselbe Technik verschafft Ihnen berechnete Properties, die gar kein hinterlegtes Feld haben:

Public Property Get FullName() As String
    FullName = mFirst & " " & mLast        ' abgeleitet, nichts gespeichert
End Property

Wann eine einfache Public-Variable die ehrliche Wahl ist

Hier ist die Ermessensentscheidung, die gutes VBA von nachgeplappertem Boilerplate trennt: Nicht jedes Feld braucht eine Property. Wenn ein Feld nie eine Prüfung braucht, nie berechnet werden muss und frei gelesen und geschrieben werden darf, dann sagt eine Public-Variable genau das — und es in ein Durchreich-Paar aus Get/Let zu wickeln, das nichts tut, außer mX hin und her zu kopieren, fügt Lärm hinzu, keine Sicherheit.

Also: Greifen Sie zu einer Property, wenn Sie einen Grund haben — eine Prüfung, eine schreibgeschützte Id, einen berechneten Wert, ein Objektfeld, das Set braucht. Für einen einfachen, uneingeschränkten Wert ist eine Public-Variable die ehrliche, lesbare Wahl. Fügen Sie das Tor hinzu, wenn Sie das Tor brauchen; bauen Sie keine Tore um offene Felder.

Wie ExcelMaster hilft

Die Property-Regeln sind klein, aber unerbittlich: Let für Werte, Set für Objekte, ein fehlendes Let für schreibgeschützt, ein Private-Feld hinter jedem Paar. Bringen Sie die Let/Set-Paarung durcheinander, und es kompiliert nicht; bringen Sie die Kapselung durcheinander, und Ihr „geschütztes“ Feld liegt sperrangelweit offen.

ExcelMaster schreibt die ganze Form für Sie. Beschreiben Sie das Objekt — „ein Employee, dessen Gehalt nicht negativ sein darf, mit einer schreibgeschützten Id und einem berechneten vollständigen Namen“ — und es erzeugt die Private-Felder, das prüfende Property Let, das objektbewusste Property Set, wo nötig, und die Get-only-Properties, alle korrekt gepaart. Sie bekommen echte Kapselung, ohne sich zu merken, welches Schlüsselwort zu welcher Art Feld gehört.

Häufig gestellte Fragen

Was ist eine Property in VBA?

Eine Property ist eine Prozedur in einem Class module, die den Zugriff auf ein Feld steuert. Property Get läuft, wenn das Feld gelesen wird, und Property Let (bei Werten) oder Property Set (bei Objekten) läuft, wenn es geschrieben wird. Für den Aufrufer sieht es aus wie eine normale Variable — emp.Salary = 65000 —, aber hinter der Zuweisung läuft Ihr Code, sodass Sie prüfen, berechnen oder das Feld schreibgeschützt machen können.

Was ist der Unterschied zwischen Property Let und Property Set?

Property Let empfängt einen Wert — einen Long, String, Date, Currency und so weiter. Property Set empfängt ein Objekt — einen Range, eine Class-Instanz oder einen beliebigen Referenztyp. Es ist dieselbe Regel wie bei der gewöhnlichen Zuweisung: Werte nutzen = (über Let), Objekte nutzen Set (über Set). Let für eine Objekt-Property zu verwenden oder Set für einen Wert, ist ein Compiler- oder Laufzeitfehler.

Wie erstelle ich eine schreibgeschützte Property in VBA?

Schreiben Sie ein Property Get, aber kein Property Let (oder Set). Aufrufer können den Wert dann lesen, ihm aber nichts zuweisen — ein Schreibversuch ist der Compilerfehler „Zuweisung zu einer schreibgeschützten Eigenschaft nicht möglich“. Die Klasse selbst kann das hinterlegte Feld weiterhin intern ändern. Das ist ideal für Identitätswerte, die einmal gesetzt werden, oder für berechnete Properties wie einen vollständigen Namen, der aus anderen Feldern abgeleitet ist.

Warum eine Property statt einer Public-Variablen verwenden?

Eine Public-Variable kann jederzeit mit jedem Wert beschrieben werden, ohne jede Prüfung. Eine Property gibt Ihnen einen Ort, um Eingaben zu prüfen, einen Wert zu berechnen, ein Feld schreibgeschützt zu machen oder später zu ändern, wie die Daten gespeichert werden, ohne Aufrufer anzufassen. Nehmen Sie eine Property, wenn Sie einen solchen Grund haben; für einen einfachen, uneingeschränkten Wert ist eine Public-Variable einfacher und völlig ehrlich.

Was macht Property Get in VBA?

Property Get ist die Lese-Seite einer Property: Sie läuft, sobald Code die Property liest, und gibt den Wert zurück (oder, bei einer Objekt-Property, gibt ihn mit Set zurück). Sie wird typischerweise mit einem Property Let oder Set zum Schreiben gepaart, um ein Private-Feld gewickelt — aber ein Property Get allein erzeugt eine schreibgeschützte oder berechnete Property.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 04.08.2026.

Verwandte Anleitungen: VBA Class Module · VBA Type · VBA Dim · VBA Function · VBA ByRef vs. ByVal