Macro complémentaire NB.LETTRE.XLA

Bonjour cher forum.

J'ai deux préoccupations concernant cette fonction citée à l'objet :

  • 1- Quelqu'un peut-il me dire si cette fonction met un " s " sur cent quand il s'agit des nombres tels deux cent mille, trous cent mille ? Si oui comment corriger cela ?
  • 2- Quelqu'un peut-il me réécrire les macros de cette fonction en y insérant des commentaires pour que je puisse l'adapter au Franc CAF ?

Merci.

Bonjour,

As-tu accès au code de cette macro complémentaire ...?

Bien sûr, le voilà :

Option Explicit

'***********
' Devise=0   aucune
'       =1   Euro €
'       =2   Dollar $
'       =3   €uro €
' Langue=0   Français
'       =1   Belgique
'       =2   Suisse
' Casse =0   Minuscule
'       =1   Majuscule en début de phrase
'       =2   Majuscule
'       =3   Majuscule en début de chaque mot
' ZeroCent=0   Ne mentionne pas les cents s'ils sont égal à 0
'         =1   Mentionne toujours les cents
'***********
' Conversion limitée à 999 999 999 999 999 ou 9 999 999 999 999,99
' si le nombre contient plus de 2 décimales, il est arrondit à 2 décimales

Public Function ConvNumberLetter(Nombre As Double, Optional Devise As Byte = 0, _
                                    Optional Langue As Byte = 0, _
                                    Optional Casse As Byte = 0, _
                                    Optional ZeroCent As Byte = 0) As String
    Dim dblEnt As Variant, byDec As Byte
    Dim bNegatif As Boolean
    Dim strDev As String, strCentimes As String

    If Nombre < 0 Then
        bNegatif = True
        Nombre = Abs(Nombre)
    End If
    dblEnt = Int(Nombre)
    byDec = CInt((Nombre - dblEnt) * 100)
    If byDec = 0 Then
        If dblEnt > 999999999999999# Then
            ConvNumberLetter = "#TropGrand"
            Exit Function
        End If
    Else
        If dblEnt > 9999999999999.99 Then
            ConvNumberLetter = "#TropGrand"
            Exit Function
        End If
    End If
    Select Case Devise
        Case 0
            If byDec > 0 Then strDev = " virgule "
        Case 1
            strDev = " Euro"
            If dblEnt >= 1000000 And Right(dblEnt, 6) = "000000" Then strDev = " d'Euro"
            If byDec > 0 Then strCentimes = strCentimes & " Cent"
            If byDec > 1 Then strCentimes = strCentimes & "s"
        Case 2
            strDev = " Dollar"
            If byDec > 0 Then strCentimes = strCentimes & " Cent"
        Case 3
            strDev = " €uro"
            If dblEnt >= 1000000 And Right(dblEnt, 6) = "000000" Then strDev = " d'€uro"
            If byDec > 0 Then strCentimes = strCentimes & " Cent"
            If byDec > 1 Then strCentimes = strCentimes & "s"
    End Select
    If dblEnt > 1 And Devise <> 0 Then strDev = strDev & "s"
    strDev = strDev & " "
    If dblEnt = 0 Then
        ConvNumberLetter = "zéro " & strDev
    Else
        ConvNumberLetter = ConvNumEnt(CDbl(dblEnt), Langue) & strDev
    End If
    If byDec = 0 Then
        If Devise <> 0 Then
            If ZeroCent = 1 Then ConvNumberLetter = ConvNumberLetter & "zéro Cent"
        End If
    Else
        If Devise = 0 Then
            ConvNumberLetter = ConvNumberLetter & _
                ConvNumDizaine(byDec, Langue, True) & strCentimes
        Else
            ConvNumberLetter = ConvNumberLetter & _
                ConvNumDizaine(byDec, Langue, False) & strCentimes
        End If
    End If
    ConvNumberLetter = Replace(ConvNumberLetter, "  ", " ")
    If Left(ConvNumberLetter, 1) = " " Then ConvNumberLetter = _
        Right(ConvNumberLetter, Len(ConvNumberLetter) - 1)
    If Right(ConvNumberLetter, 1) = " " Then ConvNumberLetter = _
        Left(ConvNumberLetter, Len(ConvNumberLetter) - 1)
    Select Case Casse
        Case 0
            ConvNumberLetter = LCase(ConvNumberLetter)
        Case 1
            ConvNumberLetter = UCase(Left(ConvNumberLetter, 1)) & _
                LCase(Right(ConvNumberLetter, Len(ConvNumberLetter) - 1))
        Case 2
            ConvNumberLetter = UCase(ConvNumberLetter)
        Case 3
            ConvNumberLetter = Application.WorksheetFunction.Proper(ConvNumberLetter)
            If Devise = 3 Then _
                ConvNumberLetter = Replace(ConvNumberLetter, "€Uros", "€uros", , , vbTextCompare)
    End Select
