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

VBA Nothing dans Excel — libérer les références, Is Nothing contre = Nothing, et quand cela compte

|

VBA Nothing dans Excel — libérer les références, Is Nothing contre = Nothing, et quand cela compte

TL;DRNothing est l'état de référence vide : une variable objet qui ne pointe vers aucun objet. Testez-le avec If x Is Nothing — l'opérateur Is, jamais un simple =, car les objets ne peuvent pas se comparer avec =. Set x = Nothing libère la référence. Toute variable objet démarre à Nothing, et en utiliser une alors qu'elle vaut encore Nothing est 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 — Nothing est un pointeur vide, une étiquette attachée à aucun objet
  • Pourquoi vous devez tester avec If x Is Nothing, et jamais If x = Nothing
  • L'usage réel le plus courant — protéger un Find ou une recherche qui a renvoyé Nothing
  • Quand Set x = Nothing compte réellement, et quand ce n'est qu'un rituel inoffensif
  • En quoi Nothing diffère d'Empty, de Null et 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. Un Set A.Partner = Nothing explicite 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.Application ou un Word.Application que vous avez créé continue de tourner en arrière-plan tant que toute référence vers lui n'est pas Nothing. 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 — un Variant non initialisé qui n'a jamais été affecté (If IsEmpty(v)).
  • Null — un Variant qui contient délibérément « aucune donnée valide », le plus souvent issu d'un champ de base de données (If IsNull(v)).
  • "" — un String de 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