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

VBA IsEmpty dans Excel — vérifier si une cellule est vide (et pourquoi une cellule qui semble vide ne l'est pas)

|

VBA IsEmpty dans Excel — vérifier si une cellule est vide (et pourquoi une cellule qui semble vide ne l'est pas)

TL;DR — IsEmpty ne regarde pas la cellule. Il pose une seule question, très étroite, à un Variant : a-t-il déjà reçu une valeur ? Une cellule jamais touchée répond oui. Une cellule qui contient une formule renvoyant "", une espace ou une apostrophe seule répond non, alors que toutes trois semblent vides. Une plage de plusieurs cellules répond toujours non, et une variable String aussi. Avant de tester si c'est « vide », décidez donc de quel vide vous parlez : rien n'a jamais été saisi (IsEmpty), rien n'est affiché (un test de longueur après suppression des espaces, qui écarte les cellules en erreur), ou une plage entière ne contient rien (CountA ou CountBlank).

If IsEmpty(Range("A2").Value) Then
    Debug.Print "Nothing was ever entered in A2"
End If

Voici le premier article d'une série consacrée à la question demander à une valeur ce qu'elle est : ici IsEmpty, puis VarType et TypeName, puis IsNull. L'idée de la série : une valeur VBA porte une étiquette de type distincte de son contenu, et chacun de ces tests lit l'étiquette, pas l'apparence de la valeur. Empty, Null, Nothing et "" ressemblent tous à rien, et ce sont quatre étiquettes différentes.

Ce que vous allez apprendre

  • Le modèle mental : Empty est une étiquette, pas une apparence
  • Trois cellules d'apparence vide qu'IsEmpty juge non vides
  • Pourquoi IsEmpty vaut toujours False pour une plage ou une variable String
  • La cellule vide qui vaut 0, et la cellule en erreur qui plante
  • Quel test utiliser pour chaque sens du mot vide
  • Empty, Null, Nothing et la chaîne vide côte à côte

Le modèle mental : Empty est une étiquette, pas une apparence

Un Variant transporte deux choses : une étiquette qui indique quel genre de valeur il contient, et la valeur elle-même. Empty est l'une de ces étiquettes. Elle signifie aucune valeur n'a jamais été placée ici. Un Variant déclaré et jamais affecté est Empty, tout comme le .Value d'une cellule où personne n'a rien saisi.

IsEmpty ne lit que l'étiquette. Il ne regarde jamais ce que la cellule affiche, ni son format, ni la présence d'une formule derrière. C'est ce qui le rend précis, et aussi ce qui surprend : une cellule peut ressembler trait pour trait à une cellule vide et porter malgré tout une étiquette String.

Trois cellules d'apparence vide qu'IsEmpty juge non vides

Placez ceci en A2, A3 et A4, laissez A5 intacte, et testez les quatre :

Cellule Contenu Apparence IsEmpty(.Value) .Value = ""
A2 =SI(B2="";"";B2) vide False True
A3 une espace vide False False
A4 une apostrophe seule ' vide False True
A5 rien vide True True

A2 contient une formule dont le résultat est une String de longueur nulle : l'étiquette est String, pas Empty. A3 contient une String d'un caractère. A4 contient une constante texte de longueur nulle : l'apostrophe est le caractère préfixe de la cellule, et la cellule n'est pas vide. Seule A5 n'a jamais reçu de valeur.

C'est le grand classique du « IsEmpty ne fonctionne pas ». Il fonctionne ; c'est la question qui était mauvaise. Les fonctions de feuille de calcul font la même distinction : ESTVIDE renvoie FAUX pour A2 à A4, et NBVAL compte les trois.

La même étiquette intervient quand on cherche la dernière ligne : End(xlUp) s'arrête sur une formule qui renvoie "", parce que cette cellule n'est pas vide. Le guide de la dernière ligne traite ce cas.

Pourquoi IsEmpty vaut toujours False pour une plage ou une variable String

IsEmpty n'a de sens que pour un Variant unique. Deux usages courants ne renvoient jamais True :

' Plage de plusieurs cellules : .Value est un tableau, et un tableau n'est pas Empty
If IsEmpty(Range("A2:A100").Value) Then    ' jamais True, meme si tout est vide

' Variable typee : une String demarre a "", un Long a 0, jamais Empty
Dim name As String
If IsEmpty(name) Then                      ' jamais True

Pour une plage, .Value renvoie un tableau à deux dimensions de Variants : l'étiquette est « tableau », jamais Empty. Pour une variable String, Long ou Date, la variable démarre avec une vraie valeur ("", 0, minuit le 30 décembre 1899) : il n'y a donc rien qui puisse être Empty. Seul un Variant peut être Empty, et vous pouvez le réinitialiser avec v = Empty. Le guide des types de données explique pourquoi les variables typées ne démarrent jamais vides.

La cellule vide qui vaut 0, et la cellule en erreur qui plante

Les comparaisons avec Empty sont généreuses. VBA convertit Empty en ce à quoi on le compare : 0 face à un nombre, "" face à une String. Une cellule vide est donc égale aux deux :

' A5 est vide
Debug.Print Range("A5").Value = 0      ' True
Debug.Print Range("A5").Value = ""     ' True

La première ligne provoque un vrai bogue de données. Une boucle qui compte les ventes nulles avec If c.Value = 0 compte aussi chaque cellule vide comme un zéro, et un état des « comptes à solde nul » inclut discrètement les comptes qui n'ont jamais été renseignés. Testez d'abord IsEmpty quand 0 et vide n'ont pas le même sens.

Le second piège va dans l'autre sens. Si une cellule contient une erreur comme #N/A, son .Value est une valeur Error, et la comparer à une String échoue :

' A6 contient =VLOOKUP(...) qui a renvoye #N/A
If Range("A6").Value = "" Then         ' Run-time error 13: Type mismatch

L'erreur 13 Type mismatch s'affiche dans un Excel français sous la forme « Incompatibilité de type ». Un test de cellule vide qui plante à la première erreur de recherche est fréquent dans les feuilles alimentées par RECHERCHEV ou RECHERCHEX. Vérifiez IsError avant toute comparaison. Le guide de gestion des erreurs traite l'erreur 13 et ses cousines.

Quel test utiliser pour chaque sens du mot vide

Derrière « est-ce vide ? », il y a trois questions différentes. Chacune a son test.

1. A-t-on déjà saisi quelque chose ? Utilisez IsEmpty sur la valeur de la cellule. C'est le bon test pour « cette cellule de saisie est-elle encore intacte ? » ou « trouver la prochaine ligne libre ».

If IsEmpty(c.Value) Then c.Value = Date

2. La cellule n'affiche-t-elle rien ? Traitez "", les espaces et l'apostrophe comme du vide, mais ne plantez jamais sur une erreur et ne traitez jamais 0 comme du vide :

Function LooksBlank(ByVal c As Range) As Boolean
    If IsError(c.Value) Then Exit Function        ' #N/A n'est pas vide
    LooksBlank = (Len(Trim$(CStr(c.Value))) = 0)  ' "", espaces, Empty
End Function

CStr(Empty) vaut "", donc une cellule réellement vide passe aussi le test, et CStr(0) vaut "0", donc un zéro ne le passe pas.

3. La plage entière est-elle vide ? Ne bouclez pas et n'utilisez pas IsEmpty. Demandez à Excel de compter :

Dim rng As Range
Set rng = Range("A2:A100")

If Application.WorksheetFunction.CountA(rng) = 0 Then
    Debug.Print "Nothing at all in the range, not even formulas"
End If

If Application.WorksheetFunction.CountBlank(rng) = rng.Cells.Count Then
    Debug.Print "Every cell is blank or shows an empty string"
End If

CountA (NBVAL) compte une formule qui renvoie "" comme une valeur ; CountBlank (NB.VIDE) la compte comme vide. Choisissez celui qui correspond à la question. Sur une plage potentiellement très grande, CountA est en outre bien plus rapide qu'une boucle sur les cellules.

Empty, Null, Nothing et la chaîne vide

Ces quatre valeurs se ressemblent dans le débogueur et se testent différemment :

Valeur Ce qu'elle signifie Où on la rencontre dans Excel Test
Empty aucune valeur n'a jamais été affectée .Value d'une cellule intacte ; un nouveau Variant IsEmpty(v)
"" une String sans aucun caractère une formule renvoyant "" ; une TextBox effacée Len(v) = 0
Null inconnu ou mixte Font.Bold d'une plage aux formats mélangés IsNull(v)
Nothing une variable objet qui ne pointe vers aucun objet un Find qui n'a rien trouvé obj Is Nothing

Une cellule vide n'est jamais Null ni Nothing : IsNull(Range("A5").Value) vaut False et Range("A5") n'est jamais Nothing. Le guide IsNull montre d'où vient réellement Null, et le guide Nothing traite des références d'objets.

Le parti pris : nommez le vide dont vous parlez

La plupart des bogues de cellules vides ne sont pas des bogues d'IsEmpty. Ils viennent d'un code qui dit « vide » sans préciser lequel. La règle qui les évite : inscrivez le sens dans le nom du test. IsEmpty pour les cellules de saisie intactes, une fonction LooksBlank pour les données issues de formules ou d'autres personnes, CountA ou CountBlank pour les plages entières, et une garde IsError avant toute comparaison avec "" ou 0.

Quand les données viennent d'un export ou d'un collègue, considérez LooksBlank comme le bon choix par défaut : les feuilles importées regorgent d'espaces et de formules qui renvoient "", et presque personne ne veut dire « jamais saisi » en disant qu'un champ client est vide.

Comment ExcelMaster aide

La logique des cellules vides est facile à écrire et facile à rater subtilement : un état qui compte les vides comme des zéros, une boucle qui s'arrête à la première formule, un test qui plante sur #N/A.

ExcelMaster lit d'abord votre feuille, repère quelles cellules « vides » le sont réellement, lesquelles contiennent des formules "" ou des espaces, et lesquelles contiennent des erreurs, puis écrit le test qui correspond à ce que vos données contiennent vraiment.

Questions fréquentes

Comment vérifier si une cellule est vide en VBA ?

Utilisez If IsEmpty(Range("A1").Value) Then. Ce test ne vaut True que si rien n'a jamais été saisi. Si la cellule peut contenir une formule qui renvoie "" ou des espaces parasites, utilisez Len(Trim$(CStr(c.Value))) = 0 après un test IsError.

Pourquoi IsEmpty renvoie-t-il False pour une cellule vide ?

Parce que la cellule n'est pas vide : elle contient une formule qui renvoie une chaîne vide, une espace ou une apostrophe seule. IsEmpty lit l'étiquette de type de la valeur, pas ce que la cellule affiche.

Comment vérifier si une plage est vide en VBA ?

Utilisez Application.WorksheetFunction.CountA(rng) = 0. IsEmpty sur une plage de plusieurs cellules vaut toujours False, car la valeur de la plage est un tableau.

Quelle est la différence entre IsEmpty et un test de chaîne vide en VBA ?

IsEmpty ne vaut True que pour une valeur jamais affectée. = "" vaut True pour une cellule vide comme pour une chaîne vide, et déclenche une erreur Type mismatch (« Incompatibilité de type ») si la cellule contient une valeur d'erreur comme #N/A.

Pourquoi ma cellule vide compte-t-elle comme zéro ?

VBA convertit Empty en 0 quand vous le comparez à un nombre : If c.Value = 0 vaut donc True pour une cellule vide. Testez d'abord IsEmpty(c.Value) quand vide et zéro n'ont pas le même sens.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 04/10/2026.

Guides connexes : VBA VarType et TypeName · VBA IsNull · VBA Nothing · VBA IsNumeric · VBA Data Types · VBA Last Row · VBA Error Handling · VBA SpecialCells