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

  1. 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 Ruban et cochez Développeur).
      • Dans le ruban Développeur, cliquez sur Visual Basic.
  2. 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.

É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

  1. 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"
  2. 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 :

  1. 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.
  2. 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.

Publications similaires