1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
| Option Explicit
Global T() As String
Function Nombre_en_lettres(Nbre As Double, lang As Integer, monetaire As Boolean) As String
' renvoie la valeur en lettres de n'importe quel nombre qui sera arrondi à deux décimales et jusqu'à 2 999 999 999,99
' nouvelle orthographe (avec des tirets entre chaque chiffre)
' le paramètre lang = 1 pour la France, 2 pour la Belgique et 3 pour la Suisse
' le paramètre monetaire = vrai pour un nombre en euro (franc) et = faux pour un nombre non monétaire
ReDim T(32)
T(0) = ""
T(1) = "un"
T(2) = "deux"
T(3) = "trois"
T(4) = "quatre"
T(5) = "cinq"
T(6) = "six"
T(7) = "sept"
T(8) = "huit"
T(9) = "neuf"
T(10) = "dix"
T(11) = "onze"
T(12) = "douze"
T(13) = "treize"
T(14) = "quatorze"
T(15) = "quinze"
T(16) = "seize"
T(17) = "vingt"
T(18) = "trente"
T(19) = "quarante"
T(20) = "cinquante"
T(21) = "soixante"
T(22) = "septante"
T(23) = IIf(lang < 3, "quatre-vingt", "huitante")
T(24) = "nonante"
T(25) = "cent"
T(26) = "mille"
T(27) = "million"
T(28) = "millard"
T(29) = IIf(monetaire, IIf(lang < 3, " euro", " franc"), "")
T(30) = IIf(monetaire, IIf(lang = 1, " centime", " cent"), "")
Dim mafonction As String
Select Case lang
Case 1
mafonction = "TROIS_CHIFFRES_FR"
Case 2, 3
mafonction = "TROIS_CHIFFRES_BECH"
End Select
Dim Precede As Boolean ' permet d'insérer un tiret si le trinombre précédent n'est pas null
Dim centimes, m As Long
Dim m9, m6, m3, m0, mc, pl As String
'pl = marque du pluriel pour les milliards, millions, centaines seules et quatre-vingts seuls
If Nbre >= 3 * 10 ^ 9 Then
Nombre_en_lettres = "Excel ne sait pas faire des opérations arithmétiques sur des nombres > = à 3 10^9"
Exit Function
Else
'gestion des centimes
centimes = Round(Nbre - Int(Nbre), 2) * 100
If centimes = 0 Then
mc = ""
Else
If centimes > 1 And monetaire Then pl = "s" Else pl = ""
mc = Run(mafonction, centimes) & T(30) & pl
End If
'partie entière du nombre
Nbre = Int(Nbre)
'gestion des millards
m = Int(Nbre / 1000000000)
If m > 0 Then
If m > 1 Then pl = "s" Else pl = ""
m9 = Run(mafonction, m) & "-" & T(28) & pl
Precede = True
Else
m9 = ""
Precede = False
End If
Nbre = Nbre - (m * 1000000000)
'gestion des millions
m = Int(Nbre / 1000000)
If m > 0 Then
If m > 1 Then pl = "s" Else pl = ""
m6 = IIf(Precede, "-", "") & Run(mafonction, m) & "-" & T(27) & pl
Precede = True
Else
m6 = ""
Precede = False
End If
Nbre = Nbre - (m * 1000000)
'gestion des milliers
m = Int(Nbre / 1000)
If m > 0 Then
If m = 1 Then
m3 = IIf(Precede, "-", "") & T(26)
Else
m3 = IIf(Precede, "-", "") & Run(mafonction, m) & "-" & T(26)
Precede = True
End If
Else
m3 = ""
Precede = False
End If
Nbre = Nbre - (m * 1000)
'gestion des unités
If Nbre = 0 Then
m0 = T(0)
Else
If Nbre > 100 And Nbre = Int(Nbre / 100) * 100 Or (Nbre - Int(Nbre / 100) * 100) = 80 Then pl = "s" Else pl = ""
m0 = IIf(Precede, "-", "") & Run(mafonction, Nbre) & pl
End If
If m9 & m6 & m3 & m0 = "un" Or m9 & m6 & m3 & m0 = "" Or Not (monetaire) Then pl = "" Else pl = "s" 'pluriel de euro ou franc
Nombre_en_lettres = m9 & m6 & m3 & m0 & IIf(m9 & m6 & m3 & m0 = "", IIf(monetaire, mc, "zéro virgule " & mc), T(29) & pl & IIf(mc <> "", IIf(monetaire, " et ", " virgule ") & mc, ""))
End If
End Function
Function TROIS_CHIFFRES_BECH(m) As String
'renvoie la valeur en lettres d'un nombre de trois chiffres
Dim x, y, z As Integer
Dim a1, a2, a3 As String
x = Int(m / 100)
y = Int((m - x * 100) / 10)
z = m - x * 100 - y * 10
Select Case x
Case 0
a1 = T(x)
Case 1
a1 = T(25)
Case Else
a1 = T(x) & "-" & T(25)
End Select
Select Case y
Case 0
a2 = T(y)
Case 1 ' pour les cas de onze à seize et pour 17 à 19, prévoit dix plus les unités
a2 = IIf(x <> 0, "-", "") & IIf(z < 7, T(z + 10), T(10))
Case Else 'de vingt à nonante
a2 = IIf(x <> 0, "-", "") & T(15 + y)
End Select
Select Case z
Case 0
a3 = T(z)
Case 1 ' prévoit la différence entre trente ET un et quatre-vingt un ou "0 dizaine" un + ne rien ajouter après un onze défini dans le select des y
a3 = IIf(y = 0, "" & T(z), IIf(y = 1, "", "-et-" & T(z)))
Case Else ' ne rien ajouter après un onze à seize défini dans le select des y + ajout du tiret entre les dizaines et les unités sauf si y = 0
a3 = IIf(y = 1 And z < 7, "", IIf(y = 0, "", "-") & T(z))
End Select
TROIS_CHIFFRES_BECH = a1 & a2 & a3
End Function
Function TROIS_CHIFFRES_FR(m) As String
'renvoie la valeur en lettres d'un nombre de trois chiffres
Dim x, y, z As Integer
Dim a1, a2, a3 As String
x = Int(m / 100)
y = Int((m - x * 100) / 10)
z = m - x * 100 - y * 10
Select Case x
Case 0
a1 = T(x)
Case 1
a1 = T(25)
Case Else
a1 = T(x) & "-" & T(25)
End Select
Select Case y
Case 0
a2 = T(y)
Case 1 ' pour les cas de onze à seize et pour 17 à 19, prévoit dix plus les unités
a2 = IIf(x <> 0, "-", "") & IIf(z < 7, T(z + 10), T(10))
Case 7, 9
a2 = IIf(x <> 0, "-", "") & T(y + 14) & "-" & IIf(z < 7, T(z + 10), T(10))
Case Else 'de vingt à nonante
a2 = IIf(x <> 0, "-", "") & T(15 + y)
End Select
Select Case z
Case 0
a3 = T(z)
Case 1 ' prévoit la différence entre trente ET un et quatre-vingt un ou "0 dizaine" un + ne rien ajouter après un onze défini dans le select des y
a3 = IIf(y = 0, "" & T(z), IIf(y = 1 Or y = 7 Or y = 9, "", "-et-" & T(z)))
Case Else ' ne rien ajouter après un onze à seize défini dans le select des y + ajout du tiret entre les dizaines et les unités sauf si y = 0
a3 = IIf((y = 1 Or y = 7 Or y = 9) And z < 7, "", IIf(y = 0, "", "-") & T(z))
End Select
TROIS_CHIFFRES_FR = a1 & a2 & a3
End Function |
Partager