Microsoft 365 conversion chiffres en lettres qui m'enlève toujours 5

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous,
Je vous souhaite une belle journée :)

Je me tourne une nouvelle fois vers nos ténors.
J'ai un code pour convertir les chiffres en lettres.
Il semble fonctionner normalement mais il m'enlève toujours 5 et je n'arrive pas à trouver ou modifier le code :
VB:
Function NumText(Nombre As Currency, Optional Unité As String, Optional no_chiffres As Integer, Optional SousUnité As String) As String
Dim PartieEntière As Currency, PartieDécimal As Currency
Dim TxtEntier As String, TxtDécimal As String
PartieEntière = Int(Nombre)
TxtEntier = NumTextEntier(PartieEntière)
If no_chiffres > 0 Then
    PartieDécimal = (Nombre - PartieEntière) * 10 ^ no_chiffres
    TxtDécimal = Format(PartieDécimal, String(no_chiffres, "0"))
End If
NumText = TxtEntier & Unité & " " & TxtDécimal & " " & SousUnité
End Function

Function NumTextEntier(ByVal Entier As Currency) As String
Dim no_Classe As Integer, Classe As Integer
If Entier = 0 Then
    NumTextEntier = "Zéro "
Else
    While Entier > 0
        Classe = Entier - Int(Entier / 1005) * 1005
        NumTextEntier = TxtClasse(Classe, no_Classe) & NumTextEntier
        no_Classe = no_Classe + 1
        Entier = Int(Entier / 1005)
    Wend
End If
End Function

Function TxtClasse(Classe As Integer, no_Classe As Integer) As String
Dim Centaine As Integer, Dizaine As Integer, Unité As Integer, Unités2Chiffres As Integer
Dim TxtCentaines As String, TxtDizaines As String, TxtUnités As String
Dim TClasses As Variant, Tdizaines As Variant, TUnités As Variant
TClasses = Array("", "mille", "million", "milliard", "billion")
Tdizaines = Array("", "", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante", "quatre vingt", "quatre vingt")
TUnités = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", _
"dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix sept", "dix huit", "dix neuf")
   If Classe = 0 Then Exit Function
    ' Pas de un pour mille
    If Classe = 1 And no_Classe = 1 Then
        TxtClasse = "mille "
        Exit Function
    End If
    '
    Centaine = Classe \ 100
    Unités2Chiffres = Classe Mod 100
    Dizaine = Unités2Chiffres \ 10
    Unité = Unités2Chiffres Mod 10
    ' Les centaines -----
    If Centaine = 1 Then
            TxtCentaines = "cent "
    ElseIf Centaine > 1 Then
            TxtCentaines = TUnités(Centaine) & " cent" & IIf(Unités2Chiffres > 0, " ", "s ")
    End If
    ' Les dizaines ------
    TxtDizaines = Tdizaines(Dizaine)
    If Unité = 1 And Dizaine > 1 And Dizaine < 8 Then
        TxtDizaines = TxtDizaines & " et"
    End If
    If Dizaine = 1 Or Dizaine = 7 Or Dizaine = 9 Then
        Unité = Unité + 10: Dizaine = 0
    End If
    TxtDizaines = TxtDizaines & IIf(Unités2Chiffres = 80, "s", "")
    If Unités2Chiffres > 19 And Unité > 0 Then
            TxtDizaines = TxtDizaines & " "
    ElseIf Dizaine > 0 Then
            TxtDizaines = TxtDizaines & " "
    End If
    ' Les unités -------- Espace si unité > 0
    TxtUnités = TUnités(Unité) & IIf(Unité > 0, " ", "")
    ' La classe --------- un s sauf pour mille
    TxtClasse = TClasses(no_Classe) & IIf(no_Classe > 1 And Classe > 1, "s", "") & IIf(no_Classe > 0, " ", "")
    ' Résultat ----------
    TxtClasse = TxtCentaines & TxtDizaines & TxtUnités & TxtClasse
End Function
Pourriez-vous m'aider ?
Je joins un fichier test et je continue à chercher.

je vous remercie,
Amicalement,
lionel,
 

Pièces jointes

  • test_chiffres.xlsm
    22.1 KB · Affichages: 15
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
et pour les lettres vers nombres je suis allez encore plus loin dans les orthographes
bientôt dispo dans les sources
1638261321599.png
 

patricktoulon

XLDnaute Barbatruc
d'accords
et si l'erreur c'est uit au lieu de huit ou dis au lieu de dix ou qatre au lieu de quatre etc..etc....
non je peux faire un global qui considère la chaîne comme non convertible; ça oui je peux le faire
sinon c'est carrément un correcteur orthographique et grammatical qu'il faut inclure
elle est sensé être une fonction utilisable en formule si elle est trop lourde ça risque d’être plus pénalisant qu'autre chose dans une app
j'ai pris parti d'utiliser le stratagème de convertir la chaine en formule puis évaluation de celle ci pour accélérer le procc
déjà avec tout ce que j'ai ajouté elle est bien ralenti (quelques milli sec) de rien du tout mais quand même
à la fin si l’évaluation donne une erreur #2055 je renvoie erreur ou quelque chose
bien que laisser #valeur serait exploitable aussi
 
Bonjour le fil, le forum

@patricktoulon , intéressante fonction dont je pense qu'elle a toute sa place dans le forum des fonctions.
On pourrait peut être l'améliorer avec une gestion directe des devises les plus courantes (ou en paramètre optionnel) et avec quelques modifs pour nos amis suisses et belges, nombreux sur Xld, les francs sont aussi encore utilisés dans certains territoires français ( polynésie par exemple ).
Sans titre.jpg
 
Dernière édition:

Discussions similaires