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

VBA IsNumeric dans Excel — pourquoi il dit oui à des choses qui ne sont pas des nombres

|

VBA IsNumeric dans Excel — pourquoi il dit oui à des choses qui ne sont pas des nombres

TL;DRIsNumeric(value) renvoie True quand VBA estime qu'il pourrait convertir la valeur en nombre — un filet bien plus large que les entiers propres que vous avez sans doute en tête. Il répond True à "1E5" (notation scientifique), "&HFF" (littéral hexadécimal), "1,000" (séparateur de milliers), " 42 " (entouré d'espaces) et même "12-" (signe en fin). Il dépend aussi des paramètres régionaux, si bien que "1,5" est un nombre sur une machine allemande et pas sur une américaine. Servez-vous-en comme d'un premier filtre bon marché, mais dès que vous voulez exactement un entier propre ou un code fait de chiffres seuls, verrouillez la forme avec l'opérateur Like à la place.

Sub IsNumericSurprises()
    Debug.Print IsNumeric("123")      ' True  - comme prevu
    Debug.Print IsNumeric("1E5")      ' True  - lu comme 100000 (scientifique)
    Debug.Print IsNumeric("&HFF")     ' True  - lu comme 255 (litteral hexa)
    Debug.Print IsNumeric("1,000")    ' True  - separateur de milliers
    Debug.Print IsNumeric("  42  ")   ' True  - espaces de tete/fin ignores
    Debug.Print IsNumeric("12-")      ' True  - signe final autorise

    Debug.Print IsNumeric("12.3.4")   ' False - deux points decimaux
    Debug.Print IsNumeric("")         ' False - chaine vide
    Debug.Print IsNumeric("2026-01-01") ' False - c'est une date, utilisez IsDate
End Sub

Ce que vous allez apprendre

  • Le modèle mental — IsNumeric teste ce que VBA pourrait analyser, pas ce que vous vouliez dire
  • Les trois testeurs de texte, de puissance croissante, et la question à laquelle chacun répond
  • Pourquoi la notation scientifique et les littéraux hexadécimaux passent tout droit
  • Pourquoi les espaces, les signes et les séparateurs de milliers passent tous
  • Pourquoi IsNumeric dépend des paramètres régionaux, et comment cela corrompt les données d'une machine à l'autre
  • IsNumeric contre IsNumber contre IsDate, et le contrôle strict à utiliser à la place

Le modèle mental : IsNumeric demande ce que VBA pourrait analyser, pas ce que vous vouliez dire

IsNumeric n'est pas un validateur. C'est un aperçu de la coercition de type propre à VBA : il renvoie True pour toute chaîne que CDbl (ou la conversion implicite derrière une analyse à la Val) avalerait sans erreur. La règle est délibérément généreuse, car l'analyseur numérique de VBA comprend la notation scientifique, les littéraux hexadécimaux et octaux, les symboles monétaires et de regroupement, ainsi que les espaces autour.

La bonne question à se poser n'est donc jamais « est-ce un nombre ? ». C'est « VBA convertirait-il ceci en nombre si je le lui demandais ? » — et la réponse est oui bien plus souvent que vous ne le voudriez. Chaque surprise ci-dessous découle directement de ce seul cadrage.

Les trois testeurs, de puissance croissante

IsNumeric est le premier barreau d'une échelle. Avant de faire confiance à une chaîne, vous la testez — et VBA vous tend trois testeurs, chacun répondant à une question différente et chacun vous mentant à sa façon :

Testeur La question à laquelle il répond Son mensonge caractéristique
IsNumeric VBA pourrait-il analyser ceci comme un nombre ? Dit oui à "1E5", "&HFF", "12-"
Like La chaîne entière épouse-t-elle cette forme ? La casse dépend d'un interrupteur à l'échelle du module
RegExp Correspond-il à un vrai motif, et qu'y a-t-il dedans ? Ne renvoie rien tant que vous n'avez pas réglé Global et atteint SubMatches

Attrapez le plus faible et de mauvaises données se faufilent ; attrapez le plus lourd et vous vous noyez dans la configuration. Le savoir-faire, c'est de savoir quelle question vous posez réellement. IsNumeric répond à la question la plus lâche, ce qui en fait le plus rapide à saisir et le plus facile à mal employer. Quand « pourrait être un nombre » n'est pas assez serré — vous voulez exactement trois chiffres, ou un montant positif, ou un code sans lettres — vous avez quitté le barreau du bas et il vous faut Like ou un vrai motif.

Piège 1 : la notation scientifique et les littéraux hexadécimaux passent tout droit

