TL;DR — Eine
Propertyverwandelt ein Feld einer Klasse in ein Tor. Aus Sicht des Aufrufers siehtemp.Salary = 65000wie 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 Getist das Lese-Tor,Property Letempfängt einen Wert undProperty Setempfängt ein Objekt.LetundSetzu verwechseln ist der Fehler Nummer eins; dasLetabsichtlich 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