End Function

Private Function ConvNumEnt(Nombre As Double, Langue As Byte)
    Dim iTmp As Variant, dblReste As Double
    Dim strTmp As String
    Dim iCent As Integer, iMille As Integer, iMillion As Integer
    Dim iMilliard As Integer, iBillion As Integer

    iTmp = Nombre - (Int(Nombre / 1000) * 1000)
    iCent = CInt(iTmp)
    ConvNumEnt = Nz(ConvNumCent(iCent, Langue))
    dblReste = Int(Nombre / 1000)
    If iTmp = 0 And dblReste = 0 Then Exit Function
    iTmp = dblReste - (Int(dblReste / 1000) * 1000)
    If iTmp = 0 And dblReste = 0 Then Exit Function
    iMille = CInt(iTmp)
    strTmp = ConvNumCent(iMille, Langue)
    Select Case iTmp
        Case 0
        Case 1
            strTmp = " mille "
        Case Else
            strTmp = strTmp & " mille "
    End Select
    If iMille = 0 And iCent > 0 Then ConvNumEnt = "et " & ConvNumEnt
    ConvNumEnt = Nz(strTmp) & ConvNumEnt
    dblReste = Int(dblReste / 1000)
    iTmp = dblReste - (Int(dblReste / 1000) * 1000)
    If iTmp = 0 And dblReste = 0 Then Exit Function
    iMillion = CInt(iTmp)
    strTmp = ConvNumCent(iMillion, Langue)
    Select Case iTmp
        Case 0
        Case 1
            strTmp = strTmp & " million "
        Case Else
            strTmp = strTmp & " millions "
    End Select
    If iMille = 1 Then ConvNumEnt = "et " & ConvNumEnt
    ConvNumEnt = Nz(strTmp) & ConvNumEnt
    dblReste = Int(dblReste / 1000)
    iTmp = dblReste - (Int(dblReste / 1000) * 1000)
    If iTmp = 0 And dblReste = 0 Then Exit Function
    iMilliard = CInt(iTmp)
    strTmp = ConvNumCent(iMilliard, Langue)
    Select Case iTmp
        Case 0
        Case 1
            strTmp = strTmp & " milliard "
        Case Else
            strTmp = strTmp & " milliards "
    End Select
    If iMillion = 1 Then ConvNumEnt = "et " & ConvNumEnt
    ConvNumEnt = Nz(strTmp) & ConvNumEnt
    dblReste = Int(dblReste / 1000)
    iTmp = dblReste - (Int(dblReste / 1000) * 1000)
    If iTmp = 0 And dblReste = 0 Then Exit Function
    iBillion = CInt(iTmp)
    strTmp = ConvNumCent(iBillion, Langue)
    Select Case iTmp
        Case 0
        Case 1
            strTmp = strTmp & " billion "
        Case Else
            strTmp = strTmp & " billions "
    End Select
    If iMilliard = 1 Then ConvNumEnt = "et " & ConvNumEnt
    ConvNumEnt = Nz(strTmp) & ConvNumEnt
End Function

