TL;DR — Null est l'étiquette qui veut dire « pas de réponse unique ». En Excel VBA, on ne l'obtient presque jamais d'une cellule : une cellule vide est Empty, si bien qu'
IsNullsur une cellule vide vaut toujours False. On obtient Null en lisant une propriété d'une plage dont les cellules ne sont pas d'accord :Font.Boldsur des cellules en gras et d'autres non,NumberFormatsur des formats mélangés ouRowHeightsur des lignes de hauteurs différentes, ainsi qu'en lisant un champ de base de données. Deux règles en découlent : ne le testez qu'avecIsNull, carx = Nullvaut lui-même Null et n'est jamais True ; et lisez les propriétés portant sur toute une plage dans unVariant, car affecter Null à unBoolean, uneStringou unDoubles'arrête sur l'erreur 94, Invalid use of Null (« Utilisation incorrecte de Null » dans un Excel français).
Dim bold As Variant
bold = Range("A1:A10").Font.Bold
If IsNull(bold) Then Debug.Print "Some cells are bold, some are not"
Voici le troisième article d'une série consacrée à la question demander à une valeur ce qu'elle est :
IsEmpty pour les valeurs jamais affectées, VarType et TypeName
pour lire n'importe quelle étiquette, et ici IsNull pour l'étiquette qui signifie mixte ou inconnu. L'idée
de la série : une valeur VBA porte une étiquette de type distincte de son contenu, et ces tests lisent
l'étiquette, pas l'apparence de la valeur.
Ce que vous allez apprendre
- Le modèle mental : Null signifie pas de réponse unique
- D'où vient Null dans Excel, et d'où il ne vient pas
- Pourquoi = Null ne fonctionne jamais
- L'erreur 94, Invalid use of Null
- Comment Null se propage dans les expressions
- Traiter une plage mixte comme une troisième réponse
- Null venu des bases de données, à la frontière
Le modèle mental : Null signifie pas de réponse unique
Empty signifie n'a jamais reçu de valeur. Null signifie il n'existe pas de valeur unique à donner. Une
question comme « cette plage est-elle en gras ? » admet trois réponses honnêtes : oui, non, et « en partie ».
VBA n'a pas de troisième valeur booléenne : il répond donc avec un Variant qui contient Null.
Dès que vous voyez Null comme « les cellules ne sont pas d'accord » ou « la valeur est inconnue », son
comportement devient logique. Une comparaison avec une valeur inconnue donne un résultat inconnu. Une somme qui
inclut une inconnue est inconnue. Et une variable Boolean, qui ne contient que True ou False, n'a aucune
place pour « en partie ».
D'où vient Null dans Excel, et d'où il ne vient pas
Pas des cellules. La valeur d'une cellule vide est Empty, une cellule contenant "" est une String, une
cellule en erreur est une Error. IsNull(Range("A1").Value) vaut False dans tous ces cas, ce qui explique
qu'IsNull employé comme test de cellule vide ne se déclenche jamais. Utilisez IsEmpty
pour cela.
Des propriétés de plage sur des cellules qui ne sont pas d'accord. De nombreuses propriétés de Range
renvoient Null quand les cellules de la plage ne partagent pas une même valeur :
| Propriété sur une plage de plusieurs cellules | Renvoie Null quand |
|---|---|
Font.Bold, Font.Italic |
certaines cellules sont en gras ou en italique, d'autres non |
Font.Name, Font.Size, Font.Color |
les cellules utilisent des polices, tailles ou couleurs différentes |
NumberFormat |
les cellules ont des formats de nombre différents |
HorizontalAlignment, WrapText |
les cellules sont alignées ou renvoyées à la ligne différemment |
RowHeight, ColumnWidth |
les lignes ou les colonnes ont des tailles différentes |
HasFormula |
certaines cellules contiennent des formules, d'autres des constantes |
MergeCells, Locked |
certaines cellules sont fusionnées ou verrouillées, d'autres non |
Selection.Font.Bold sur une sélection partiellement en gras est l'exemple de tous les jours :
aucun True ni False ne la décrit, la réponse est donc Null.
De l'extérieur d'Excel. Un champ lu dans une base de données via ADO vaut Null quand la colonne de la base contient NULL.
Pourquoi = Null ne fonctionne jamais
Le premier réflexe est de comparer :
v = Range("A1:A10").Font.Bold
If v = Null Then Debug.Print "mixed" ' ne s'affiche jamais
If v <> Null Then Debug.Print "not mixed" ' ne s'affiche jamais non plus
Toute comparaison avec Null vaut elle-même Null, parce que comparer avec une inconnue donne une inconnue. If
traite une condition Null comme non vraie : les deux branches ci-dessus sont donc ignorées, quelle que soit
la valeur de v. Pas d'erreur de compilation, pas d'erreur d'exécution ; le test est mort en silence.
IsNull(v) est le seul test qui fonctionne.
L'erreur 94, Invalid use of Null
Le second réflexe est de déclarer le type attendu :
Dim isBold As Boolean
isBold = Range("A1:A10").Font.Bold ' Run-time error 94: Invalid use of Null
Cela fonctionne sur toutes les feuilles de test où la plage est entièrement en gras ou entièrement normale,
et échoue la première fois qu'un utilisateur a mis une seule cellule en gras. Il en va de même avec
Dim fmt As String: fmt = rng.NumberFormat sur des formats de nombre mélangés, avec
Dim h As Double: h = Rows("1:5").RowHeight sur des lignes de hauteur de ligne différente, et avec
CStr(Null) ou CLng(Null). Seul un Variant peut contenir Null.
La correction est toujours la même : lisez les propriétés portant sur toute une plage dans un Variant, testez IsNull, puis convertissez.
Dim fmt As Variant
fmt = rng.NumberFormat
If IsNull(fmt) Then
Debug.Print "Mixed formats in " & rng.Address
Else
Debug.Print "All cells use " & fmt
End If
Comment Null se propage dans les expressions
Null se propage à travers l'arithmétique et la plupart des fonctions, mais pas à travers l'opérateur & :
Dim n As Variant
n = Null
Debug.Print n + 1 ' Null
Debug.Print Len(n) ' Null
Debug.Print "Total: " + n ' Null (+ propage Null)
Debug.Print "Total: " & n ' Total: (& traite Null comme "")
Un Null qui entre dans un calcul voyage donc jusqu'au bout et n'échoue que lorsqu'il atteint une variable typée ou une fonction qui exige une vraie valeur. L'erreur 94 que vous voyez peut se produire plusieurs lignes après l'endroit où Null est entré. Face à une erreur 94, cherchez la première propriété ou le premier champ lu dans cette expression, pas la ligne qui a échoué.
Traiter une plage mixte comme une troisième réponse
Mixte n'est pas une erreur ; c'est une information. Décidez de ce que votre macro doit en faire. Une règle
courante, celle qu'applique le bouton Gras de Word, veut qu'une sélection mixte passe entièrement en gras. Une
bascule écrite uniquement avec Not ne peut pas faire ce choix, car Not Null vaut Null :
Sub ToggleBold()
Dim rng As Range, state As Variant
If TypeName(Selection) <> "Range" Then Exit Sub
Set rng = Selection
state = rng.Font.Bold
If IsNull(state) Then
rng.Font.Bold = True ' mixte : tout mettre en gras
Else
rng.Font.Bold = Not state
End If
End Sub
Le même schéma s'applique à toutes les propriétés du tableau ci-dessus : lire dans un Variant, donner sa
propre branche au cas mixte, puis agir. Pour les largeurs de colonne et les hauteurs de ligne, la branche
mixte consiste en général à « tout mettre à une même valeur » ; pour NumberFormat, il s'agit en général de
« signaler quelles cellules diffèrent » avant d'écraser quoi que ce soit.
Null venu des bases de données, à la frontière
Quand vous lisez des enregistrements avec ADO, toute colonne NULL arrive sous forme de Null et échoue dès que
vous la placez dans une variable typée ou l'ajoutez à un total. Convertissez-la une fois, là où elle entre
dans votre code. Excel VBA n'a pas de fonction Nz (elle appartient à Access) : écrivez-en une petite :
Function NzV(ByVal v As Variant, Optional ByVal ifNull As Variant = "") As Variant
If IsNull(v) Then NzV = ifNull Else NzV = v
End Function
total = total + NzV(rs!Amount, 0)
customer = NzV(rs!CustomerName, "")
Écrire tout un recordset dans la feuille avec Range.CopyFromRecordset ne demande aucune conversion : les
champs Null deviennent des cellules vides.
Le parti pris : Null est une troisième réponse, pas un bogue
La plupart des bogues liés à Null sont des déclarations de type qui n'ont laissé aucune place à « en partie ».
La règle qui les évite : toute propriété lue sur une plage de plusieurs cellules va dans un Variant, et le
cas mixte a sa propre branche. Ne comparez jamais avec = Null ; ne versez jamais une propriété portant sur
toute une plage directement dans un Boolean, une String ou un Double.
Et ne sortez pas IsNull pour tester des cellules. Une cellule vide est Empty, une saisie effacée est "",
une recherche qui a échoué est une Error. Si votre code teste des cellules avec IsNull, le test qu'il vous
faut est IsEmpty, Len ou IsError.
Comment ExcelMaster aide
Le code qui lit la mise en forme casse en général sur les vrais classeurs, où une plage n'est jamais tout à fait uniforme : une cellule en gras, un en-tête fusionné, une ligne un peu plus haute que les autres.
ExcelMaster examine la mise en forme de la plage réelle avant d'écrire du code, repère où les cellules diffèrent, et traite explicitement le cas mixte au lieu de le laisser à l'erreur 94.
Questions fréquentes
Que fait IsNull en VBA ?
IsNull(v) renvoie True si v est un Variant contenant Null, la valeur qui signifie « pas de réponse
unique » ou « inconnu ». Dans Excel, on la rencontre surtout avec les propriétés de plage sur des cellules
qui ne sont pas d'accord, et avec les champs de base de données.
Pourquoi IsNull renvoie-t-il False pour une cellule vide ?
Parce qu'une cellule vide est Empty, pas Null. Utilisez IsEmpty(Range("A1").Value) pour tester une cellule
qui n'a jamais été remplie.
Quelle est la cause de l'erreur d'exécution 94 Invalid use of Null ?
L'affectation de Null à une variable qui ne peut pas le contenir, comme un Boolean, une String, un Long ou un
Double, ou le passage de Null à une fonction comme CStr. Dans un Excel français, le message est
« Utilisation incorrecte de Null ». Lisez la valeur dans un Variant et testez d'abord IsNull.
Pourquoi If x = Null ne fonctionne-t-il jamais en VBA ?
Toute comparaison avec Null renvoie Null, et If traite Null comme non vrai. x = Null comme x <> Null
sont ignorés. Utilisez IsNull(x).
Comment vérifier si une plage a une mise en forme mixte en VBA ?
Lisez la propriété dans un Variant et testez-la : If IsNull(rng.Font.Bold) Then. Des propriétés comme
Font.Bold, NumberFormat, RowHeight et HorizontalAlignment renvoient Null quand les cellules
diffèrent.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 04/10/2026.
Guides connexes : VBA IsEmpty · VBA VarType et TypeName · VBA Nothing · VBA Font · VBA Number Format · VBA Column Width · VBA Data Types · VBA Error Handling
