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

VBA Set dans Excel — pourquoi les variables objet ont besoin de Set (et les erreurs 91 et 424)

|

VBA Set dans Excel — pourquoi les variables objet ont besoin de Set (et les erreurs 91 et 424)

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 que Set ws = Worksheets("Data") pointe l'étiquette vers la feuille. Oubliez le Set et VBA lève l'erreur 91, « Object variable or With block variable not set ». Utilisez Set sur 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 avec Set.

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 Set manquant
  • L'erreur 424, « Object required », et en quoi elle diffère de la 91
  • Pourquoi Set b = a cré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)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