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

VBA IsNull dans Excel — ce que Null signifie vraiment, et pourquoi = Null ne fonctionne jamais

|

VBA IsNull dans Excel — ce que Null signifie vraiment, et pourquoi = Null ne fonctionne jamais

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'IsNull sur 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.Bold sur des cellules en gras et d'autres non, NumberFormat sur des formats mélangés ou RowHeight sur 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'avec IsNull, car x = Null vaut lui-même Null et n'est jamais True ; et lisez les propriétés portant sur toute une plage dans un Variant, car affecter Null à un Boolean, une String ou un Double s'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