Private Function ConvNumDizaine(Nombre As Byte, Langue As Byte, bDec As Boolean) As String
    Dim TabUnit As Variant, TabDiz As Variant
    Dim byUnit As Byte, byDiz As Byte
    Dim strLiaison As String

    If bDec Then
        TabDiz = Array("zéro", "", "vingt", "trente", "quarante", "cinquante", _
            "soixante", "soixante", "quatre-vingt", "quatre-vingt")
    Else
        TabDiz = Array("", "", "vingt", "trente", "quarante", "cinquante", _
            "soixante", "soixante", "quatre-vingt", "quatre-vingt")
    End If
    If Nombre = 0 Then
        TabUnit = Array("zéro")
    Else
        TabUnit = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", _
            "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", _
            "seize", "dix-sept", "dix-huit", "dix-neuf")
    End If
    If Langue = 1 Then
        TabDiz(7) = "septante"
        TabDiz(9) = "nonante"
    ElseIf Langue = 2 Then
        TabDiz(7) = "septante"
        TabDiz(8) = "huitante"
        TabDiz(9) = "nonante"
    End If
    byDiz = Int(Nombre / 10)
    byUnit = Nombre - (byDiz * 10)
    strLiaison = "-"
    If byUnit = 1 Then strLiaison = " et "
    Select Case byDiz
        Case 0
            strLiaison = " "
        Case 1
            byUnit = byUnit + 10
            strLiaison = ""
        Case 7
            If Langue = 0 Then byUnit = byUnit + 10
        Case 8
            If Langue <> 2 Then strLiaison = "-"
        Case 9
            If Langue = 0 Then
                byUnit = byUnit + 10
                strLiaison = "-"
            End If
    End Select
    ConvNumDizaine = TabDiz(byDiz)
    If byDiz = 8 And Langue <> 2 And byUnit = 0 Then ConvNumDizaine = ConvNumDizaine & "s"
    If TabUnit(byUnit) <> "" Then
        ConvNumDizaine = ConvNumDizaine & strLiaison & TabUnit(byUnit)
    Else
        ConvNumDizaine = ConvNumDizaine
    End If
End Function

Private Function ConvNumCent(Nombre As Integer, Langue As Byte) As String
    Dim TabUnit As Variant
    Dim byCent As Byte, byReste As Byte
    Dim strReste As String

    TabUnit = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", _
        "huit", "neuf", "dix")
    byCent = Int(Nombre / 100)
    byReste = Nombre - (byCent * 100)
    strReste = ConvNumDizaine(byReste, Langue, False)
    Select Case byCent
        Case 0
            ConvNumCent = strReste
        Case 1
            If byReste = 0 Then
                ConvNumCent = "cent"
            Else
                ConvNumCent = "cent " & strReste
            End If
        Case Else
            If byReste = 0 Then
                ConvNumCent = TabUnit(byCent) & " cents"
            Else
                ConvNumCent = TabUnit(byCent) & " cent " & strReste
            End If
    End Select
End Function

Private Function Nz(strNb As String) As String
    If strNb <> " zéro" Then Nz = strNb
End Function

Re,

Merci pour la macro ...

Concernant tes préoccupations ...

1. Pour la première ... As-tu fais le test ???

A priori, à la lecture du code, la règle du ' s ' est déjà codée ...

2. Pour la seconde ...cela signifie que tu voudrais ajouter la devise CAF ...

Du coup, il faudrait également que tu fasses la liste des spécifications du CAF ... à moins que le CAF soit identique à l'Euro ...

1. Pour la première ... As-tu fais le test ???

Oui, et 200.000 = Deux cents mille ce qui n'est pas bien, cela doit être deux cents mille.

2. Pour la seconde ...cela signifie que tu voudrais ajouter la devise CAF ...

Oui ! Je me rends compte de m'être trompée sur le nom de la Devise, c'est plutôt Franc CFA, monnaie de l'Afrique francophone.

En général, c'est une monnaie standard pour laquelle les décimales sont arrondies au franc supérieur, donc pas de spécificité, sauf le mot Franc qui doit s'accorder en nombre ([0;1] = Franc, > 1 = Francs)

Merci

Re,

Concernant la Majuscule ... la fonction prévoit ce choix ...

Il te suffit de mettre un 0 pour la quatrième variable dans la fonction pour obtenir des minuscules ...

