TL;DR — En VBA, vous affectez un objet avec
Set, pas avec un simple=. Une variable objet est une référence — une étiquette qui pointe vers un objet vivant — si bien queSet ws = Worksheets("Data")pointe l'étiquette vers la feuille. Oubliez leSetet VBA lève l'erreur 91, « Object variable or With block variable not set ». UtilisezSetsur quelque chose qui n'est pas un objet et vous obtenez l'erreur 424, « Object required ». Les valeurs (Integer,String,Double) se copient avec=; les objets se pointent avecSet.
Sub ObjectsNeedSet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data") ' Set = pointe l'etiquette vers la feuille
ws.Range("A1").Value = 100 ' ws designe un objet maintenant - ca marche
Dim total As Double
total = ws.Range("A1").Value ' les valeurs utilisent =, pas de Set
End Sub
Set est la clé de voûte du cycle de vie d'un objet : vous créez un objet avec New,
vous pointez une variable vers lui avec Set, et vous le libérez avec Nothing.
Trompez-vous sur Set et vous tombez sur les deux erreurs que tout développeur VBA rencontre en premier — 91
et 424 — d'où l'intérêt de comprendre pourquoi les objets en ont besoin.
Ce que vous allez apprendre
- Le modèle mental — une variable objet est une référence (une étiquette), pas une boîte qui contient une copie
- Ce qui a besoin de
Set(Range,Worksheet,Workbook,Dictionary) et ce qui n'en a pas besoin (Integer,String) - Le bug numéro un — l'erreur 91, « Object variable or With block variable not set », due à un
Setmanquant - L'erreur 424, « Object required », et en quoi elle diffère de la 91
- Pourquoi
Set b = acrée deux noms pour le même objet vivant, pas une copie
Le modèle mental : une référence, pas une boîte
Une variable de valeur est une boîte. Dim n As Long: n = 5 place le nombre 5 à l'intérieur de n.
Copiez-la avec m = n et m reçoit son propre 5 ; changez m et n reste intact. Simple.
Une variable objet n'est pas une boîte — c'est une étiquette. Dim ws As Worksheet crée une étiquette
vide qui, pour l'instant, ne pointe vers aucune feuille. Set ws = Worksheets("Data") ne copie pas la feuille
dans ws ; elle pointe l'étiquette vers la feuille existante. C'est toute la raison d'être de Set :
affecter un objet est un acte de pointage, et VBA vous oblige à le dire explicitement.
Dim ws As Worksheet
ws = Worksheets("Data") ' FAUX - pas de Set - erreur d'execution 91
Set ws = Worksheets("Data") ' BON - l'etiquette pointe maintenant vers la feuille
Retenez une seule phrase et tout le reste en découle : les valeurs, vous les copiez avec = ; les objets,
vous les pointez avec Set. Les deux erreurs d'exécution ci-dessous ne sont que VBA vous disant qu'il n'a
pas pu pointer une étiquette correctement.
Le bug numéro un : l'erreur 91
La 91 est l'erreur qui pousse les gens à chercher de l'aide, sous son nom complet : « Object variable or
With block variable not set ». Elle signifie que vous avez utilisé une variable objet qui, pour l'instant, ne
pointe vers rien. Deux situations la provoquent, et toutes deux reviennent à un Set manquant.
D'abord, vous avez déclaré l'objet mais ne l'avez jamais affecté avec Set, il vaut donc toujours Nothing,
et vous l'avez utilisé :
Dim ws As Worksheet
ws.Range("A1").Value = 1 ' erreur 91 - ws n'a jamais ete Set, il pointe vers rien
Ensuite — le sournois — vous vouliez bien affecter la feuille, mais vous avez oublié le Set :
Dim ws As Worksheet
ws = ThisWorkbook.Worksheets("Data") ' erreur 91 - un = seul ne peut pas pointer une etiquette objet
Le correctif dans les deux cas tient en un mot : Set ws = ThisWorkbook.Worksheets("Data"). Chaque fois que
vous voyez « Object variable or With block variable not set », la première question est toujours : ai-je
Set cet objet, et la chose vers laquelle je l'ai Set existait-elle vraiment ? (Un Find ou une
recherche qui renvoie Nothing est l'autre source classique — la variable est
affectée, à Nothing, et vous l'avez utilisée quand même.)
Erreur 424 : Object required
La 424, « Object required », est l'image inversée de la 91. Là où la 91 dit « vous avez utilisé un
emplacement objet qui était vide », la 424 dit « vous avez utilisé Set, ou une syntaxe d'objet, sur une
chose qui n'est pas du tout un objet » :
Dim n As Long
Set n = 5 ' erreur 424 - 5 est une valeur, Set veut un objet
Set n = Range("A1").Value ' erreur 424 - .Value est un nombre, pas un objet
Un Set à gauche exige un objet à droite. Donnez-lui un nombre, une chaîne, ou une propriété qui renvoie une
valeur, et VBA répond « Object required ». Vous voyez aussi la 424 quand vous appelez une syntaxe d'objet sur
une variable ordinaire — x.Cells(1, 1) où x est un String, ou un nom de variable mal orthographié que
VBA traite en silence comme un Variant vide. La règle empirique : la 91 signifie « affectez-le d'abord » ;
la 424 signifie « ce n'est pas un objet, retirez le Set (ou corrigez le membre de droite) ».
Set crée un alias, pas une copie
Parce que Set pointe au lieu de copier, deux variables objet peuvent finir par pointer vers le même objet
vivant — et écrire à travers l'une change ce que l'autre voit :
Dim a As Range, b As Range
Set a = Range("A1:B2")
Set b = a ' b pointe vers le MEME range que a - pas une copie
b.ClearContents ' ca efface aussi a, car a et b sont un seul range
Comparez avec les valeurs, où une copie est vraiment une copie :
Dim x As Long, y As Long
x = 5: y = x ' y recoit son propre 5
y = 9 ' x vaut toujours 5 - des boites independantes
Ce mécanisme d'alias n'est pas un bug ; c'est tout l'intérêt des références, et c'est pourquoi passer des
objets d'un endroit à l'autre coûte peu (vous passez l'étiquette, jamais la feuille entière). Mais cela veut
dire que « j'ai copié le range dans une autre variable et je l'ai modifié » modifie en silence l'original.
Pour dupliquer les données, copiez les cellules (a.Copy), pas la référence.
Set contre Let
VBA possède en fait un mot-clé équivalent pour les valeurs : Let. Let n = 5 revient à n = 5 — le Let
est facultatif et plus personne ne l'écrit, si bien que l'affectation d'une valeur se lit comme un simple =.
Il n'existe pas de tel raccourci pour les objets : Set est obligatoire et ne peut jamais être omis. Cette
asymétrie est précisément ce qui rend l'oubli du Set si facile — toutes les autres affectations de votre
macro sont un simple =, et les objets sont le seul endroit où cela ne suffit pas.
Comment ExcelMaster vous aide
Toute l'histoire de Set tient en une décision prise à chaque affectation — est-ce une valeur que je copie,
ou un objet vers lequel je pointe ? — et se tromper échoue bruyamment avec la 91 ou la 424, ou en silence avec
un alias auquel vous ne vous attendiez pas.
ExcelMaster vous laisse décrire la tâche —
« prends la feuille Data, trouve la dernière ligne, écris le total » — et il écrit les références d'objets avec
Set là où il le faut, déclare chaque variable avec le bon type, et protège une recherche susceptible de
renvoyer Nothing avant d'en toucher le résultat, si bien que l'erreur 91 ne vous atteint jamais. Vous gardez
le classeur et le code.
Questions fréquentes
Que fait Set en VBA ?
Set affecte une référence à une variable objet — il pointe la variable vers un objet vivant tel qu'un
Range, une Worksheet, un Workbook ou un Dictionary. Contrairement à un simple =, qui copie une
valeur, Set ne copie pas l'objet ; il fait que la variable renvoie à celui qui existe déjà. Les objets ont
besoin de Set ; les valeurs (Integer, String, Double) non.
Pourquoi ai-je l'erreur « Object variable or With block variable not set » ?
C'est l'erreur d'exécution 91, et elle signifie que vous avez utilisé une variable objet qui ne pointe vers
rien. En général, vous l'avez déclarée avec Dim mais jamais affectée avec Set, ou vous avez écrit un simple
= au lieu de Set (un simple = ne peut pas pointer une variable objet), ou la chose que vous avez affectée
— comme un résultat de Find — a renvoyé Nothing. Ajoutez le Set, et vérifiez que
l'objet que vous affectez existe réellement.
Quelle est la différence entre l'erreur 91 et l'erreur 424 ?
L'erreur 91, « Object variable or With block variable not set », signifie que vous avez utilisé une variable
objet qui vaut actuellement Nothing — le correctif est de la Set d'abord. L'erreur 424, « Object
required », signifie que vous avez utilisé Set (ou une syntaxe d'objet) sur quelque chose qui n'est pas un
objet — comme Set n = 5 — le correctif est donc de retirer le Set ou de mettre un vrai objet dans le membre
de droite.
Ai-je besoin de Set pour un String ou un Integer ?
Non. String, Integer, Long, Double, Boolean, Date et les autres types de valeur s'affectent avec
un simple =, parce qu'ils sont copiés, pas référencés. Set ne concerne que les types objet. Utiliser Set
sur une valeur lève l'erreur 424, « Object required ».
Set copie-t-il l'objet ?
Non — Set pointe la variable vers l'objet existant. Set b = a vous donne deux variables qui renvoient au
même objet vivant, si bien qu'un changement à travers b est visible à travers a. Pour dupliquer les
données sous-jacentes (d'un range, par exemple), copiez les cellules avec a.Copy, pas la référence.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 19/09/2026.
Guides associés : VBA New · VBA Nothing · VBA Dim · VBA CreateObject · VBA With
