TL;DR —
IsEmptyne 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 variableStringaussi. 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 (CountAouCountBlank).
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
