TL;DR — Une
Propertytransforme un champ d'une classe en porte. Côté appelant,emp.Salary = 65000ressemble à une simple variable, mais derrière cette affectation, c'est votre code qui s'exécute — vous pouvez donc valider, calculer, ou refuser l'écriture.Property Getest la porte de lecture,Property Letreçoit une valeur, etProperty Setreçoit un objet. ConfondreLetetSetest l'erreur numéro un ; omettreLetvolontairement, c'est ainsi qu'on rend un champ en lecture seule.
' --- Dans un class module (clsEmployee) ---
Private mSalary As Currency ' le champ de stockage, masqué de l'extérieur
Public Property Get Salary() As Currency ' porte de LECTURE
Salary = mSalary
End Property
Public Property Let Salary(ByVal value As Currency) ' porte d'ÉCRITURE d'une valeur
If value < 0 Then Err.Raise 5, , "Salary cannot be negative"
mSalary = value ' validé avant stockage
End Property
' --- L'usage se lit exactement comme un champ ordinaire ---
' emp.Salary = 65000 -> exécute Property Let (valide, stocke)
' Debug.Print emp.Salary -> exécute Property Get (renvoie mSalary)
' emp.Salary = -100 -> déclenche "Salary cannot be negative"
Un class module peut exposer ses données sous forme
de simples variables Public — et parfois c'est le bon choix. Mais si les classes
paraissent plus solides qu'un sac de champs publics, c'est grâce aux procédures
Property : ce sont le point d'accroche où vous décidez ce que le monde extérieur a
le droit de faire avec chaque champ.
Ce que vous allez apprendre
- Le modèle mental — une porte devant un champ, pas une variable brute
- Pourquoi une
Propertyvaut mieux qu'une simple variablePublic Get,LetetSet— et l'unique distinction sur laquelle tout le monde trébuche- Le motif du champ de stockage qui fait tout fonctionner
- Comment créer une propriété en lecture seule (et pourquoi c'est un atout)
- Quand une simple variable
Publicest le choix honnête
Le modèle mental : une porte devant un champ
Une Property est une porte placée devant un champ. Pour quiconque utilise
votre objet, elle est identique à une variable normale — on écrit
emp.Salary = 65000 et on lit x = emp.Salary — mais chacun de ces accès exécute
une petite procédure que vous avez écrite. La lecture exécute Property Get ;
l'écriture exécute Property Let (pour les valeurs) ou Property Set (pour les
objets).
Cette indirection est tout l'intérêt. Comme votre code se tient dans la porte, vous pouvez vérifier la valeur avant de la stocker, calculer une valeur qui n'est jamais stockée, ou tout simplement ne pas fournir de porte d'écriture pour que le champ devienne en lecture seule. L'appelant n'a jamais à le savoir — la syntaxe est la même dans tous les cas.
Pourquoi une Property vaut mieux qu'une simple variable Public
Un champ Public est un trou béant dans votre objet : n'importe qui peut y écrire
n'importe quoi, à n'importe quel moment, sans aucun contrôle. emp.Age = -5
réussit. emp.Id = 999 écrase une identité censée être permanente. Il n'y a nulle
part où placer une règle, parce qu'il n'y a aucun code entre l'appelant et le champ.
Une Property vous donne cet endroit. La défaillance qu'elle empêche, c'est
l'écriture erronée silencieuse — l'âge négatif, le salaire défini avec une chaîne
qui fera plus tard exploser un calcul, l'identifiant « unique » discrètement
réattribué. Avec un Property Let, l'écriture illégale est attrapée à l'instant
où elle se produit, avec un message clair, au lieu de refaire surface trois
procédures plus loin sous la forme d'un résultat faux et mystérieux.
Get, Let et Set : l'unique distinction sur laquelle tout le monde trébuche
Il existe trois procédures de propriété, et la séparation entre les deux procédures d'écriture est la pierre d'achoppement classique de VBA :
| Procédure | Sens | Reçoit / renvoie | À utiliser pour |
|---|---|---|---|
Property Get |
Lecture | Renvoie une valeur ou un objet | Lire n'importe quelle propriété |
Property Let |
Écriture | Reçoit une valeur (Long, String, Date, Currency…) | Écrire une propriété de type valeur |
Property Set |
Écriture | Reçoit un objet (Range, instance de classe…) | Écrire une propriété de type objet |
La règle est la même que celle qui régit l'affectation ordinaire en
VBA : les valeurs utilisent Let, les objets utilisent
Set. Si une propriété contient un Range et que vous écrivez un Property Let
pour elle, l'affectation emp.HomeCell = Range("A1") échoue, car affecter un objet
exige Set — et VBA cherche un Property Set qu'il ne trouve pas. Accordez la
procédure au genre de chose que contient le champ :
Private mRange As Range
Public Property Get HomeCell() As Range
Set HomeCell = mRange ' note : Set, car on renvoie un objet
End Property
Public Property Set HomeCell(ByVal r As Range) ' Set, pas Let — c'est un objet
Set mRange = r
End Property
' Usage : Set emp.HomeCell = Range("A1")
Remarquez que même à l'intérieur de Property Get, renvoyer un objet passe par
Set HomeCell = .... La distinction Let/Set suit le genre de données, partout.
Le motif du champ de stockage
Les propriétés vont presque toujours par paire, enroulées autour d'un champ caché.
Le champ est Private (le préfixe m est la convention pour « member »), et le
monde extérieur n'y accède qu'à travers les portes :
Private mName As String ' champ de stockage masqué
Public Property Get Name() As String
Name = mName
End Property
Public Property Let Name(ByVal value As String)
mName = Trim$(value) ' normalise à l'entrée
End Property
C'est la forme qui rend l'encapsulation réelle : les données vivent dans une seule
variable Private, et chaque lecture et chaque écriture passe par du code que vous
maîtrisez. Changez plus tard la façon dont un nom est stocké — élagué, mis en
majuscules, validé contre une liste — et vous ne modifiez qu'un seul Property Let,
pas chaque appelant.
Comment créer une propriété en lecture seule (et pourquoi c'est un atout)
Omettez le Property Let et le champ devient en lecture seule depuis
l'extérieur : la classe peut régler le champ de stockage en interne, mais les
appelants ne peuvent que le lire.
Private mId As Long
Public Property Get Id() As Long ' Get seulement — pas de Let
Id = mId
End Property
Friend Sub AssignId(ByVal newId As Long) ' la classe le règle en interne
mId = newId
End Sub
' emp.Id -> fonctionne (lecture)
' emp.Id = 42 -> erreur de compilation : Impossible d'affecter une valeur à une propriété en lecture seule
Cette erreur de compilation n'est pas un obstacle — c'est la garantie. Une propriété en lecture seule, c'est ainsi que vous exprimez « cette valeur est définie une fois et jamais modifiée », et le compilateur la fait respecter à votre place. La même technique vous donne des propriétés calculées qui n'ont aucun champ de stockage :
Public Property Get FullName() As String
FullName = mFirst & " " & mLast ' dérivé, rien n'est stocké
End Property
Quand une simple variable Public est le choix honnête
Voici le jugement qui sépare le bon VBA du copier-coller mécanique : tous les
champs n'ont pas besoin d'une Property. Si un champ n'a jamais besoin de
validation, jamais besoin d'être calculé, et qu'on peut le lire et l'écrire
librement, alors une variable Public dit exactement cela — et l'envelopper dans
une paire Get/Let de simple passe-plat, qui ne fait que recopier mX dans un
sens puis dans l'autre, ajoute du bruit, pas de la sûreté.
Donc : sortez une Property quand vous avez une raison — une validation, un
identifiant en lecture seule, une valeur calculée, un champ objet qui a besoin de
Set. Pour une valeur simple et sans contrainte, une variable Public est le choix
honnête et lisible. Ajoutez la porte quand vous avez besoin de la porte ; ne
construisez pas de portes autour de champs déjà ouverts.
Comment ExcelMaster aide
Les règles des propriétés sont modestes mais impitoyables : Let pour les valeurs,
Set pour les objets, un Let absent pour la lecture seule, un champ de stockage
Private derrière chaque paire. Trompez-vous dans l'appariement Let/Set et ça
ne compile pas ; trompez-vous dans l'encapsulation et votre champ « protégé » est
grand ouvert.
ExcelMaster
écrit toute la structure à votre place. Décrivez l'objet — « un Employee dont le
salaire ne peut pas être négatif, avec un identifiant en lecture seule et un nom
complet calculé » — et il génère les champs de stockage Private, le Property Let
qui valide, le Property Set conscient des objets là où il le faut, et les
propriétés en lecture seule à Get unique, toutes appariées correctement. Vous
obtenez une vraie encapsulation sans mémoriser quel mot-clé va avec quel genre de
champ.
Questions fréquentes
Qu'est-ce qu'une Property en VBA ?
Une Property est une procédure d'un class module qui
contrôle l'accès à un champ. Property Get s'exécute à la lecture du champ, et
Property Let (pour les valeurs) ou Property Set (pour les objets) s'exécute à son
écriture. Pour l'appelant, elle ressemble à une variable normale —
emp.Salary = 65000 — mais votre code s'exécute derrière l'affectation, vous pouvez
donc valider, calculer ou rendre le champ en lecture seule.
Quelle est la différence entre Property Let et Property Set ?
Property Let reçoit une valeur — un Long, une String, une Date, une
Currency, et ainsi de suite. Property Set reçoit un objet — un Range, une
instance de classe, ou n'importe quel type référence. C'est la même règle que
l'affectation ordinaire : les valeurs utilisent = (via Let), les objets
utilisent Set (via Set). Utiliser Let pour une propriété objet, ou Set pour
une valeur, provoque une erreur de compilation ou d'exécution.
Comment créer une propriété en lecture seule en VBA ?
Écrivez un Property Get mais pas de Property Let (ni de Set). Les appelants
peuvent alors lire la valeur mais pas la lui affecter — une tentative d'écriture
donne l'erreur de compilation « Impossible d'affecter une valeur à une propriété en
lecture seule ». La classe elle-même peut toujours modifier le champ de stockage en
interne. C'est idéal pour les valeurs d'identité définies une seule fois, ou pour des
propriétés calculées comme un nom complet dérivé d'autres champs.
Pourquoi utiliser une Property plutôt qu'une variable Public ?
Une variable Public peut être écrite avec n'importe quelle valeur, à n'importe
quel moment, sans aucun contrôle. Une Property vous offre un endroit où valider
une entrée, calculer une valeur, rendre un champ en lecture seule, ou changer plus
tard la façon de stocker les données sans toucher aux appelants. Utilisez une
Property quand vous avez une telle raison ; pour une valeur simple et sans
contrainte, une variable Public est plus simple et parfaitement honnête.
Que fait Property Get en VBA ?
Property Get est le versant lecture d'une propriété : il s'exécute chaque fois
que du code lit la propriété, et il renvoie la valeur (ou, pour une propriété objet,
la renvoie avec Set). On l'associe généralement à un Property Let ou Set pour
l'écriture, enroulé autour d'un champ de stockage Private — mais un Property Get
seul crée une propriété en lecture seule ou calculée.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 04/08/2026.
Guides associés : VBA Class Module · VBA Type · VBA Dim · VBA Function · VBA ByRef contre ByVal
