Erreur(s) ds 1 module qui convertit 1 Mt en chiffres en lettres

Fermé
RAYOUMAN Messages postés 3 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 21 janvier 2013 - 1 déc. 2012 à 17:10
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 - 3 déc. 2012 à 01:03
Bonjour,
J'ai trouvé un module il y a des années sur un site dont je ne me rappelle pas le nom exact. Ce module convertit un nombre saisi en chiffres dans une cellule Excel en nombre saisi en lettres dans une autre cellule. Ce module fonctionne très bien sauf dans un cas.

Quand le montant dépasse cent mille, Voici ce qui ce passe:

Si le 4éme chiffre est égale à zéro, j'obtiens ces exemples de résultats:

-100000 renvoie "Centmille" sans espace entre les 2 mots.
-100001 renvoie "Centmille cent un"
-200001 renvoie "Deux cents mille deux cent un"
-301002 renvoie "Trois cent un mille trois cent deux"

Je souhaite que vous pourriez m'aider à résoudre ce problème après avoir analyser et corriger ce module suivant:

Function Lettre(Mtt As Double) As String
' Décompose le montant Mtt en partie décimale et partie entière et
' et utilise la fonction IntLettre pour traduire chaque partie
Dim Es, Chn1, Chn2 As String, PEnt, PDec As Long
If Mtt <= 99999999999.99 Then
PDec = Round((Mtt - Int(Mtt)) * 100, 0)
If PDec >= 100 Then PDec = 0: PEnt = Round(Mtt, 0) Else PEnt = Int(Mtt)
If PEnt > 1 Then Es = "s " Else Es = " "
Chn1 = Trim(IntLettre(PEnt)) + " dirham" + Es
If PDec > 0 Then
If PDec > 1 Then Es = "s" Else Es = ""
Chn2 = Trim(LCase(IntLettre(PDec))) + " centime" + Es + " /.."
Else
Chn2 = "/.."
End If
Else
Chn1 = "#Montant trop grand": Chn2 = ""
End If
Lettre = Chn1 + Chn2
End Function

Function IntLettre(Mtt) As String
' Fonction de traduction francaise d'un nombre entier
Dim xp, xp2, p, Cent, MtCar, PEnt, PDec, MtArt, MtMil, Mil, Million, Milliard, M1, M2, M3 As String
Dim dL, mL, L As Integer, VC1, VC2, x1 As Long
ReDim TDix(16), TCent(9), TMil(3) As String

GoSub Tablaux
If Mtt > 0 Then
Chne = Str(Mtt): L = Len(Chne) - 1
PEnt = Right(Chne, L)
MtCar = Right(Chne, L - 1)
If PEnt < 17 Then
MtArt = TDix(PEnt)
Else
If L < 3 Then
Cent = PEnt: GoSub Centaine
Else
dL = L \ 3: mL = L Mod 3
Select Case dL
Case 1
xp = " "
If mL > 0 Then
Cent = Left(PEnt, mL)
If Val(Cent) > 1 Then
If Val(Cent) < 17 Then Mille = TDix(Val(Cent)) Else GoSub Centaine: Mille = MtArt
Else
Mille = "": xp = ""
End If
Mil = Right(PEnt, 3): GoSub Milliers
MtArt = Mille + xp + "mille " + MtMil
Else
Mil = PEnt: GoSub Milliers
MtArt = MtMil
End If
Case 2
If mL > 0 Then
Cent = Left(PEnt, mL)
If Val(Cent) < 17 Then Million = TDix(Val(Cent)) Else GoSub Centaine: Million = MtArt
If Val(Cent) > 1 Then xp = "s " Else xp = " "
Mil = Mid(PEnt, mL + 1, 3)
If Mil > 0 Then GoSub Milliers: M1 = MtMil + " mille " Else M1 = ""
Mil = Right(PEnt, 3): If Mil > 0 Then GoSub Milliers: M2 = MtMil Else M2 = " de"
MtArt = Million + " million" + xp + M1 + M2
Else
Mil = Left(PEnt, 3): If Mil > 0 Then GoSub Milliers: M1 = MtMil Else M1 = ""
Mil = Right(PEnt, 3): If Mil > 0 Then GoSub Milliers: M2 = MtMil Else M2 = ""
MtArt = M1 + "mille " + M2
End If
Case 3
If mL > 0 Then
Cent = Left(PEnt, mL): If Val(Cent) > 1 Then xp = "s " Else xp = " "
If Val(Cent) < 17 Then Milliard = TDix(Val(Cent)) Else GoSub Centaine: Milliard = MtArt
If Val(Cent) > 1 Then xp = "s " Else xp = " "
Mil = Mid(PEnt, mL + 1, 3)
If Val(Mil) > 0 Then
GoSub Milliers: M1 = MtMil + " million"
If Val(Mil) > 1 Then xp2 = "s " Else xp2 = " "
Else
M1 = "": xp2 = ""
End If
Mil = Mid(PEnt, mL + 4, 3)
If Val(Mil) > 0 Then
If Val(Mil) > 99 Then
GoSub Milliers: M2 = MtMil + "mille "
Else
Cent = Right(Mil, 2): GoSub Centaine: M2 = MtArt + "mille "
End If
Else
M2 = ""
End If
Mil = Right(PEnt, 3)
If Mil > 0 Then GoSub Milliers: M3 = MtMil Else M3 = " de"
MtArt = Milliard + " milliard" + xp + M1 + xp2 + M2 + M3
Else
Mil = Left(PEnt, 3)
If Val(Mil) > 0 Then
GoSub Milliers: M1 = MtMil + " million"
If Val(Mil) > 1 Then xp = "s " Else xp = " "
Else
M1 = "": xp = ""
End If
Mil = Mid(PEnt, 4, 3)
If Val(Mil) > 0 Then
GoSub Milliers: M2 = MtMil + " mille "
Else
M2 = ""
End If
Mil = Right(PEnt, 3)
If Mil > 0 Then GoSub Milliers: M3 = MtMil Else M3 = "de"
MtArt = M1 + xp + M2 + M3
End If
End Select
End If
End If
Else
MtArt = "Zéro "
End If
Art = UCase(Left(MtArt, 1)) + Right(MtArt, Len(MtArt) - 1)
IntLettre = Trim(Art)
Exit Function

