Cdbl vba : convertir une valeur en nombre décimal dans Excel
En VBA, les données ne sont pas toujours du type attendu. Une valeur récupérée depuis une cellule, une boîte de dialogue ou un fichier CSV peut être interprétée comme du texte, même lorsqu’elle ressemble parfaitement à un nombre. C’est précisément dans ce genre de situation que la fonction CDbl devient utile.
La fonction CDbl, abréviation de Convert to Double, permet de convertir une valeur en nombre décimal de type Double. Elle est pratique pour effectuer des calculs fiables, éviter certaines erreurs de typage et contrôler la manière dont VBA manipule les données numériques.
Dans ce guide, nous allons voir comment utiliser CDbl, dans quels cas l’employer, quelles erreurs éviter et comment l’intégrer dans des macros Excel concrètes.
À quoi sert la fonction CDbl en VBA ?
CDbl convertit une expression en nombre à virgule flottante de type Double. Ce type peut stocker des nombres très grands ou très petits, avec une précision adaptée à la plupart des calculs courants dans Excel.
La syntaxe est simple :
CDbl(expression)
L’argument expression peut être une variable, une cellule, le résultat d’une fonction ou une valeur écrite directement dans le code.
Par exemple :
Dim prix As Doubleprix = CDbl("19,95")MsgBox prix
Dans cet exemple, la chaîne de caractères "19,95" est convertie en valeur numérique. La variable prix peut ensuite être utilisée dans une addition, une multiplication ou tout autre calcul.
Sans conversion explicite, VBA peut parfois effectuer une conversion automatique. Mais compter sur cette conversion implicite n’est pas toujours une bonne idée. Elle dépend du contexte, du contenu de la cellule et des paramètres régionaux de Windows. En clair : mieux vaut dire clairement à VBA ce que l’on attend.
Le type Double en quelques mots
Le type Double est un type numérique à virgule flottante. Il est particulièrement adapté aux valeurs décimales et aux calculs qui nécessitent plus de précision qu’un simple entier.
Voici quelques types numériques courants en VBA :
- Integer : entier compris entre -32 768 et 32 767 ;
- Long : entier beaucoup plus grand, généralement privilégié à la place de Integer ;
- Single : nombre décimal avec une précision limitée ;
- Double : nombre décimal avec une meilleure capacité et une meilleure précision ;
- Currency : type adapté aux montants financiers, avec une précision fixe.
Pour une valeur comme un prix, un taux ou une mesure comportant des décimales, Double fonctionne très bien dans la majorité des macros. Pour des calculs financiers qui doivent éviter les effets de l’arrondi binaire, le type Currency peut toutefois être plus approprié.
Convertir le contenu d’une cellule avec CDbl
Le cas le plus fréquent consiste à récupérer une valeur depuis une cellule Excel et à la convertir avant de l’utiliser.
Sub ConvertirCellule() Dim montant As Double montant = CDbl(Range("A1").Value) MsgBox "Le montant est : " & montantEnd Sub
Si la cellule A1 contient 125,50, VBA stockera cette valeur dans la variable montant sous la forme d’un nombre Double.
Une version plus robuste consiste à qualifier la feuille concernée. Cela évite qu’une autre feuille active ne soit utilisée par erreur :
Sub ConvertirCelluleAvecFeuille() Dim montant As Double montant = CDbl(ThisWorkbook.Worksheets("Ventes").Range("A1").Value) MsgBox montantEnd Sub
Cette écriture est particulièrement utile dans les macros qui manipulent plusieurs feuilles. La macro ne dépend plus de la feuille affichée au moment de son exécution.
Convertir une valeur texte en nombre décimal
CDbl peut convertir une chaîne de caractères qui représente un nombre valide.
Sub ConvertirTexte() Dim texte As String Dim resultat As Double texte = "42,75" resultat = CDbl(texte) MsgBox resultatEnd Sub
Attention toutefois au séparateur décimal. Sur un ordinateur configuré en français, la virgule est généralement utilisée comme séparateur décimal. Dans d’autres configurations, c’est le point.
Cette différence peut provoquer une erreur avec une valeur comme "42.75" si VBA attend une virgule. Pour traiter des données provenant d’un fichier externe, il peut être nécessaire de remplacer explicitement le séparateur.
Sub GererSeparateurDecimal() Dim texte As String Dim resultat As Double texte = "42.75" texte = Replace(texte, ".", Application.International(xlDecimalSeparator)) resultat = CDbl(texte) MsgBox resultatEnd Sub
La fonction Application.International(xlDecimalSeparator) renvoie le séparateur décimal utilisé par Excel. Cette approche rend le code plus adaptable lorsque le fichier circule entre plusieurs ordinateurs.
Utiliser CDbl avec une boîte de dialogue
Les valeurs saisies avec InputBox sont renvoyées sous forme de texte. Même si l’utilisateur tape un nombre, VBA reçoit d’abord une chaîne de caractères.
Sub DemanderMontant() Dim saisie As String Dim montant As Double saisie = InputBox("Saisissez un montant :") montant = CDbl(saisie) MsgBox "Montant saisi : " & montantEnd Sub
Cette macro fonctionne si l’utilisateur saisit un nombre valide. En revanche, que se passe-t-il s’il clique sur Annuler ou entre le mot « bonjour » ? VBA générera une erreur d’exécution.
Avant d’utiliser CDbl, il est donc préférable de vérifier la saisie avec IsNumeric.
Sub DemanderMontantAvecControle() Dim saisie As String Dim montant As Double saisie = InputBox("Saisissez un montant :") If saisie = "" Then MsgBox "Aucune valeur n'a été saisie." Exit Sub End If If Not IsNumeric(saisie) Then MsgBox "Veuillez saisir un nombre valide." Exit Sub End If montant = CDbl(saisie) MsgBox "Montant saisi : " & montantEnd Sub
Cette vérification simple évite de laisser VBA interrompre la macro avec un message peu parlant pour l’utilisateur.
CDbl et les cellules vides
Une cellule vide mérite une attention particulière. Selon le contexte, une cellule vide peut être interprétée comme une chaîne vide, une valeur nulle ou une donnée non exploitable. Appliquer directement CDbl à une cellule vide peut donc produire un résultat inattendu ou une erreur.
Avant la conversion, testez le contenu de la cellule :
Sub ConvertirCelluleVide() Dim valeur As Double Dim cellule As Range Set cellule = ThisWorkbook.Worksheets("Feuil1").Range("A1") If IsEmpty(cellule.Value) Or cellule.Value = "" Then MsgBox "La cellule est vide." Exit Sub End If If Not IsNumeric(cellule.Value) Then MsgBox "La cellule ne contient pas un nombre." Exit Sub End If valeur = CDbl(cellule.Value) MsgBox valeurEnd Sub
Cette structure est plus longue qu’une conversion directe, mais elle protège votre macro contre les données incomplètes. Dans un fichier rempli manuellement par plusieurs personnes, ce contrôle peut vous éviter quelques heures de recherche après l’apparition d’une erreur.
Gérer les valeurs Null et les erreurs
La valeur Null ne correspond ni à zéro ni à une chaîne vide. Elle signifie généralement qu’aucune donnée exploitable n’est disponible. Une conversion directe avec CDbl peut provoquer une erreur.
Si votre variable est de type Variant, utilisez IsNull avant la conversion :
Sub GererNull() Dim valeurSource As Variant Dim valeurConvertie As Double valeurSource = Null If IsNull(valeurSource) Then MsgBox "La valeur est Null." Exit Sub End If valeurConvertie = CDbl(valeurSource)End Sub
Il est aussi possible d’utiliser une gestion d’erreur pour sécuriser une conversion provenant d’une source incertaine :
Function ConvertirEnDouble(ByVal valeur As Variant) As Variant On Error GoTo GestionErreur If IsNull(valeur) Or IsEmpty(valeur) Then ConvertirEnDouble = CVErr(xlErrValue) Exit Function End If ConvertirEnDouble = CDbl(valeur) Exit FunctionGestionErreur: ConvertirEnDouble = CVErr(xlErrValue)End Function
Cette fonction renvoie une erreur Excel plutôt que d’interrompre brutalement la macro. Elle peut ensuite être utilisée lors d’un traitement de données plus important.
Différence entre CDbl, CInt, CLng et CCur
VBA propose plusieurs fonctions de conversion. Elles ne produisent pas toutes le même résultat.
CDblconvertit vers le type Double ;CIntconvertit vers un entier de type Integer ;CLngconvertit vers un entier de type Long ;CSngconvertit vers un nombre Single ;CCurconvertit vers le type Currency ;CDecconvertit vers un type Decimal stocké dans un Variant.
La différence est importante lorsqu’une valeur comporte des décimales. Par exemple :
Sub ComparerConversions() Dim valeur As String valeur = "12,75" Debug.Print CDbl(valeur) Debug.Print CInt(valeur) Debug.Print CLng(valeur)End Sub
Les fonctions de conversion vers un entier appliquent un arrondi selon les règles de VBA. Elles ne servent donc pas simplement à « supprimer les chiffres après la virgule ». Si vous souhaitez tronquer une valeur, utilisez plutôt une fonction adaptée comme Int ou Fix, selon le résultat attendu.
Pour un montant financier, CCur peut être un meilleur choix :
Dim montant As Currencymontant = CCur("125,50")
Pour des mesures, des pourcentages ou des calculs scientifiques, CDbl est généralement plus souple.
Calculer avec une valeur convertie
L’intérêt de CDbl ne se limite pas au stockage d’une valeur. La conversion devient particulièrement utile avant un calcul.
Sub CalculerTotal() Dim prixUnitaire As Double Dim quantite As Double Dim total As Double prixUnitaire = CDbl(Range("B2").Value) quantite = CDbl(Range("C2").Value) total = prixUnitaire * quantite Range("D2").Value = totalEnd Sub
Dans cet exemple, le prix unitaire et la quantité sont convertis avant la multiplication. Si l’une des cellules contient un texte non numérique, la macro s’arrêtera. Pour un traitement de plusieurs lignes, ajoutez des contrôles et prévoyez un message indiquant la ligne concernée.
Sub CalculerPlusieursLignes() Dim ligne As Long Dim prix As Double Dim quantite As Double For ligne = 2 To 20 If IsNumeric(Cells(ligne, 2).Value) _ And IsNumeric(Cells(ligne, 3).Value) Then prix = CDbl(Cells(ligne, 2).Value) quantite = CDbl(Cells(ligne, 3).Value) Cells(ligne, 4).Value = prix * quantite Else Cells(ligne, 4).Value = "Donnée invalide" End If Next ligneEnd Sub
La conversion est ici réalisée uniquement lorsque les deux cellules contiennent des valeurs numériques. Une petite vérification, mais une grande différence pour la stabilité de la macro.
Les erreurs fréquentes avec CDbl
Voici les problèmes que l’on rencontre le plus souvent :
- convertir une cellule vide sans la contrôler ;
- convertir une chaîne contenant du texte, une devise ou des espaces inattendus ;
- utiliser un point comme séparateur décimal sur un système configuré avec une virgule ;
- oublier que
InputBoxrenvoie du texte ; - confondre une valeur
Nullavec zéro ; - employer CDbl alors qu’un type Currency serait plus adapté à un calcul financier.
Une valeur comme "125 €" n’est pas toujours directement convertible avec CDbl. Il faut d’abord retirer le symbole monétaire et éventuellement les séparateurs de milliers.
Sub NettoyerMontant() Dim texte As String Dim montant As Double texte = "1 250,75 €" texte = Replace(texte, "€", "") texte = Replace(texte, " ", "") texte = Trim(texte) If IsNumeric(texte) Then montant = CDbl(texte) MsgBox montant Else MsgBox "Le montant n'est pas valide." End IfEnd Sub
La méthode exacte dépend du format de vos données. Les fichiers exportés par un logiciel de gestion peuvent utiliser des espaces insécables, des points pour les milliers ou des virgules décimales. Avant toute conversion, observez donc le contenu réel des cellules : l’apparence affichée par Excel peut être différente de la valeur stockée.
Bonnes pratiques pour utiliser CDbl
Pour écrire des macros plus fiables, quelques habitudes sont particulièrement utiles :
- déclarer explicitement les variables avec
Dim; - utiliser
Option Expliciten haut des modules ; - vérifier une valeur avec
IsNumericavant CDbl ; - tester les cellules vides et les valeurs Null ;
- tenir compte du séparateur décimal régional ;
- qualifier les feuilles et les classeurs dans les références de cellules ;
- choisir Currency pour les montants qui exigent une précision fixe ;
- prévoir une gestion d’erreur lorsqu’une donnée provient d’un fichier externe.
La conversion explicite rend également le code plus facile à comprendre. En lisant total = CDbl(cellule.Value), on sait immédiatement que la macro attend une valeur numérique décimale. Le code devient plus prévisible, et les futurs ajustements sont plus simples.
Un exemple complet et sécurisé
Voici un exemple qui lit un montant dans la cellule A2, vérifie son contenu, le convertit avec CDbl et affiche le résultat.
Option ExplicitSub ConvertirMontantSecurise() Dim source As Variant Dim montant As Double source = ThisWorkbook.Worksheets("Feuil1").Range("A2").Value If IsEmpty(source) Or source = "" Then MsgBox "La cellule A2 est vide.", vbExclamation Exit Sub End If If IsNull(source) Then MsgBox "La cellule A2 contient une valeur Null.", vbExclamation Exit Sub End If If Not IsNumeric(source) Then MsgBox "La cellule A2 ne contient pas un nombre valide.", vbExclamation Exit Sub End If On Error GoTo ErreurConversion montant = CDbl(source) MsgBox "Valeur convertie : " & Format(montant, "0.00"), vbInformation Exit SubErreurConversion: MsgBox "La conversion en nombre décimal a échoué.", vbCriticalEnd Sub
Ce modèle peut servir de base pour importer des données, calculer des totaux ou contrôler des saisies dans un formulaire VBA. Vous pourrez ensuite remplacer la cellule A2 par une plage, une variable ou une valeur issue d’un fichier texte.
CDbl est donc une fonction simple, mais très pratique dès qu’une macro doit travailler avec des nombres décimaux. En contrôlant la donnée avant la conversion et en tenant compte des paramètres régionaux, vous évitez la plupart des erreurs classiques. VBA aime les instructions claires : donnez-lui une valeur propre, le bon type et un peu de méthode, et vos calculs gagneront immédiatement en fiabilité.