TL;DR —
IsNumeric(value)renvoieTruequand 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épondTrueà"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
IsNumbercontreIsDate, 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 feuilleISNUMBER, 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 vautFalsealors même qu'IsNumeric("123")vautTrue.IsDate(x)— le filtre frère pour les dates.IsNumeric("2026-01-01")vautFalse; utilisezIsDatepour 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