Centaine:
Car1 = Left(Cent, 1): VC1 = Val(Car1)
Car2 = Right(Cent, 1): VC2 = Val(Car2)
x1 = VC1: VCent = Val(Cent)
If VCent > 16 Then
If VC2 > 0 Then
If VC1 = 7 Or VC1 = 9 Then
If VC2 < 7 Then
x1 = VC1 - 1
Mt2 = " " + TDix(VC2 + 10)
Else
x1 = VC1
Mt2 = " " + TDix(VC2)
End If
Else
x1 = VC1
Mt2 = " " + TDix(VC2)
End If
Else
x1 = VC1
If VC1 = 8 Then Mt2 = "s" Else Mt2 = ""
End If
MtArt = TCent(x1) + Mt2 + " "
Else
Mt2 = TDix(VCent)
MtArt = Mt2 + " "
End If
Return

Milliers:
Car1 = Left(Mil, 1): VC1 = Val(Car1): p = " "
If VC1 > 0 Then
If VC1 <> 1 Then Mt1 = TDix(VC1) + " cent" Else Mt1 = "cent"
End If
Cent = Right(Mil, 2): VC2 = Val(Cent)
If VC2 > 0 Then GoSub Centaine Else If VC1 > 1 Then MtArt = "s ": p = "" Else MtArt = "": p = ""
MtMil = Mt1 + p + MtArt: MtArt = ""
Return

Tablaux:
TDix(1) = "un": TDix(2) = "deux"
TDix(3) = "trois": TDix(4) = "quatre"
TDix(5) = "cinq": TDix(6) = "six"
TDix(7) = "sept": TDix(8) = "huit"
TDix(9) = "neuf": TDix(10) = "dix"
TDix(11) = "onze": TDix(12) = "douze"
TDix(13) = "treize": TDix(14) = "quatorze"
TDix(15) = "quinze": TDix(16) = "seize"

TCent(1) = "dix": TCent(2) = "vingt"
TCent(3) = "trente": TCent(4) = "quarante"
TCent(5) = "cinquante": TCent(6) = "soixante"
TCent(7) = "soixante dix": TCent(8) = "quatre vingt"
TCent(9) = "quatre vingt dix":
Return

End Function
A voir également:

3 réponses

Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
2 déc. 2012 à 13:34
Bonjour RAYOUMAN,
J'essaie de décoder ce code .. et pour moi qui utilise des procédures, des fonctions, un code indenté et des noms de variable significatives .. eh bien j'ai du mal.
Il n'y a aucune gestion d'erreur, par exemplr:
If Mtt <= 99999999999.99 Then
        PDec = Round((Mtt - Int(Mtt)) * 100, 0)
Si "Mtt" qui est un Double, est encodé avec plus de deux décimales, cela risque de ne pas te donner le résultat escompté !
Le code est bourré de variables non déclarée, pire encore, des variables déclarée en VARIANT, ce qui n'est pas beaucoup mieux !

Un peu de patience et je te remets cela pour un mieux .. si tu as le temps bien sûr !
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
2 déc. 2012 à 18:08
Milliers:
    Car1 = Left(Mil, 1)
    VC1 = Val(Car1)
    p = " "
    If VC1 > 0 Then
        If VC1 <> 1 Then
            Mt1 = TDix(VC1) + " cent"
        Else
            Mt1 = "cent"
        End If
    End If
    Cent = Right(Mil, 2)
    VC2 = Val(Cent)
    If VC2 > 0 Then
        GoSub Centaine
    ElseIf VC1 > 1 Then
        MtArt = "s ": p = ""
    Else
        MtArt = " ": p = ""
    End If
    MtMil = Mt1 + p + MtArt: MtArt = ""
    Return
End Function

Pour les "100000", mettre un espace à MtArt " " au lieu de ""
C'est pas grand chose mais c'est toujours ça !
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
2 déc. 2012 à 21:06
J'arrête ce post pour cause de code illisible à mon goût.
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
3 déc. 2012 à 01:03
Bonsoir,

Va voir ici : https://forums.commentcamarche.net/forum/affich-453489-vb6-conversion-chiffres-lettres#8
Tu n'as que euros à enlever.

eric
0