Les deux qui piègent tout le monde : "1E5" et "&HFF".

Debug.Print IsNumeric("1E5")    ' True
Debug.Print CDbl("1E5")         ' 100000     <- E est un exposant
Debug.Print IsNumeric("&HFF")   ' True
Debug.Print CLng("&HFF")        ' 255        <- &H est un litteral hexa

Ce n'est pas un bug — c'est VBA qui reste cohérent. Mais c'est un désastre de données quand le champ est un code plutôt qu'une quantité. Un identifiant produit comme 1E5, un suffixe de compte comme 12E3, ou une référence de pièce qui commence par &H : tout passe la validation, puis se fait silencieusement transformer en un grand entier dès que vous convertissez. L'utilisateur a tapé une étiquette ; votre macro a stocké un nombre en millions et a poursuivi sans un mot.

Si la colonne est censée contenir des identifiants, IsNumeric est le mauvais filtre de bout en bout — vous ne voulez pas « analysable comme un nombre », vous voulez « ces caractères exacts ». C'est le travail de l'opérateur Like ou d'une simple comparaison de chaînes, pas d'IsNumeric.

Piège 2 : les espaces, les signes et les séparateurs de milliers passent tous

L'analyseur de VBA est indulgent avec la cosmétique autour d'un nombre, si bien que tout ceci renvoie True :

Debug.Print IsNumeric("  42  ")  ' True - les espaces autour sont supprimes
Debug.Print IsNumeric("+5")      ' True - signe de tete
Debug.Print IsNumeric("12-")     ' True - signe FINAL (le fameux)
Debug.Print IsNumeric("1,000")   ' True - separateur de milliers
Debug.Print IsNumeric("(5)")     ' True - negatif facon comptable

Le cas du signe final ("12-") surprend presque tout le monde, et les parenthèses comptables ("(5)") sont un vrai piège quand vous importez un export financier et que la moitié de vos négatifs arrivent entre parenthèses. À l'inverse, les choses que vous attendriez comme valides ne le sont pas : un espace interne ("1 2"), une fraction ("1/2") et une chaîne vide renvoient toutes False. La règle n'est pas « ressemble à des chiffres » — c'est « épouse l'une des formes numériques acceptées par VBA », et cet ensemble est à la fois plus large et plus étrange que l'intuition.

Piège 3 : il dépend des paramètres régionaux, donc il corrompt les données d'une machine à l'autre

C'est le piège silencieux qui survit aux tests et échoue en production. IsNumeric respecte les paramètres régionaux de la machine pour les séparateurs décimal et de regroupement :

' Sur une machine US (decimale = ".")
Debug.Print IsNumeric("1,5")   ' False - la virgule n'est pas une decimale ici
Debug.Print IsNumeric("1.5")   ' True

' Sur une machine allemande (decimale = ",")
Debug.Print IsNumeric("1,5")   ' True  - la virgule EST la decimale
Debug.Print IsNumeric("1.5")   ' True  - le point lu comme separateur de milliers

Le même classeur, la même macro, deux réponses différentes selon qui l'ouvre. Une étape de validation qui passe sur votre bureau laisse le "1,5" d'un collègue passer pour 1.5 — ou le rejette d'emblée — et vous ne le verrez jamais dans un test. Quand la valeur vient d'un fichier, d'une page web ou d'une autre région, faites l'analyse vous-même avec une hypothèse explicite (CDbl respecte les paramètres régionaux ; Val traite toujours . comme la décimale), plutôt que de croire qu'IsNumeric signifie la même chose partout.

IsNumeric contre IsNumber contre IsDate

Trois fonctions que l'on saisit indifféremment, trois travaux différents :

  • IsNumeric(x) — une fonction VBA qui demande si une chaîne pourrait être analysée comme un nombre. C'est celle dont parle cet article.
  • Application.WorksheetFunction.IsNumber(cell) — la fonction de feuille ISNUMBER, qui demande si la valeur stockée d'une cellule est déjà de type numérique. Elle n'analyse pas le texte ; IsNumber("123") sur une cellule au format texte vaut False alors même qu'IsNumeric("123") vaut True.
  • IsDate(x) — le filtre frère pour les dates. IsNumeric("2026-01-01") vaut False ; utilisez IsDate pour tout ce qui doit être une date, et notez qu'il dépend tout autant des paramètres régionaux qu'IsNumeric.

Utilisez IsNumber quand vous interrogez une valeur déjà présente dans une cellule ; utilisez IsNumeric quand vous assainissez du texte avant de le convertir.

