Revision: 77130
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at August 23, 2019 03:23 by martinbrait
Initial Code
' ***************************************************************************** ' ConvertitLettres ' ***************************************************************************** Public Function ConvertitLettres(Nombre,ChMonnaie) Dim NomUnites Dim valeurs Dim chaine dim sVar 'tableau((billion,milliard,million,millier,unité,décimale),(centaine,dizaine,unité)) Dim strT ' lettres de chaque chiffre selon emplacement Dim intD ' indicateur si chiffre avant, règle grammaticale (DEUX CENTS, DEUX CENT CINQ) Dim intT ' chiffre selon emplacement Dim b ' pour les boucle de traitement Dim d ' indicateur de décimale Dim Dizaine Dim ln Dim Presence Dim LeTiret Dim LaRetenue Dim Resultat ReDim NomUnites(90) ReDim valeurs(5) ReDim chaine(5) 'tableau((billion,milliard,million,millier,unité,décimale),(centaine,dizaine,unité)) ReDim strT(5, 2) ' lettres de chaque chiffre selon emplacement ReDim intD(5, 2) ' indicateur si chiffre avant, règle grammaticale (DEUX CENTS, DEUX CENT CINQ) ReDim intT(5, 2) ' chiffre selon emplacement ReDim Presence(5) ' Initialisation de valeurs valeurs(5) = " billion" valeurs(4) = " milliard" valeurs(3) = " million" valeurs(2) = " mille" valeurs(1) = "" ' unité valeurs(0) = "" ' décimale ' Initialisation des termes de NomUnites NomUnites(0) = "zéro" NomUnites(1) = "un" NomUnites(2) = "deux" NomUnites(3) = "trois" NomUnites(4) = "quatre" NomUnites(5) = "cinq" NomUnites(6) = "six" NomUnites(7) = "sept" NomUnites(8) = "huit" NomUnites(9) = "neuf" ' Initialisation des termes de la dizaine NomUnites(10) = "dix" NomUnites(11) = "onze" NomUnites(12) = "douze" NomUnites(13) = "treize" NomUnites(14) = "quatorze" NomUnites(15) = "quinze" NomUnites(16) = "seize" NomUnites(17) = "dix-sept" NomUnites(18) = "dix-huit" NomUnites(19) = "dix-neuf" ' Initialisation des termes de dizaines NomUnites(20) = "vingt" NomUnites(30) = "trente" NomUnites(40) = "quarante" NomUnites(50) = "cinquante" NomUnites(60) = "soixante" NomUnites(70) = "soixante" NomUnites(80) = "quatre-vingt" NomUnites(90) = "quatre-vingt" ' Classification du nombre en sous-unités d = InStr(1, Nombre, ",") ' nombre entier ou avec décimale If d Then Nombre = Left(Nombre, d - 1) + "0" + Mid(Nombre, d + 1) ' remplace la virgule par zéro If Len(Nombre) - d 1 Then Nombre Nombre + "0" 's'assure qu'il y a 2 décimales If Len(Nombre) - d > 2 Then ' sinon on arrondit à 2 décimales If Mid(Nombre, d + 3, 1) >= 5 Then Nombre = Mid(Nombre, 1, d + 1) & (1 + Mid(Nombre, d + 2, 1)) Nombre = Mid(Nombre, 1, d + 2) Else Nombre = Mid(Nombre, 1, d + 2) End If End If Else Nombre = Nombre + "000" 'sinon on ajoute pour combler les décimales End If intD(0, 0) = 0 ln = Len(Nombre) For b = 0 To ln - 1 intT(b \ 3, b Mod 3) = Mid(Nombre, ln - b, 1) If intT(b \ 3, b Mod 3) <> 0 then sVar = b + 1 else sVar = intD(b \ 3, b Mod 3) end if If (b <> ln - 1) And b > 3 Then intD((b + 1) \ 3, (b + 1) Mod 3) = sVar Next ' Recherche des termes adaptés à chaque sous-unité For b = (ln \ 3 + ln Mod 3) - 1 To 0 Step -1 strT(b, 0) = "" chaine(b) = "" LeTiret = False LaRetenue = 0 If intT(b, 2) * 100 + intT(b, 1) * 10 + intT(b, 0) <> 0 Then ' Activation du drapeau Presence(b) = intT(b, 2) * 100 + intT(b, 1) * 10 + intT(b, 0) ' Nombre supérieur ou égal à 1 ' Vérification si supérieur ou égale à 100 If intT(b, 2) >= 2 Then if intD(b, 2) <> 0 Then sVar = "" else sVar = "s" end if strT(b, 2) = NomUnites(intT(b, 2)) + " cent" + sVar ElseIf intT(b, 2) = 1 Then strT(b, 2) = "cent" End If Dizaine = intT(b, 1) * 10 + intT(b, 0) ' Vérification si supérieur à 20 If Dizaine >= 20 Then if intT(b, 1) 8 And intD(b, 1) 0 then sVar = "s" else sVar = "" end if strT(b, 1) = NomUnites(intT(b, 1) * 10) + sVar If Dizaine >= 60 Then LaRetenue = ((Dizaine \ 10) - 6) Mod 2 End If LeTiret = True ElseIf Dizaine >= 10 And Dizaine <= 19 Then strT(b, 1) = strT(b, 1) + " " + NomUnites(Dizaine) End If ' Vérification si unité non-nul If (intT(b, 0) > 0 And intT(b, 1) <> 1) Or LaRetenue Then 'Dizaine <> 1 Then If LeTiret And intT(b, 1) <> 1 Then If intT(b, 0) = 1 And intT(b, 1) < 8 Then strT(b, 0) = " et " + NomUnites(intT(b, 0) + LaRetenue * 10) Else strT(b, 0) = "-" + NomUnites(intT(b, 0) + LaRetenue * 10) End If ElseIf b <> 2 Then strT(b, 0) = NomUnites(intT(b, 0) + LaRetenue * 10) ElseIf intT(b, 0) <> 1 Then strT(b, 0) = " " + NomUnites(intT(b, 0) + LaRetenue * 10) End If End If ' concatenation des centaines, dizaines et unités et retrait des espaces inutiles if strT(b, 1) = "" then sVar = "" else sVar = " " end if chaine(b) = Trim(Trim(strT(b, 2)) + sVar + Trim(strT(b, 1))) if Left(strT(b, 0), 1) = "-" then sVar = "" else sVar = " " end if chaine(b) = trim(chaine(b) + sVar + Trim(strT(b, 0))) ' + IIf(Left(strT(b, 0), 1) = "-", "", " ") + ' ajout de la valeurs si > 1 et différent des Mille (invariable) if (Presence(b) > 1) And (b > 2) then 'IIf((Presence(b) > 1) And (b > 2), "s", "") sVar = "s" else sVar ="" end if chaine(b) = chaine(b) + valeurs(b) + sVar End If Next ' concatenation finale et retrait des espaces inutiles Resultat = chaine(5) For b = 4 To 1 Step -1 if chaine(b) <> "" then 'IIf(chaine(b) <> "", " ", "") sVar = " " else sVar = "" end if Resultat = Resultat + sVar + chaine(b) Next If Resultat "" Then Resultat "zéro" if INSTR(1,Nombre,",")>0 then if Mid(Nombre, INSTR(1,Nombre,",")+1)*1 > 1 then 'IIf(CDec(Mid(Nombre, 1, Len(Nombre) - 3)) > 1, "s", "") sVar = "s" else sVar = "" end if else sVar = "" end if If ChMonnaie True Then Resultat Resultat + " Euro" + sVar If chaine(0) <> "" Then Resultat = Resultat + " et " + chaine(0) if Presence(0) > 1 Then 'IIf(Presence(0) > 1, "s", "") sVar = "s" else sVar = "" end if If ChMonnaie True Then Resultat Resultat + " centime" + sVar End If ' Fin ConvertitLettres = Trim(UCase(Resultat)) End Function
Initial URL
Initial Description
convert numbers to text (french) V1
Initial Title
[vba-basic] convertir des nombres en lettres (french) V1
Initial Tags
convert
Initial Language
Visual Basic