HOWTO · VBA
Convertir une chaîne en nombre dans VBA
Ce didacticiel montre comment convertir une chaîne en nombre dans VBA.
Sur cette page
Pour convertir dans VBA un texte contenant un nombre, transmettez-le à la fonction de conversion correspondant au type numérique dont vous avez besoin. Utilisez CInt pour un Integer de 16 bits, CLng pour un Long de 32 bits, ou une fonction comme CDbl, CCur et CDec si vous avez besoin d’une autre plage ou précision. Les exemples ci-dessous présentent les appels VBA et les résultats fournis dans les boîtes de dialogue Excel ; le code VBA est illustratif et n’est pas exécuté par l’environnement d’exécution de cette page.
Convertir une chaîne en nombre dans VBA
VBA propose des fonctions de conversion distinctes, car un entier, une valeur à virgule flottante et un montant à virgule fixe ont des plages et des précisions différentes. Les fonctions présentées ici sont CByte, CInt, CLng, CSng, CDbl, CCur et CDec. Chacune accepte une valeur que VBA peut interpréter comme numérique et renvoie le type numérique correspondant, à l’exception de CDec, qui renvoie un Variant dont le sous-type est Decimal.
Choisissez le type de résultat en fonction des données et de l’opération suivante. Une conversion en entier arrondit la partie fractionnaire ; elle ne se contente pas de supprimer les décimales. Pour des calculs financiers exacts avec quatre chiffres après la virgule, Currency convient souvent. Pour une plage et une échelle décimales plus larges, utilisez le sous-type Decimal au moyen d’un Variant.
Choisir la fonction de conversion VBA adaptée
| Fonction | Résultat | À utiliser lorsque |
|---|---|---|
CByte |
Byte, de 0 à 255 | La valeur est un petit entier positif ou nul. |
CInt |
Integer, de −32 768 à 32 767 | Une valeur entière signée sur 16 bits suffit. |
CLng |
Long, de −2 147 483 648 à 2 147 483 647 | Vous avez besoin d’une plage entière signée plus large. |
CSng |
Single | Une valeur approximative à virgule flottante, de précision moindre, suffit. |
CDbl |
Double | Vous avez besoin de la plage et de la précision plus larges du type à virgule flottante double précision. |
CCur |
Currency | Vous avez besoin d’une arithmétique à virgule fixe avec quatre décimales, souvent pour des montants. |
CDec |
Sous-type Decimal de Variant | Vous avez besoin d’une arithmétique décimale avec une échelle supérieure à celle de Currency. |
Integer et Long sont deux types de nombres entiers. Dans VBA, Integer couvre une plage sur 16 bits, tandis que Long utilise 32 bits. Choisissez donc Long si la valeur possible peut dépasser la plage de Integer. Une variable déclarée As Long est un Long ; pour conserver le sous-type Decimal, une variable à laquelle vous affectez le résultat de CDec doit être un Variant.
Convertir des chaînes en types entiers
Utilisez CByte, CInt ou CLng lorsque le résultat doit être un entier. Les procédures complètes ci-dessous déclarent chacune une chaîne, la convertissent et affichent le résultat. Collez une procédure dans un module VBA standard, puis exécutez-la dans Excel. Ces procédures VBA ne sont pas exécutées par l’environnement d’exécution de cette page ; les images fournies montrent les résultats correspondants, également indiqués ci-dessous sous forme de texte sélectionnable.
Pour obtenir un résultat de type Byte, collez cette procédure complète dans un module VBA standard et exécutez-la :
Sub ShowByte()
Dim inputText As String
inputText = "12"
MsgBox CByte(inputText)
End Sub
La boîte de dialogue affiche 12.
La boîte de dialogue affiche 12, résultat de CByte("12").
Pour obtenir un entier signé, collez et exécutez cette procédure complète :
Sub ShowInteger()
Dim inputText As String
inputText = "12.5"
MsgBox CInt(inputText)
End Sub
La boîte de dialogue affiche 12. Il s’agit d’un arrondi au pair le plus proche : lorsque la partie fractionnaire est exactement à mi-chemin, le résultat est l’entier pair. Cette même règle explique pourquoi CInt("13.5") donne 14. Les valeurs Integer doivent rester comprises entre −32 768 et 32 767 ; CInt provoque un dépassement de capacité en dehors de cette plage.
La boîte de dialogue affiche 12 pour CInt("12.5") ; cette valeur à mi-chemin est arrondie à l’entier pair le plus proche.
Choisissez CLng pour une plage entière plus large. Collez et exécutez cette procédure complète :
Sub ShowLong()
Dim inputText As String
inputText = "15.7"
MsgBox CLng(inputText)
End Sub
La boîte de dialogue affiche 16, car la partie fractionnaire est arrondie à l’entier le plus proche. La plage prise en charge va de −2 147 483 648 à 2 147 483 647.
La boîte de dialogue affiche 16, résultat de CLng("15.7").
Convertir des chaînes en nombres à virgule flottante
CSng convertit en précision Single, tandis que CDbl convertit en précision Double. Les nombres à virgule flottante couvrent une plage bien plus large que les types entiers, mais de nombreuses fractions décimales sont approximatives en représentation binaire. Pour les calculs impliquant ces fractions, évitez de vous fier à une égalité exacte ; comparez plutôt les résultats calculés à l’aide d’une tolérance.
Collez et exécutez cette procédure complète pour convertir en Single :
Sub ShowSingle()
Dim inputText As String
inputText = "1.3"
MsgBox CSng(inputText)
End Sub
La boîte de dialogue affiche 1.3. Cet affichage décimal ne signifie pas que toutes les opérations internes en virgule flottante sont exactes.
La boîte de dialogue affiche 1.3, résultat de CSng("1.3").
Utilisez CDbl si la précision Single ne suffit pas ou si vos calculs nécessitent la plage plus large de Double. Les deux fonctions renvoient des valeurs approximatives en virgule flottante binaire. Si le comportement des décimales compte davantage que la plage en virgule flottante, choisissez plutôt CCur ou CDec. Pour afficher un résultat Double dans Excel, collez et exécutez cette procédure complète :
Sub ShowDouble()
Dim inputText As String
inputText = "123.45"
MsgBox CDbl(inputText)
End Sub
Le format du nombre affiché peut dépendre des paramètres régionaux.
Convertir des chaînes en Currency et Decimal
CCur renvoie une valeur Currency, un type à virgule fixe comportant quatre chiffres après la virgule. Sa plage va de −922,337,203,685,477.5808 à 922,337,203,685,477.5807. Currency convient ainsi à de nombreux calculs monétaires nécessitant une échelle fixe de quatre décimales. Les valeurs qui exigent plus de quatre décimales sont arrondies à cette échelle. Pour afficher une conversion Currency, collez et exécutez cette procédure complète :
Sub ShowCurrency()
Dim inputText As String
inputText = "12.34"
MsgBox CCur(inputText)
End Sub
CDec renvoie un Variant dont le sous-type est Decimal ; VBA ne propose pas Decimal comme type de variable autonome. Decimal prend en charge jusqu’à 28 décimales et des valeurs allant jusqu’à environ ±7.9228 × 10^28 ; l’échelle disponible dépend de la magnitude. Conservez le résultat dans un Variant si les calculs suivants doivent préserver la précision Decimal. Cette procédure affecte la valeur convertie à un Variant avant de l’afficher :
Sub ShowDecimal()
Dim inputText As String
Dim result As Variant
inputText = "12.3456"
result = CDec(inputText)
MsgBox result
End Sub
Comprendre l’arrondi, les paramètres régionaux et les erreurs de conversion
Les fonctions de conversion VBA interprètent le texte numérique selon les paramètres régionaux de l’ordinateur, notamment les séparateurs décimaux et les séparateurs de milliers. Une chaîne utilisant une virgule comme séparateur décimal sur un système peut ne pas être interprétée comme prévu sur un autre. Si une donnée provient d’un fichier, d’une API ou d’un utilisateur et qu’elle suit un format connu, normalisez ou validez ce format avant la conversion, au lieu de supposer que toutes les machines utilisent les mêmes séparateurs.
L’arrondi au pair le plus proche peut surprendre les lecteurs qui s’attendent à ce que toute valeur à mi-chemin soit arrondie vers le haut. Pour cet exemple, la fonction intégrée round de Python applique la même règle ; il s’agit d’une démonstration du principe d’arrondi, et non de l’exécution de VBA :
Exécutez cette démonstration de l’arrondi en Python :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
print(round(12.5))
12
Une chaîne non numérique provoque une incompatibilité de type, tandis qu’une valeur numérique située hors de la plage du type de destination provoque un dépassement de capacité. Vérifiez les saisies avant la conversion et gérez les erreurs près de l’appel de conversion afin que l’application puisse indiquer quelle valeur doit être corrigée. Un contrôle numérique ne garantit pas à lui seul qu’une valeur tient dans Byte, Integer ou Long ; il faut aussi vérifier la plage avant de l’affecter à un type plus restreint.