A tester ...

Mon problème se situe au niveau de l'accord de cent, vingt ... ces deux chiffres s'accordent lorsqu'ils ne sont pas suivis d'un autre chiffre, au cas contraire, ils sont invariables. (Ex : cent = deux cent, deux cent un, deux cent mille ; vingt = vingt-et-un, quatre-vingts...

Donc j'ai une valeur de 200.000 sur une facture, mais, la fonction la convertit à deux cents mille, ce qui est faux

Bonjour,

Je te propose une fonction que j'utilise depuis quelques années.

Je l'ai adaptée au franc CFA

Pour d'autres monnaies il est possible de passer la devise en paramètre à la fonction afin qu'elle soir universelle.

ATTENTION: Il y a deux fonctions: NBenLettres et PMod

En effet, la fonction MOD standard pose problème avec les millards

En espérant que cela solutionne ton problème de "s" sur vingt et cent !

Function NBenLettres(NB) As String
    On Error GoTo NBenLettres_suite

    '
    Dim Varnum As Long
    Dim varnumD, varnumU, varlet, résultat

    'varnum    : pour stocker les parties du nombre que l'on va découper
    'varlet    : pour stocker la conversion en lettres d'une partie du nombre
    'varnumD   : pour stocker la partie dizaine d'un nombre à 2 chiffres
    'varnumU   : pour stocker la partie unité d'un nombre à 2 chiffres
    'résultat  : pour stocker les résultats intermédiaires des différentes étapes
    '
    Static Chiffre(1 To 19) '*** tableau contenant le nom des 16 premiers nombres en lettres
        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) '*** tableau contenant les noms des dizaines
        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 zéro franc
    If NB >= 1 Then
        résultat = ""
    Else
        résultat = "zéro"
        GoTo fintraitementfrancs
    End If

    '*** Traitement des milliards
    Varnum = Int(NB / 1000000000)
    If Varnum > 0 Then
        GoSub centaine_dizaine
        résultat = varlet + " milliard"
        If varlet <> "un" Then résultat = résultat + "s"
    End If

    '*** Traitement des millions
    Varnum = Int(PMod(NB, 1000000000)) 'Int(NB) Mod 1000000000
    Varnum = Int(Varnum / 1000000)
    If Varnum > 0 Then
        GoSub centaine_dizaine
        résultat = résultat + " " + varlet + " million"
        If varlet <> "un" Then résultat = résultat + "s"
    End If
    '
    '*** Traitement des milliers
    Varnum = Int(PMod(NB, 1000000))
    Varnum = Int(Varnum / 1000)
    If Varnum > 0 Then
        GoSub centaine_dizaine
        If varlet <> "un" Then résultat = résultat + " " + varlet
        résultat = résultat + " mille"
    End If
    '
    '*** Traitement des centaines et dizaines
    Varnum = Int(PMod(NB, 1000)) 'Int(NB) Mod 1000
    If Varnum > 0 Then
        GoSub centaine_dizaine
        résultat = résultat + " " + varlet
    End If
    résultat = LTrim(résultat)
    varlet = Right$(résultat, 4)
    '
    '*** Traitement du "s" final pour vingt et cent et du "de" pour million
    Select Case varlet
        Case "cent", "ingt"
            If Len(résultat) > 5 Then
                résultat = résultat + "s"
            End If
        Case "lion", "ions", "iard", "ards"
            résultat = résultat + " de"
    End Select
fintraitementfrancs:  '*** Etiquette de branchement pour le cas "zéro franc"
    '
    '*** Indication du terme franc
    résultat = résultat + " franc"
    If NB >= 2 Then
        résultat = résultat + "s CFA"
    Else
        résultat = résultat + " CFA"
    End If
    '
    '*** Traitement des centimes
    Varnum = Int((NB - Int(NB)) * 100 + 0.5) '*** On additionne 0,5
                                             '*** afin de compenser
                                             '*** les erreurs de calcul
                                             '*** dues aux arrondis
    If Varnum > 0 Then
        GoSub centaine_dizaine

    '*** Traitement du "s" final pour vingt et cent
        If varlet = "quatre-vingt" Then
            varlet = varlet + "s"
        End If
        résultat = résultat + " et " + varlet + " centime"
        If Varnum > 1 Then résultat = résultat + "s"
    End If
    '
    '*** Conversion 1ère lettre en majuscule
    résultat = UCase(Left(résultat, 1)) + Right(résultat, Len(résultat) - 1)
    '
    '*** renvoie du résultat de la fonction et fin de la fonction
    NBenLettres = résultat
    Exit Function
