Problème de mise en lettres des chiffres monétaires

Bonjour à tous,

Je vous joint une copie de la formule qui me permet de transformer les chiffres monétaires en lettres. Celle-ci était en chiffres avec "dollars" et chiffre en anglais et je l'ai transformée. Mais je Remarque une anomalie dans la transformation le chiffre "un" vient se mettre avant les centaines et je ne trouve pas le problem

Merci d'avance.

Patoche0495

15option-explicit.zip (12.59 Ko)

Bonjour,

Ta fonction n'est vraiment pas aboutie. En voici une qui n'est pas de moi (je ne sais plus qui l'a faite et je le remercie au passage) mais qui retourne un résultat plus conforme :

Public Function NOMBRE_EN_LETTRES(Nb, Devise As String) As String

    Dim varnum, varnumD, varnumU, resultat, varlet

    Static Chiffre(1 To 19)
        Chiffre(1) = "un"
        Chiffre(2) = "deux"
        Chiffre(3) = "trois"
        Chiffre(4) = "quatre"
        Chiffre(5) = "cinq"
        Chiffre(6) = "six"
        Chiffre(7) = "sept"
        Chiffre(8) = "huit"
        Chiffre(9) = "neuf"
        Chiffre(10) = "dix"
        Chiffre(11) = "onze"
        Chiffre(12) = "douze"
        Chiffre(13) = "treize"
        Chiffre(14) = "quatorze"
        Chiffre(15) = "quinze"
        Chiffre(16) = "seize"
        Chiffre(17) = "dix-sept"
        Chiffre(18) = "dix-huit"
        Chiffre(19) = "dix-neuf"
    Static dizaine(1 To 8)
        dizaine(1) = "dix"
        dizaine(2) = "vingt"
        dizaine(3) = "trente"
        dizaine(4) = "quarante"
        dizaine(5) = "cinquante"
        dizaine(6) = "soixante"
        dizaine(8) = "quatre-vingt"

    'traitement du cas 0
    If Nb >= 1 Then
        resultat = ""
    Else
        resultat = "zéro"
        GoTo fintraitementfrancs
    End If

    'traitement des millions
    varnum = Int(Nb / 1000000)
    If varnum > 0 Then
        GoSub centaine_dizaine
        resultat = varlet + " million"
        If varlet <> "un" Then: resultat = resultat + "s"
    End If

    'traitement des milliers
    varnum = Int(Nb) Mod 1000000
    varnum = Int(varnum / 1000)
    If varnum > 0 Then
        GoSub centaine_dizaine
        If varlet <> "un" Then: resultat = resultat + " " + varlet
        resultat = resultat + " mille"
    End If

    'traitement des centaines et dizaines
    varnum = Int(Nb) Mod 1000
    If varnum > 0 Then
        GoSub centaine_dizaine
        resultat = resultat + " " + varlet
    End If
    resultat = LTrim(resultat)
    varlet = Right$(resultat, 4)

    'traitement du "s" final pour vingt et cent et du "de" pour million
    Select Case varlet
        Case "cent", "ingt"
            resultat = resultat + "s"
        Case "lion", "ions"
            resultat = resultat + " de"
    End Select

fintraitementfrancs:
    resultat = resultat + " " + Devise
    If Nb > 2 Then: resultat = resultat + "s"

    'traitement des centimes
    varnum = Int((Nb - Int(Nb)) * 100 + 0.5)
    If varnum > 0 Then
        GoSub centaine_dizaine
        resultat = resultat + " et " + varlet + " centime"
        If varnum > 1 Then: resultat = resultat + "s"
    End If

    'conversion 1ère lettre en majuscule
    resultat = UCase(Left(resultat, 1)) + Right(resultat, Len(resultat) - 1)

    'renvoi du resultat de la fonction et fin de la fonction
    NOMBRE_EN_LETTRES = resultat
    Exit Function

    'sous programme
centaine_dizaine:
    varlet = ""

    'traitement des centaines
    If varnum >= 100 Then
        varlet = Chiffre(Int(varnum / 100))
        varnum = varnum Mod 100
        If varlet = "un" Then
            varlet = "cent "
        Else
             varlet = varlet + " cent "
        End If
    End If

    'traitement des dizaines
    If varnum <= 19 Then
        If varnum > 0 Then: varlet = varlet + Chiffre(varnum)
    Else
        varnumD = Int(varnum / 10)
        varnumU = varnum Mod 10
        Select Case varnumD
            Case Is <= 5
                varlet = varlet + dizaine(varnumD)
            Case 6, 7
                varlet = varlet + dizaine(6)
             Case 8, 9
                 varlet = varlet + dizaine(8)
        End Select
        If varnumU = 1 And varnumD < 8 Then
            varlet = varlet + " et "
        Else
            If varnumU <> 0 Or varnumD = 7 Or varnumD = 9 Then: varlet = varlet + " "
        End If
        If varnumD = 7 Or varnumD = 9 Then: varnumU = varnumU + 10
        If varnumU <> 0 Then: varlet = varlet + Chiffre(varnumU)
    End If
    varlet = RTrim(varlet)
    Return

End Function

Tu peux la tester de cette façon aussi :

Sub Test()

    MsgBox NOMBRE_EN_LETTRES(116, "Euro")

End Sub

Merci à toi,

Je viens d'essayer et ça ne fonctionne pas, il met "Valeur"?????

merci

La fonction attend deux paramètres, le nombre et la monaie :

=NOMBRE_EN_LETTRES(116;"Euro")

Bonjour,

Désolé d'avoir été si long. En fait ta formule ne fonctionne pas et je ne dois pas écrire moi-même la somme car c'est automatique.

Celle que j'avais eu en anglais fonctionne pas mal mais après avoir changé quelques chiffre en euros et français, j'ai sûrement oublié quelque chose. Ici je remarque qu'il me met "un" avant d'inscrire les centaines...

merci d'avance

Bonjour à vous deux,

Tu ne peux pas utiliser une fonction anglaise et seulement traduire les chiffres. Les deux langues fonctionnent différemment dans la construction des nombres et donc la fonction sera bien différente elle aussi.

Je te conseille de t'adapter à la fonction fourni par Theze qui m'a l'air bien plus viable.

Peut être que si tu nous fourni un extrait de ton document (Avec des données anonymes) on pourra t'aider plus facilement ?

Vinceska

Merci

Mais quand je l'ai copié - collé, la réponse me donne "valeur"?? donc je suppose qu'il y a problème. De plus,Theze me dit d'inscrire comme je comprends, Or moi ce sont des calculs qui se font tout seul et je n'inscrit rien ...

Merci

Je me répète mais sans ça c'est compliqué !

Peut être que si tu nous fourni un extrait de ton document (Avec des données anonymes) on pourra t'aider plus facilement ?

Bonjour à tous,

Je relance,

désolé de répondre tardivement, je vous joint un modèle de mon travail. Je vous explique un peu :

- dans l'onglet 109, vous inscrivez un numéro de page dans la 1ère colonne qui correspond à l'onglet "marchandises". Automatiquement, s'inscrit la dénomination de l'article jusqu'au prix unitaire. Vous devez remplir le nombre demandé, puis s'incrit le total.

- Ensuite tout cela s'inscrit d'office dans l'onglet "facture". Vous verrez et vous pouvez tester par vous-même que le changement des chiffres en lettre fonctionne sauf pour les centaines, le chiffre "un" se met devant les centaines.......

- Comme je vous expliquais dans les rubriques précédentes, j'ai repris un VBA en anglais car mon excel est en anglais et j'ai traduis tout les chiffres en français et dollars, remplacé par "euros".

Je ne vois pas où est le problème...

Merci d'avance

12modele.xlsm (51.23 Ko)
Rechercher des sujets similaires à "probleme mise lettres chiffres monetaires"