'*************************************
'Nombre en lettre Special pays francophone
'Suisse Belgique France
'monnaie euro , CHF(franc suisse),CFA(monnaie francais en afrique) , CFP(franc pacifique territoire francais outre mer)
'auteur: patricktoulon
'date version: 1.3 04/12/2021
'*************************************
Option Explicit
Sub testx()
MsgBox NbToLettresFSB("0.1", "chf")
End Sub
Function NbToLettresFSB(chaine As String, Optional region As String = "")
Dim It, TR, diz, Ul, c, d, u, dix, I&, Tranche, monnaie$, Ctme$, Chain$, T, X&, Ch, Et$, Entier$, Dec$, de, q
Tranche = Array(" nonilliard", " nonillion", " octilliard", " octillion", " septilliard", " septillion", " sextilliard", " sextillion", " quintilliard", " quintillion", " quadrilliard", " quadrillion", " trilliard", " trillion", " billiard", " billion", " milliard", " million", " mille", "")
Ul = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf")
diz = Array("", "dix", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix", "cent")
Chain = Replace(chaine, ".", ",") 'reformatage du nombre avec virgule
'If Chain = "" Then NbToLettresFSB = "chaine vide!": Exit Function
If Chain = "" Then NbToLettresFSB = "": Exit Function
T = Split(Chain, ",") 'on coupe (entier/decimal)
monnaie = IIf(UBound(T) = 1, " virgule ", ""): Ctme = ""
If UBound(T) = 1 Then T(1) = Left("0" & T(1) & "0", 3)
region = LCase(region)
Select Case region
Case "be": diz(7) = "septante": diz(9) = "nonante":
Case "se": diz(7) = "septante": diz(8) = "huitante": diz(9) = "nonante": region = "se"
Case "euro": If region = "euro" Then region = "fr": de = IIf(Len(Chain) > 6 And Val(Right(Chain, 6)) = 0, " d'", " "): monnaie = " euro" & IIf(T(0) > 1, "s", " "): Ctme = " centime"
Case "beuro": diz(7) = "septante": diz(9) = "nonante": region = "be": Ctme = " centime": de = IIf(Len(Chain) > 6 And Val(Right(Chain, 6)) = 0, " d'", ""): monnaie = " euro" & IIf(T(0) > 1, "s", " ")
Case "chf": diz(7) = "septante": diz(8) = "huitante": diz(9) = "nonante": monnaie = " CHF ": region = "se": Ctme = " centime"
Case "cfp", "cfa": de = IIf(Len(Chain) > 6 And Val(Right(Chain, 6)) = 0, " de ", ""): monnaie = " Franc" & IIf(T(0) > 1, "s ", " ") & UCase(region): region = "fr":: Ctme = " centime"
Case Else: region = "fr"
End Select
If UBound(T) = 1 Then
If T(1) > 0 And monnaie <> " virgule " Then Ctme = Ctme & IIf(T(1) > 1, "s", "") Else Ctme = ""
If Val(T(0)) = 0 And Ctme <> "" Then Ctme = Ctme & IIf(Left(Trim(LCase(monnaie)), 1) Like "[a,e,i,o,u,y]", " d'", IIf(monnaie <> " CHF ", " de", "")) & monnaie
monnaie = IIf(T(1) > 0 And monnaie <> " virgule ", monnaie & " et ", monnaie)
End If
If CDbl(Chain) = 0 Then NbToLettresFSB = "zero" & monnaie: Exit Function
If Int(Val(Chain)) = 0 And monnaie <> " virgule " Then monnaie = ""
If Int(Chain) = Chain Then Ctme = ""
For X = 0 To UBound(T)
If Int(Chain) = 0 And CDbl(Chain) > 0 And monnaie = " virgule " And X = 0 Then Ul(0) = "zéro" Else Ul(0) = ""
Ch = Split(Format(T(X), "#,##0"), Chr(160)) '----->abandon de la rectification du formatage avec les zéros manquants
It = UBound(Tranche) - UBound(Ch)
For I = 0 To UBound(Ch)
Ch(I) = Format(Ch(I), "000") ' c'est dans chaque tranches que l'on formate a 3 chiffres
Select Case True: Case Ch(I) > 0: TR = Tranche(It + I): Case Else: TR = "": Ch(I) = "": End Select
If TR <> " mille" And TR <> "" And Val(Ch(I)) > 1 Then TR = TR & "s"
c = IIf(Val(Ch(I)) < 100, "", Left(Ch(I), 1)): If c <> "" Then c = IIf(c > 1, Ul(c), Ul(0)) & IIf(c > 1, " ", "") & "cent" & IIf(Val(Ch(I)) Mod 100 = 0 And Ch(I) <> 100, "s", " ")
d = Mid(Ch(I), 2, 1): u = Right(Ch(I), 1)
If d Like "[7,9]" And u > 0 And region = "fr" Then d = d - 1: u = u + 10:
If d = 1 And u > 0 Then d = d - 1: u = u + 10:
Et = IIf(d Like "[2,3,4,5,6,7,9]" And (u = 1 Or u = 11), " et ", " "): Et = IIf(region = "se" And d = 8 And u = 1, " et ", Et)
d = diz(Val(d)) & IIf(Val(d) = 8 And u = 0 And "befr" Like "*" & region & "*", "s", ""): u = Ul(Val(u))
If Ch(I) = 1 And TR = " mille" Then u = ""
Ch(I) = Replace(Application.Trim(c & d & Et & u), " ", "-") & TR
Next
Select Case X: Case 0: Entier = Trim(Join(Ch)): Case 1: Dec = Trim(Join(Ch)): End Select
c = "": d = "": u = "": Et = "":
Next
NbToLettresFSB = Application.Trim(Entier & de & monnaie & Dec & Ctme)
End Function