NBenLettres_Fin:
    Exit Function

'
centaine_dizaine:       '*** Sous-programme de conversion en lettres
                        '*** des centaines et dizaines
    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        '*** Cas où la dizaine est <20
        If Varnum > 0 Then varlet = varlet + Chiffre(Varnum)
    Else                        '*** Autres cas
        varnumD = Int(Varnum / 10) '*** chiffre des dizaines
        varnumU = Varnum Mod 10    '*** chiffre des unités
        Select Case varnumD  '*** génération des dizaines en lettres
            Case Is <= 5
                varlet = varlet + Dizaine(varnumD)
            Case 6, 7
                varlet = varlet + Dizaine(6)
            Case 8, 9
                varlet = varlet + Dizaine(8)
        End Select
        '
        '*** traitement du séparateur des dizaines et unités
        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
        End If
        '*** génération des unités
        If varnumD = 7 Or varnumD = 9 Then varnumU = varnumU + 10
        If varnumU <> 0 Then varlet = varlet + Chiffre(varnumU)
    End If
    '
    '*** Suppression des espaces à gauche et retour
    varlet = RTrim(varlet)
    Return

NBenLettres_suite:
    NBenLettres = ""
    Resume NBenLettres_Fin
End Function

Function PMod(V As Variant, D) As Variant
   Dim R As Variant
   Dim m As Variant
   R = Int(V / D)
   m = R * D
   PMod = V - m
End Function

Bien cordialement,

Salut GNIN

Merci d'avoir partagé ta solution avec le Forum ...

Pas de quoi !

Je pioche aussi de mon côté des choses super intéressantes sur le site.

Grand merci à vous deux, ce code est parfait, je vais juste ajouter la casse.

Me revoilà, juste pour vous dire que j'ai rajouté la casse dans la fonction, voilà ce que ça donne :

Function NBenLettres(NB As Double, Optional Casse As Byte = 0) As String
    On Error GoTo NBenLettres_suite

    '
    Dim VarNum As Long
    Dim VarNumD, VarNumU, VarLet, Résultat

    'varnum    : pour stocker les parties du nombre que l'on va découper
    'varlet    : pour stocker la conversion en lettres d'une partie du nombre
    'varnumD   : pour stocker la partie dizaine d'un nombre à 2 chiffres
    'varnumU   : pour stocker la partie unité d'un nombre à 2 chiffres
    'résultat  : pour stocker les résultats intermédiaires des différentes étapes
    '
    Static Chiffre(1 To 19) '*** tableau contenant le nom des 16 premiers nombres en lettres
        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) '*** tableau contenant les noms des dizaines
        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 zéro franc
    If NB >= 1 Then
        Résultat = ""
    Else
        Résultat = "zéro"
        GoTo fintraitementfrancs
    End If

    '*** Traitement des milliards
    VarNum = Int(NB / 1000000000)
    If VarNum > 0 Then
        GoSub centaine_dizaine
        Résultat = VarLet + " milliard"
        If VarLet <> "un" Then Résultat = Résultat + "s"
    End If

    '*** Traitement des millions
    VarNum = Int(PMod(NB, 1000000000)) 'Int(NB) Mod 1000000000
    VarNum = Int(VarNum / 1000000)
    If VarNum > 0 Then
        GoSub centaine_dizaine
        Résultat = Résultat + " " + VarLet + " million"
        If VarLet <> "un" Then Résultat = Résultat + "s"
    End If
    '
    '*** Traitement des milliers
    VarNum = Int(PMod(NB, 1000000))
    VarNum = Int(VarNum / 1000)
    If VarNum > 0 Then
        GoSub centaine_dizaine
        If VarLet <> "un" Then Résultat = Résultat + " " + VarLet
        Résultat = Résultat + " mille"
    End If
    '
    '*** Traitement des centaines et dizaines
    VarNum = Int(PMod(NB, 1000)) 'Int(NB) Mod 1000
    If VarNum > 0 Then
        GoSub centaine_dizaine
        Résultat = Résultat + " " + VarLet
    End If
    Résultat = LTrim(Résultat)
    VarLet = Right$(Résultat, 4)
    '
    '*** Traitement du "s" final pour vingt et cent et du "de" pour million
    Select Case VarLet
        Case "cent", "ingt"
            If Len(Résultat) > 5 Then
                Résultat = Résultat + "s"
            End If
        Case "lion", "ions", "iard", "ards"
            Résultat = Résultat + " de"
    End Select
