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

VBA Property dans Excel — Get, Let et Set (accès contrôlé aux champs d'une classe)

|

VBA Property dans Excel — Get, Let et Set (accès contrôlé aux champs d'une classe)

TL;DR — Une Property transforme un champ d'une classe en porte. Côté appelant, emp.Salary = 65000 ressemble à 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 Get est la porte de lecture, Property Let reçoit une valeur, et Property Set reçoit un objet. Confondre Let et Set est l'erreur numéro un ; omettre Let volontairement, 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 Property vaut mieux qu'une simple variable Public
  • Get, Let et Set — 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 Public est 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