L'avis : IsNumeric est un filtre bon marché, pas un validateur

IsNumeric gagne sa place comme rejet rapide des déchets évidents — une cellule vide, un nom, un symbole égaré. Laissez-le les jeter à bas coût. Mais le jour où votre règle est plus serrée que « pourrait être un nombre » — un code postal à cinq chiffres, une quantité positive, un code de commande sans lettres — IsNumeric cesse d'être un atout et devient un faux sentiment de sécurité, car il donne le feu vert à la notation scientifique, à l'hexadécimal, aux chaînes entourées d'espaces et aux séparateurs propres à une région que vous n'avez jamais voulu accepter.

Le correctif, c'est de dire la forme à voix haute. Pour « exactement trois chiffres », s Like "###". Pour « des chiffres seuls, quelle que soit la longueur », Len(s) > 0 And Not (s Like "*[!0-9]*"). Pour tout ce qui a une structure — un groupe à extraire, un motif qui se répète — vous avez grimpé au sommet de l'échelle et il vous faut un vrai motif. Et quoi que vous décidiez de laisser passer, convertissez-le aussitôt sous la même hypothèse régionale que celle testée, pour que « valide » et « converti » ne puissent jamais diverger.

Quand la validation est tout le travail — décrivez-la plutôt

La moitié du temps, la vraie tâche n'est pas « est-ce numérique » mais « nettoie cette colonne : retire les codes qui ressemblent à des nombres, signale ceux qui ont le mauvais nombre de chiffres, force le reste, et dis-moi quelles lignes tu as touchées ». Le temps d'avoir enchaîné IsNumeric, un contrôle de forme Like, une conversion consciente des paramètres régionaux et un journal des exceptions, la plomberie écrase la réponse. ExcelMaster vous laisse énoncer ce but en langage courant — « valide la colonne C comme des quantités entières positives, liste chaque ligne qui échoue et pourquoi » — et génère du Python qui lit les données, applique la vraie règle, sauvegarde d'abord votre fichier, et vous rend les exceptions. Vous décrivez le contrôle ; il gère la notation scientifique, les espaces et les paramètres régionaux.

Foire aux questions

Que fait IsNumeric en VBA ?

IsNumeric(expression) renvoie un Boolean : True si VBA pourrait convertir l'expression en nombre, et False sinon. Il est généreux — il accepte la notation scientifique, les littéraux hexadécimaux (&H) et octaux (&O), les séparateurs de milliers, les espaces environnants et les signes de tête ou de fin — si bien qu'il signifie « analysable comme un nombre », pas « un entier propre ».

Pourquoi IsNumeric renvoie-t-il True pour une valeur qui n'est pas un nombre ?

Parce que la valeur en est une que l'analyseur de VBA reconnaît. "1E5" est de la notation scientifique, "&HFF" un littéral hexadécimal, "1,000" utilise un séparateur de milliers, et "12-" porte un signe final — autant de formes numériques valides pour VBA. S'il vous faut une définition plus stricte, testez la forme avec Like (par exemple s Like "###" pour exactement trois chiffres) plutôt qu'IsNumeric.

Comment vérifier qu'une chaîne ne contient que des chiffres en VBA ?

Utilisez un motif Like plutôt qu'IsNumeric. Len(s) > 0 And Not (s Like "*[!0-9]*") ne vaut True que lorsque s est non vide et ne contient aucun caractère non chiffre — un vrai test « chiffres seuls » qui, contrairement à IsNumeric, rejette "1E5", "1,000" et "12-".

Quelle est la différence entre IsNumeric et IsNumber en VBA ?

IsNumeric est une fonction VBA qui teste si une chaîne pourrait être analysée comme un nombre. WorksheetFunction.IsNumber (la fonction de feuille ISNUMBER) teste si la valeur d'une cellule est déjà stockée en type numérique. Une cellule texte contenant 123 donne IsNumeric = True mais IsNumber = False.

IsNumeric est-il affecté par les paramètres régionaux ?

Oui. IsNumeric utilise les séparateurs décimal et de regroupement de la machine, si bien que "1,5" est numérique sur une machine où la virgule est la décimale et ne l'est pas sur une où c'est le point. Pour des résultats portables, convertissez avec une règle explicite (Val utilise toujours . comme décimale ; CDbl respecte les paramètres régionaux courants) au lieu de compter sur IsNumeric pour se comporter à l'identique partout.

Testé dans

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

Guides associés : VBA Like · VBA Regex · VBA CStr · VBA InStr · VBA Split