fintraitementfrancs:  '*** Etiquette de branchement pour le cas "zéro franc"
    '
    '*** Indication du terme franc
    Résultat = Résultat + " franc"
    If NB >= 2 Then
        Résultat = Résultat + "s CFA"
    Else
        Résultat = Résultat + " CFA"
    End If
    '
    '*** Traitement des centimes
    VarNum = Int((NB - Int(NB)) * 100 + 0.5) '*** On additionne 0,5
                                             '*** afin de compenser
                                             '*** les erreurs de calcul
                                             '*** dues aux arrondis
    If VarNum > 0 Then
        GoSub centaine_dizaine

    '*** Traitement du "s" final pour vingt et cent
        If VarLet = "quatre-vingt" Then
            VarLet = VarLet + "s"
        End If
        Résultat = Résultat + " et " + VarLet + " centime"
        If VarNum > 1 Then Résultat = Résultat + "s"
    End If
    '
    '*** Conversion 1ère lettre en majuscule
   ' Résultat = UCase(Left(Résultat, 1)) + Right(Résultat, Len(Résultat) - 1)
    '
    '*** renvoie du résultat de la fonction et fin de la fonction
    Select Case Casse
        Case 0
            Résultat = LCase(Résultat)
        Case 1
            Résultat = UCase(Left(Résultat, 1)) & _
                LCase(Right(Résultat, Len(Résultat) - 1))
        Case 2
            Résultat = UCase(Résultat)
        End Select
    NBenLettres = Résultat
    Exit Function
NBenLettres_Fin:
    Exit Function

'
centaine_dizaine:       '*** Sous-programme de conversion en lettres
                        '*** des centaines et dizaines
    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        '*** Cas où la dizaine est <20
        If VarNum > 0 Then VarLet = VarLet + Chiffre(VarNum)
    Else                        '*** Autres cas
        VarNumD = Int(VarNum / 10) '*** chiffre des dizaines
        VarNumU = VarNum Mod 10    '*** chiffre des unités
        Select Case VarNumD  '*** génération des dizaines en lettres
            Case Is <= 5
                VarLet = VarLet + Dizaine(VarNumD)
            Case 6, 7
                VarLet = VarLet + Dizaine(6)
            Case 8, 9
                VarLet = VarLet + Dizaine(8)
        End Select
        '
        '*** traitement du séparateur des dizaines et unités
        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
        End If
        '*** génération des unités
        If VarNumD = 7 Or VarNumD = 9 Then VarNumU = VarNumU + 10
        If VarNumU <> 0 Then VarLet = VarLet + Chiffre(VarNumU)
    End If
    '
    '*** Suppression des espaces à gauche et retour
    VarLet = RTrim(VarLet)
    Return

NBenLettres_suite:
    NBenLettres = ""
    Resume NBenLettres_Fin
End Function

Function PMod(V As Variant, D) As Variant
   Dim R As Variant
   Dim m As Variant
   R = Int(V / D)
   m = R * D
   PMod = V - m
End Function

Super !

Enrichissement de la fonction très intéressant

Bonne soirée à tous ,

@ Nathalie

Merci pour tous les futurs lecteurs du Forum ...

Rechercher des sujets similaires à "macro complementaire lettre xla"