TL;DR —
Nothingest l'état de référence vide : une variable objet qui ne pointe vers aucun objet. Testez-le avecIf x Is Nothing— l'opérateurIs, jamais un simple=, car les objets ne peuvent pas se comparer avec=.Set x = Nothinglibère la référence. Toute variable objet démarre àNothing, et en utiliser une alors qu'elle vaut encoreNothingest la source de l'erreur 91, « Object variable or With block variable not set ».
Sub NothingBasics()
Dim ws As Worksheet ' demarre a Nothing - ne pointe vers aucune feuille
Set ws = FindSheet("Data") ' une fonction qui peut renvoyer Nothing
If ws Is Nothing Then ' Is, pas = (un = seul ne compile pas ici)
MsgBox "Sheet not found"
Exit Sub
End If
ws.Range("A1").Value = 1
Set ws = Nothing ' libere la reference
End Sub
Nothing est l'étape de la « libération » dans le cycle de vie d'un objet : vous créez un objet avec
New, vous y pointez une variable avec Set, et vous lâchez la
référence avec Nothing. C'est aussi l'état de départ de toute variable objet — ce qui explique précisément
pourquoi un objet non-Set explose.
Ce que vous allez apprendre
- Le modèle mental —
Nothingest un pointeur vide, une étiquette attachée à aucun objet - Pourquoi vous devez tester avec
If x Is Nothing, et jamaisIf x = Nothing - L'usage réel le plus courant — protéger un
Findou une recherche qui a renvoyéNothing - Quand
Set x = Nothingcompte réellement, et quand ce n'est qu'un rituel inoffensif - En quoi
Nothingdiffère d'Empty, deNullet de""(ils ne sont pas interchangeables)
Le modèle mental : un pointeur vide
Si une variable objet est une étiquette qui pointe vers un objet, alors Nothing est cette étiquette qui ne
pointe vers aucun objet. Ce n'est pas zéro, pas une chaîne vide, pas « vide » — cela décrit des valeurs.
Nothing est l'état précis d'une référence qui n'a aucun objet à l'autre bout.
Toute variable objet commence là. Dès l'instant où vous écrivez Dim ws As Worksheet, ws vaut Nothing ;
il reste Nothing jusqu'à ce qu'un Set le pointe vers une vraie feuille. Ce simple fait explique l'erreur
91 : utilisez une variable objet avant de la Set, et vous déréférencez Nothing — « Object variable or
With block variable not set » (voir Set). Nothing est à la fois là où naît une
référence et là où elle va quand vous la libérez.
Testez avec Is Nothing, jamais avec = Nothing
C'est le piège qui attrape tout le monde une fois. Vous ne pouvez pas tester la vacuité d'une référence avec
= :
If ws = Nothing Then ' FAUX - ne compile pas / erreur de type
If ws Is Nothing Then ' BON - Is compare l'identite, pas la valeur
= demande « ces deux valeurs sont-elles égales ? », et comparer ainsi exige une valeur par défaut — voilà
pourquoi Range("A1") = 5 fonctionne mais pas ws = Nothing. Is pose une autre question : « ces deux
étiquettes pointent-elles vers le même objet (ou vers aucun objet) ? » Tester Nothing, ou vérifier si deux
variables renvoient au même objet, est une question d'identité, elle utilise donc Is. Pour tester
l'inverse, enveloppez-le : If Not ws Is Nothing Then.
L'usage réel numéro un : protéger un Find qui a renvoyé Nothing
L'endroit le plus courant où Nothing apparaît dans les vraies macros, c'est le résultat d'une recherche.
Range.Find renvoie Nothing quand il ne trouve aucune correspondance — et aller chercher .Row sur ce
résultat est une erreur 91 pure et simple :
Dim hit As Range
Set hit = ws.Columns("A").Find(What:="Total", LookAt:=xlWhole)
If hit Is Nothing Then ' la garde qui evite l'erreur 91
MsgBox "No 'Total' row found"
Exit Sub
End If
MsgBox "Found in row " & hit.Row ' sans risque - hit pointe vers une vraie cellule
Toute API qui « pourrait ne rien trouver » — Find, une recherche dans un Dictionary enveloppée dans une
fonction utilitaire, une fonction qui renvoie un objet — peut vous tendre Nothing. L'habitude qui vous sauve
: chaque fois qu'une affectation peut donner Nothing, testez Is Nothing avant d'utiliser le résultat.
Quand Set x = Nothing compte réellement
Voici la réponse honnête que la plupart des tutoriels esquivent : pour une variable objet locale ordinaire,
Set x = Nothing à la fin d'un Sub est le plus souvent redondant. VBA libère automatiquement les
références d'objets locales quand la variable sort de portée à la fin de la procédure. Les mettre à Nothing
au préalable est sans danger, mais c'est un rituel, pas une nécessité.
Cela compte vraiment dans trois cas :
- Les références circulaires. Si l'objet A détient une référence vers B et que B en détient une vers A,
ils se maintiennent mutuellement en vie et ne sont jamais récupérés, même après la fin du
Sub. UnSet A.Partner = Nothingexplicite brise le cycle pour que les deux puissent être libérés. - Les variables objet de niveau module, globales ou
Static. Elles survivent à la procédure qui les a remplies, elles retiennent donc leur objet — et toutes les ressources Excel qu'il verrouille — jusqu'à ce que vous les libériez ou que le classeur se ferme. Libérez-les délibérément une fois que vous avez terminé. - Les objets d'application externe. Un
Outlook.Applicationou unWord.Applicationque vous avez créé continue de tourner en arrière-plan tant que toute référence vers lui n'est pasNothing. Libérez-le sans tarder pour que l'autre programme puisse se fermer.
La règle : libérez délibérément là où une référence vit longtemps ou est partagée ; ne collez pas
Set x = Nothing par superstition sur chaque variable locale.
Nothing n'est ni Empty, ni Null, ni la chaîne vide
Quatre « vides » différents piègent les gens parce que le langage courant les met dans le même sac. VBA les tient strictement séparés :
Nothing— une référence d'objet qui ne pointe vers aucun objet (If obj Is Nothing).Empty— unVariantnon initialisé qui n'a jamais été affecté (If IsEmpty(v)).Null— unVariantqui contient délibérément « aucune donnée valide », le plus souvent issu d'un champ de base de données (If IsNull(v)).""— unStringde longueur zéro. Une vraie chaîne, simplement vide (If s = "").
Ils ne sont pas interchangeables, et chacun a son propre test. Utiliser Is Nothing sur un Variant, ou
IsNull sur un objet, ne fera pas ce que vous attendez. Nothing est celui des objets — réservez-le aux
références.
Comment ExcelMaster vous aide
Nothing se tient aux deux bouts de la vie d'un objet, et chaque faux pas autour de lui échoue d'une façon
facile à manquer : un = Nothing qui ne compile pas, un résultat de Find utilisé sans garde qui déclenche
la 91, une application externe laissée en marche parce qu'une référence n'a jamais été libérée.
ExcelMaster écrit la garde pour vous —
If Not hit Is Nothing Then après toute recherche — utilise Is pour chaque test d'identité, et libère les
références durables et externes qui en ont réellement besoin sans parsemer Set x = Nothing sur chaque
variable locale. Vous décrivez le résultat ; il gère le cycle de vie. Vous gardez le classeur et le code.
Questions fréquentes
Que signifie Nothing en VBA ?
Nothing est l'état de référence vide d'une variable objet — la variable ne pointe vers aucun objet. Toute
variable objet démarre à Nothing jusqu'à ce qu'un Set lui en donne un, et Set x = Nothing la ramène à
cet état. Cela ne concerne que les objets, pas les valeurs.
Pourquoi ne puis-je pas utiliser If x = Nothing ?
Parce que = compare des valeurs, et une référence d'objet n'a aucune valeur à comparer — If x = Nothing
ne compile donc pas ou lève une erreur de type. Utilisez plutôt l'opérateur d'identité : If x Is Nothing.
Pour tester l'inverse, écrivez If Not x Is Nothing.
Dois-je mettre les objets à Nothing à la fin d'une macro ?
En général, non. VBA libère automatiquement les variables objet locales à la fin de la procédure,
Set x = Nothing sur une variable locale ordinaire est donc un rituel sans danger. Cela compte en revanche
pour les références circulaires, pour les variables objet de niveau module ou globales qui survivent à la
procédure, et pour les objets d'application externe comme Outlook.Application, qu'il faut libérer sans
tarder.
Comment vérifier si un Find ou une recherche n'a rien renvoyé ?
Testez le résultat avec Is Nothing avant de l'utiliser : Set hit = ws.Columns("A").Find("Total") puis
If hit Is Nothing Then ... Exit Sub. Range.Find renvoie Nothing quand il n'y a aucune correspondance, et
toucher .Row sur un résultat Nothing lève l'erreur 91, « Object variable or With block variable not set ».
Quelle est la différence entre Nothing, Empty, Null et la chaîne vide ?
Nothing est une référence d'objet qui ne pointe vers aucun objet ; Empty est un Variant non initialisé ;
Null est un Variant qui contient « aucune donnée valide », souvent issu d'une base de données ; "" est un
String de longueur zéro. Ce sont des états distincts, avec des tests distincts (Is Nothing, IsEmpty,
IsNull, = ""), et ils ne sont pas interchangeables.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 19/09/2026.
Guides associés : VBA Set · VBA New · VBA Dim · VBA CreateObject · VBA With
