Tutoriel : Écrire les Nombres en Lettres sur Excel avec VBA
Tutoriel : Écrire les Nombres en Lettres sur Excel avec VBA
Ce tutoriel vous explique comment convertir des nombres en lettres sur Excel en utilisant une fonction VBA personnalisée. Vous apprendrez également comment formater les nombres avec des devises, gérer les centimes, et afficher correctement les résultats.
Étape 1 : Préparer Excel pour le VBA
- Ouvrir l’éditeur VBA :
- Si vous n’avez pas accès à
ALT + F11, procédez ainsi :- Cliquez sur l’onglet Développeur (si l’onglet n’est pas activé, activez-le via
Fichier > Options > Personnaliser le Rubanet cochez Développeur). - Dans le ruban Développeur, cliquez sur Visual Basic.
- Cliquez sur l’onglet Développeur (si l’onglet n’est pas activé, activez-le via
- Si vous n’avez pas accès à
- Créer un nouveau module VBA :
- Dans l’éditeur VBA, cliquez sur
Insertion > Module. - Une nouvelle fenêtre vierge s’ouvrira pour saisir du code.
- Dans l’éditeur VBA, cliquez sur
Étape 2 : Coller le code VBA
Collez le code suivant dans la fenêtre de votre module VBA :
Function ChiffresEnLettres(ByVal Nombre As Double, Optional ByVal Devise As String = "") As String
Dim Unites As Variant, Dizaines As Variant
Dim Entier As Long, Centimes As Long
Dim PartieEntiere As String, PartieCentimes As String
Dim DevisePluriel As String
Unites = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", _
"dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf")
Dizaines = Array("", "", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix")
' Séparer la partie entière et les centimes
Entier = Int(Nombre)
Centimes = Round((Nombre - Entier) * 100)
' Convertir la partie entière
PartieEntiere = ConvertirNombre(Entier, Unites, Dizaines)
If Entier = 1000 Then PartieEntiere = "mille" ' Suppression de "un" pour mille
' Ajouter la devise si spécifiée
If Devise <> "" Then
DevisePluriel = PluraliserDevise(Devise, Entier)
PartieEntiere = PartieEntiere & " " & DevisePluriel
End If
' Convertir les centimes
If Centimes > 0 Then
PartieCentimes = ConvertirNombre(Centimes, Unites, Dizaines)
PartieCentimes = PartieCentimes & " centime"
If Centimes > 1 Then PartieCentimes = PartieCentimes & "s"
End If
' Assembler le résultat
If Centimes > 0 Then
ChiffresEnLettres = PartieEntiere & " et " & PartieCentimes
Else
ChiffresEnLettres = PartieEntiere
End If
End Function
Function ConvertirNombre(ByVal Nombre As Long, Unites As Variant, Dizaines As Variant) As String
Dim Texte As String
If Nombre = 0 Then
ConvertirNombre = "zéro"
Exit Function
End If
If Nombre < 20 Then
Texte = Unites(Nombre)
ElseIf Nombre < 100 Then
Texte = Dizaines(Nombre \ 10)
If Nombre Mod 10 > 0 Then Texte = Texte & "-" & Unites(Nombre Mod 10)
ElseIf Nombre < 1000 Then
If Nombre \ 100 = 1 Then
Texte = "cent"
Else
Texte = Unites(Nombre \ 100) & " cent"
End If
If Nombre Mod 100 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 100, Unites, Dizaines)
ElseIf Nombre < 1000000 Then
If Nombre \ 1000 = 1 Then
Texte = "mille" ' Suppression de "un" pour mille
Else
Texte = ConvertirNombre(Nombre \ 1000, Unites, Dizaines) & " mille"
End If
If Nombre Mod 1000 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 1000, Unites, Dizaines)
ElseIf Nombre < 1000000000 Then
Texte = ConvertirNombre(Nombre \ 1000000, Unites, Dizaines) & " million"
If Nombre \ 1000000 > 1 Then Texte = Texte & "s"
If Nombre Mod 1000000 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 1000000, Unites, Dizaines)
Else
Texte = ConvertirNombre(Nombre \ 1000000000, Unites, Dizaines) & " milliard"
If Nombre \ 1000000000 > 1 Then Texte = Texte & "s"
If Nombre Mod 1000000000 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 1000000000, Unites, Dizaines)
End If
ConvertirNombre = Texte
End Function
Function PluraliserDevise(ByVal Devise As String, ByVal Quantite As Long) As String
Dim Mots() As String
Dim i As Integer
Dim DevisePluriel As String
' Découper la devise en mots
Mots = Split(Devise, " ")
' Ajouter "s" à chaque mot si la quantité est supérieure à 1
For i = LBound(Mots) To UBound(Mots)
If Quantite > 1 Then
If Right(Mots(i), 1) <> "s" Then Mots(i) = Mots(i) & "s"
End If
Next i
' Reconstruire la devise
DevisePluriel = Join(Mots, " ")
PluraliserDevise = DevisePluriel
End FunctionÉtape 3 : Utilisation de la fonction dans Excel
- Dans une cellule, utilisez la formule suivante :
- Pour un montant sans devise :
=ChiffresEnLettres(1234,56)
Résultat :"mille deux cent trente-quatre" - Pour un montant avec devise :
=ChiffresEnLettres(1234,56; "euro")
Résultat :"mille deux cent trente-quatre euros et cinquante six centimes"
- Pour un montant sans devise :
- Format du séparateur :
Si votre Excel utilise une virgule pour séparer les milliers et un point pour les décimales, remplacez les virgules par des points et inversement dans votre saisie.
Pour modifier la fonction afin que les centimes ne soient pas écrits (sauf si une devise est précisée), et pour que la fonction affiche les centimes sous forme de texte (par exemple, « mille virgule cinquante-six ») lorsque vous appelez ChiffresEnLettres(1000,56), il faut ajuster l’assemblage du texte de manière à séparer les centimes avec « virgule » et afficher les centimes en toutes lettres. Voici les modifications nécessaires :
- Séparer la partie entière et les centimes : Nous allons séparer la partie entière et les centimes, puis ajouter « virgule » et les centimes en lettres.
- Conversion des centimes : Les centimes seront convertis en lettres et ajoutés après la virgule.
Voici le code modifié pour obtenir ce comportement :
Function ChiffresEnLettres(ByVal Nombre As Double, Optional ByVal Devise As String = "") As String
Dim Unites As Variant, Dizaines As Variant
Dim Entier As Long, Centimes As Long
Dim PartieEntiere As String, PartieCentimes As String
Dim DevisePluriel As String
Unites = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", _
"dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf")
Dizaines = Array("", "", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix")
' Séparer la partie entière et les centimes
Entier = Int(Nombre)
Centimes = Round((Nombre - Entier) * 100)
' Convertir la partie entière
PartieEntiere = ConvertirNombre(Entier, Unites, Dizaines)
If Entier = 1000 Then PartieEntiere = "mille" ' Suppression de "un" pour mille
' Ajouter la devise si spécifiée
If Devise <> "" Then
DevisePluriel = PluraliserDevise(Devise, Entier)
PartieEntiere = PartieEntiere & " " & DevisePluriel
End If
' Convertir les centimes
If Centimes > 0 Then
PartieCentimes = ConvertirNombre(Centimes, Unites, Dizaines)
PartieCentimes = "virgule " & PartieCentimes
ChiffresEnLettres = PartieEntiere & " " & PartieCentimes
Else
ChiffresEnLettres = PartieEntiere
End If
End Function
Function ConvertirNombre(ByVal Nombre As Long, Unites As Variant, Dizaines As Variant) As String
Dim Texte As String
If Nombre = 0 Then
ConvertirNombre = "zéro"
Exit Function
End If
If Nombre < 20 Then
Texte = Unites(Nombre)
ElseIf Nombre < 100 Then
Texte = Dizaines(Nombre \ 10)
If Nombre Mod 10 > 0 Then Texte = Texte & "-" & Unites(Nombre Mod 10)
ElseIf Nombre < 1000 Then
If Nombre \ 100 = 1 Then
Texte = "cent"
Else
Texte = Unites(Nombre \ 100) & " cent"
End If
If Nombre Mod 100 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 100, Unites, Dizaines)
ElseIf Nombre < 1000000 Then
If Nombre \ 1000 = 1 Then
Texte = "mille" ' Suppression de "un" pour mille
Else
Texte = ConvertirNombre(Nombre \ 1000, Unites, Dizaines) & " mille"
End If
If Nombre Mod 1000 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 1000, Unites, Dizaines)
ElseIf Nombre < 1000000000 Then
Texte = ConvertirNombre(Nombre \ 1000000, Unites, Dizaines) & " million"
If Nombre \ 1000000 > 1 Then Texte = Texte & "s"
If Nombre Mod 1000000 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 1000000, Unites, Dizaines)
Else
Texte = ConvertirNombre(Nombre \ 1000000000, Unites, Dizaines) & " milliard"
If Nombre \ 1000000000 > 1 Then Texte = Texte & "s"
If Nombre Mod 1000000000 > 0 Then Texte = Texte & " " & ConvertirNombre(Nombre Mod 1000000000, Unites, Dizaines)
End If
ConvertirNombre = Texte
End Function
Function PluraliserDevise(ByVal Devise As String, ByVal Quantite As Long) As String
Dim Mots() As String
Dim i As Integer
Dim DevisePluriel As String
' Découper la devise en mots
Mots = Split(Devise, " ")
' Ajouter "s" à chaque mot si la quantité est supérieure à 1
For i = LBound(Mots) To UBound(Mots)
If Quantite > 1 Then
If Right(Mots(i), 1) <> "s" Then Mots(i) = Mots(i) & "s"
End If
Next i
' Reconstruire la devise
DevisePluriel = Join(Mots, " ")
PluraliserDevise = DevisePluriel
End Function
Avec ces étapes, vous pourrez facilement afficher les nombres en lettres avec ou sans devise dans vos feuilles Excel.
