Comment vérifier si une chaîne de caractères représente un nombre en VBA? 2


Si vous avez besoin de vérifier en VBA si une expression (notamment une chaîne de caractères – Stringreprésente un nombre, vous pouvez utiliser la fonction IsNumeric.

Vérification des données en amont: Indispensable!

Utiliser cette vérification est une bonne idée surtout si vous devez travailler avec le résultat d'une saisie manuelle par l'utilisateur (par exemple via les formulaires ou via un InputBox). Elle sert également à vérifier les valeurs avant leur utilisation dans un calcul – cela prévient les blocages de vos macros causés par les types de données incompatibles (par exemple l'utilisation d'un texte dans un calcul mathématique).

Fonction VBA: IsNumeric()

Cette fonction retourne la valeur Vrai ou Faux (True ou False) selon si l'expression peut être interprétée comme un nombre.

L'avantage de cette fonction est que d'éventuels espaces (par ex. "    125 " ) ou des zéros de tête (par ex. "00015") ne sont pas pris en compte. Vous ne devez donc pas nécessairement "nettoyer" vos données au préalable.

L'autre avantage est que cette fonction gère automatiquement les formats régionaux. Un chiffre "européen" ("10,15" ou "1.499,99") sera reconnu tout comme un chiffre "anglo-saxon" ("10.15" ou "1,499.99").

Attention, une expression vide (expression = "") ne sera pas considérée comme nombre et va retourner la valeur False.

 Exemples de résultats pour différentes expressions

  • "123" => x = IsNumeric("123") => x = True
  • "-123" => x = IsNumeric("-123") => x = True
  • "- 123" => x = IsNumeric("- 123") => x = True
  • "1 2" => x = IsNumeric("1 2") => x = False
  • "   123 " => x = IsNumeric(" 123 ") => x = True
  • "00015" => x = IsNumeric("00015") => x = True
  • "1,99" => x = IsNumeric("1,99") => x = True
  • "1.99" => x = IsNumeric("1.99") => x = True
  • "1.000,99" => x = IsNumeric("1.000,99") => x = True
  • "1,000,99" => x = IsNumeric("1,000,99") => x = False
  • "1,000.99" => x = IsNumeric("1,000.99") => x = True
  • "A19" => x = IsNumeric("A19") => x = False
  • "" => x = IsNumeric("") => x = False

 

Code VBA: utilisation de la fonction IsNumeric

Sub VerifierNombres()
' par Excel-Malin.com - https://excel-malin.com

On Error GoTo Erreur
Dim MonNombre As Variant

'choisir l'expression à tester
MonNombre = "123.45"
'MonNombre = "007"
'MonNombre = "1A45"

'procéder au test et indiquer des actions à effectuer
If IsNumeric(MonNombre) = True Then
    'votre code si expression est numérique
        MsgBox "L'expression est un nombre"
Else
    'votre code si expression n'est pas numérique
        MsgBox "L'expression n'est pas un nombre"
End If

Exit Sub
Erreur:
MsgBox "Une erreur s'est produite..."
End Sub

 

REMARQUE IMPORTANTE:

Cette fonction IsNumeric (en VBA) ne doit pas être confondue avec la fonction Excel =ESTNUM() (utilisée dans les Feuilles)  – par ex. =ESTNUM(B12) –  car celle-ci se comporte différemment. Notamment elle tient compte des paramètres régionaux.

Pour illustration, dans un Excel installé en français, pour l'expression "1000.9", la fonction VBA IsNumeric retournera Vrai, tandis que la fonction =ESTNUM() sur une feuille retournera Faux !

Astuce pour aller plus loin en VBA

Excel-Malin.com met à votre disposition la liste complète des fonctions VBA

 

6 0


Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

2 commentaires sur “Comment vérifier si une chaîne de caractères représente un nombre en VBA?

  • Jean-Marie BRODIER

    "1 2" => x = IsNumeric("1 2") => x = False
    Pas chez moi.
    J'ai office 2010 et c'est mon problème car Isnumeric considère que c'est un nombre (il ignore les espaces) !
    Même avec "1 20 30", VBA interprête comme un nombre et il convertit en 12030 quand on le met dans un Integer

    • excel-malin.com Auteur du billet

      Bonjour Jean-Marie,
      en effet c'est très étonnant! Je viens de ré-vérifier chez moi et peu importe la version de l'Office (2010, 2013, 2016), je n'ai pas ce comportement.

      Sur Internet, j'ai trouvé plusieurs commentaires disant qu'en effet, cette fonction n'est pas toujours fiable.
      Il faudrait alors songer à une solution de secours mais cela dépend de vos besoins. Si ce sont seulement les "espaces" qui vous posent problème, vous pourriez essayer quelque chose comme:

      x = IsNumeric(Replace("1 20 30", " ", "x"))

      Ainsi, cela ne change pas le fonctionnement de la procèdure et cela donnera le résultat correct…

      J'espère que cela vous aide.
      Bien à vous, Martin