Vous avez une valeur saisie par l'utilisateur (ou importée) et vous devez la convertir en nombre en VBA ? Très bien. Mais entre CInt, CLng, CDbl, CSng et Val, on s'y perd vite… Voici mon mémo pratique, avec exemples concrets et les pièges à éviter.
Avant tout : vérifier que la valeur est bien numérique
Première étape, toute simple : testez la valeur avec IsNumeric. Ça évite l'erreur "Type mismatch" au moment de la conversion.
1 2 3 4 5 6 7 8 |
Dim txt As Variant txt = InputBox("Valeur à convertir ?") If Not IsNumeric(txt) Or Len(Trim$(txt & "")) = 0 Then MsgBox "Valeur non numérique.", vbExclamation Exit Sub End If ' ensuite : conversion… |
Les fonctions de conversion en VBA (et quand les utiliser)
- CInt → Integer (entier court, de -32 768 à 32 767). Arrondit à l'entier le plus proche.
- CLng → Long (entier long). Arrondit aussi.
- CDbl → Double (virgule flottante double précision). Conserve les décimales.
- CSng → Single (moins de précision que Double).
- Val → lit le nombre au début de la chaîne, ignore le reste (s’arrête au premier caractère "non numérique").
Rappel important : CInt et CLng arrondissent (0,5 → 1). Si vous voulez simplement "couper" les décimales, regardez Fix (tronque vers 0) ou Int (plancher).
Exemples rapides (à copier-coller)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub ConversionsRapides() Dim s As String s = "123,45" ' selon les paramètres régionaux, la virgule est le séparateur décimal ' Entier : arrondi Dim nInt As Integer: nInt = CInt(s) ' 123 ou 123 ? => 123 (arrondi) ' Entier long : arrondi Dim nLng As Long: nLng = CLng(s) ' 123 ' Décimal double précision : conserve les décimales Dim nDbl As Double: nDbl = CDbl(s) ' 123,45 ' Single (moins précis que Double) Dim nSng As Single: nSng = CSng(s) ' Val : lit au début et s'arrête au 1er caractère non numérique Dim v As Double v = Val(" 00123.45EUR") ' → 123.45 (point comme séparateur « invariant ») v = Val("125,50 €") ' → 125 (la virgule arrête la lecture) End Sub |
Paramètres régionaux : virgule, point & co.
Sur un Excel FR, CDbl comprendra naturellement "1 234,56"
. Val, lui, est plus "brut" : il s'attend plutôt à un .
comme séparateur décimal, et s'arrête à la ,
. C’est pour ça que l'on voit souvent :
1 2 3 4 5 6 |
Dim txt As String Dim n As Double txt = "1,234" ' entrée utilisateur If InStr(txt, ",") > 0 Then txt = Replace(txt, ",", ".") n = Val(txt) ' lecture « invariante » |
Mon conseil : si vous travaillez avec une version locale (Excel FR) et que vos données viennent d'un formulaire Excel, utilisez CDbl après IsNumeric. Si les données viennent de sources mixtes (CSV, Web, copier/coller), normalisez la chaîne puis convertissez la.
Dépassements et erreurs : les vrais cas qui fâchent
- Overflow : CInt/CLng renvoient une erreur si la valeur dépasse le type. Passez en Double (CDbl) si vous n’êtes pas sûr.
- Chaîne vide : traitez
""
à part (voir le test plus haut). - Espaces, symboles : CDbl ne pardonne pas "1 234 €" (donc résultat = FAUX). Val lira "1234" (et s'arrêtera donc à la virgule).
Exemple de code : conversion « sûre »
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Function ToDoubleSafe(ByVal txt As Variant, Optional ByRef ok As Boolean) As Double ok = False If Len(Trim$(txt & "")) = 0 Then Exit Function ' D’abord un contrôle simple If IsNumeric(txt) Then ToDoubleSafe = CDbl(txt) ok = True Exit Function End If ' Sinon : tentative de normalisation rapide pour les données « mixtes » Dim s As String: s = CStr(txt) s = Trim$(s) s = Replace(s, " ", "") ' retirer espaces insécables éventuels s = Replace(s, ",", ".") ' forcer le point comme séparateur If Len(s) > 0 Then ToDoubleSafe = Val(s) ok = (InStr(1, s, ".") > 0 Or IsNumeric(ToDoubleSafe)) End If End Function |
Fix, Int : couper au lieu d'arrondir
1 2 3 4 5 6 7 |
Sub TronquerVsArrondir() Debug.Print CInt(1.5) ' 2 (arrondi) Debug.Print CLng(1.5) ' 2 Debug.Print Fix(1.5) ' 1 (tronqué) Debug.Print Int(1.5) ' 1 (plancher) Debug.Print Int(-1.5) ' -2 (plancher vers le bas) End Sub |
Pour aller plus loin en VBA
Avant de se quitter, voici quelques articles qui pourraient encore vous être utiles:
- VBA : vérifier si une valeur est numérique (IsNumeric)
- Fonction RECHERCHEV en VBA – OUI, c'est possible!
- SOMME en VBA – aperçu des différentes méthodes
- Bibliothèque des codes sources VBA en français – dizaines de codes prêts à l'emploi
- D'autres informations sur la conversion des types de données sur le site de Microsoft