Conversion chiffres en lettre en anglais
Bonjour à tous,
J'ai besoin de votre aide !
J'ai hérité de tableaux Excel que je suis entrain de moderniser/automatiser. Cependant, je n'ai absolument aucune notion en macro ...
J'ai déjà une macro concernant le sujet en titre que je vous copierai ci-dessous. Cependant, il y a 2 problèmes que je ne sais pas comment régler:
(Précision, c'est bien en anglais que je souhaite)
1. Le texte ne s'écrit que jusqu'à 3 décimales mais il faudrait que cela aille jusqu'à 4. (Exemple: je tape 1234.1234 et cela écrit: "One Thousand Two Hundred Thirty Four spot One Hundred Tweenty Three", comme vous pouvez le voir, cela n'est pas correct. Cela devrait être "One Thousand Two Hundred Thirty Four spot One Thousand Two Hundred Thirty Four")
2. La macro supprime le 1er 0 des décimales même s'il y a une suite. (Exemple: je tape 123.012 et cela écrit "One Hundred Twenty Three spot Twelve", comme vous pouvez le voir, cela n'est pas correct. Cela devrait être "One Hundred Twenty Three spot Zero Twelve")
Si l'un de vous pouvait m'aider à régler ces soucis, j'en serai éternellement reconnaissante !!!
MERCI BEAUCOUP DE VOTRE AIDE !!
Elisa
Voici la macro que j'ai:
Private sNumberText() As String
Function NBenLettres(nb)
'
Dim varnum, 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(7) = "septante"
dizaine(8) = "quatre-vingt"
dizaine(9) = "nonante"
'
'*** Traitement du cas zéro franc
If nb >= 1 Then
résultat = ""
Else
résultat = "zéro"
GoTo fintraitementfrancs
End If
'*** Traitement des millions
varnum = Int(nb / 1000000)
If varnum > 0 Then
GoSub centaine_dizaine
résultat = varlet + " million"
If varlet <> "un" Then résultat = résultat + "s"
End If
'
'*** Traitement des milliers
varnum = Int(nb) Mod 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(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"
résultat = résultat + "s"
Case "lion", "ions"
résultat = résultat + " de"
End Select
fintraitementfrancs: '*** Etiquette de branchement pour le cas "zéro franc"
'
'
'*** 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
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
'
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 <= 9
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 <= 9 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
End Function
Public Function AfficheMontantLettres(curMontant As Variant, strDevise As Variant) As String
On Error Resume Next
If IsNull(curMontant) Then
AfficheMontantLettres = ""
Exit Function
End If
If strDevise = "" Then
AfficheMontantLettres = NBenLettres(CCur(curMontant))
Else
AfficheMontantLettres = strDevise & " - " & NBenLettres(CCur(curMontant))
End If
End Function
Public Function AfficheMontantLettresUS(curMontant As Variant, strDevise As Variant) As String
On Error Resume Next
If IsNull(curMontant) Then
AfficheMontantLettresUS = ""
Exit Function
End If
If strDevise = "" Then
AfficheMontantLettresUS = NumberAsText(CCur(curMontant))
Else
AfficheMontantLettresUS = strDevise & " - " & NumberAsText(CCur(curMontant))
End If
End Function
Public Function NumberAsText(ByVal MyNumber)
Dim Dollars, Cents, Temp
Dim DecimalPlace, Count
ReDim Place(9) As String
Place(2) = " Thousand "
Place(3) = " Million "
Place(4) = " Billion "
Place(5) = " Trillion "
' String representation of amount.
MyNumber = Trim(Str(MyNumber))
' Position of decimal place 0 if none.
DecimalPlace = InStr(MyNumber, ".")
' Convert cents and set MyNumber to dollar amount.
If DecimalPlace > 0 Then
Cents = GetHundreds(Left(Mid(MyNumber, DecimalPlace + 1) & "000", 3))
'Cents = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2))
MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
End If
Count = 1
Do While MyNumber <> ""
Temp = GetHundreds(Right(MyNumber, 3))
If Temp <> "" Then Dollars = Temp & Place(Count) & Dollars
If Len(MyNumber) > 3 Then
MyNumber = Left(MyNumber, Len(MyNumber) - 3)
Else
MyNumber = ""
End If
Count = Count + 1
Loop
Select Case Dollars
Case ""
Dollars = "No "
Case "One"
Dollars = "One"
Case Else
Dollars = Dollars
End Select
Select Case Cents
Case ""
Cents = " "
Case "One"
Cents = " spot One"
Case Else
Cents = " spot " & Cents & ""
End Select
NumberAsText = Dollars & Cents
End Function
' Converts a number from 100-999 into text
Function GetHundreds(ByVal MyNumber)
Dim result As String
If Val(MyNumber) = 0 Then Exit Function
MyNumber = Right("000" & MyNumber, 3)
' Convert the hundreds place.
If Mid(MyNumber, 1, 1) <> "0" Then
result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred "
End If
' Convert the tens and ones place.
If Mid(MyNumber, 2, 1) <> "0" Then
result = result & GetTens(Mid(MyNumber, 2))
Else
result = result & GetDigit(Mid(MyNumber, 3))
End If
GetHundreds = result
End Function
' Converts a number from 10 to 99 into text.
Function GetTens(TensText)
Dim result As String
result = "" ' Null out the temporary function value.
If Val(Left(TensText, 1)) = 1 Then ' If value between 10-19...
Select Case Val(TensText)
Case 10: result = "Ten"
Case 11: result = "Eleven"
Case 12: result = "Twelve"
Case 13: result = "Thirteen"
Case 14: result = "Fourteen"
Case 15: result = "Fifteen"
Case 16: result = "Sixteen"
Case 17: result = "Seventeen"
Case 18: result = "Eighteen"
Case 19: result = "Nineteen"
Case Else
End Select
Else ' If value between 20-99...
Select Case Val(Left(TensText, 1))
Case 2: result = "Twenty "
Case 3: result = "Thirty "
Case 4: result = "Forty "
Case 5: result = "Fifty "
Case 6: result = "Sixty "
Case 7: result = "Seventy "
Case 8: result = "Eighty "
Case 9: result = "Ninety "
Case Else
End Select
result = result & GetDigit _
(Right(TensText, 1)) ' Retrieve ones place.
End If
GetTens = result
End Function
' Converts a number from 1 to 9 into text.
Function GetDigit(Digit)
Select Case Val(Digit)
Case 1: GetDigit = "One"
Case 2: GetDigit = "Two"
Case 3: GetDigit = "Three"
Case 4: GetDigit = "Four"
Case 5: GetDigit = "Five"
Case 6: GetDigit = "Six"
Case 7: GetDigit = "Seven"
Case 8: GetDigit = "Eight"
Case 9: GetDigit = "Nine"
Case Else: GetDigit = ""
End Select
End Function
Private Sub BuildArray(sNumberText() As String)
ReDim sNumberText(0 To 27) As String
sNumberText(0) = "Zero"
sNumberText(1) = "One"
sNumberText(2) = "Two"
sNumberText(3) = "Three"
sNumberText(4) = "Four"
sNumberText(5) = "Five"
sNumberText(6) = "Six"
sNumberText(7) = "Seven"
sNumberText(8) = "Eight"
sNumberText(9) = "Nine"
sNumberText(10) = "Ten"
sNumberText(11) = "Eleven"
sNumberText(12) = "Twelve"
sNumberText(13) = "Thirteen"
sNumberText(14) = "Fourteen"
sNumberText(15) = "Fifteen"
sNumberText(16) = "Sixteen"
sNumberText(17) = "Seventeen"
sNumberText(18) = "Eighteen"
sNumberText(19) = "Nineteen"
sNumberText(20) = "Twenty"
sNumberText(21) = "Thirty"
sNumberText(22) = "Forty"
sNumberText(23) = "Fifty"
sNumberText(24) = "Sixty"
sNumberText(25) = "Seventy"
sNumberText(26) = "Eighty"
sNumberText(27) = "Ninety"
End Sub
Private Function IsBounded(vntArray As Variant) As Boolean
' Note: the application in the IDE will stop
' at this line when first run if the IDE error
' mode is not set to "Break on Unhandled Errors"
' (Tools/Options/General/Error Trapping)
On Error Resume Next
IsBounded = IsNumeric(UBound(vntArray))
End Function
Private Function HundredsTensUnits(ByVal TestValue As Integer, Optional bUseAnd As Boolean) As String
Dim CardinalNumber As Integer
If TestValue > 99 Then
CardinalNumber = TestValue \ 100
HundredsTensUnits = sNumberText(CardinalNumber) & " Hundred "
TestValue = TestValue - (CardinalNumber * 100)
End If
If bUseAnd = True Then
HundredsTensUnits = HundredsTensUnits & "spot "
End If
If TestValue > 20 Then
CardinalNumber = TestValue \ 10
HundredsTensUnits = HundredsTensUnits & _
sNumberText(CardinalNumber + 18) & " "
TestValue = TestValue - (CardinalNumber * 10)
End If
If TestValue > 0 Then
HundredsTensUnits = HundredsTensUnits & _
sNumberText(TestValue) & " "
End If
End Function
Function nz(varVariant As Variant, varNull As Variant)
If Len(varVariant) = 0 Then
nz = varNull
End If
End Function
zéro douze quoi ?
Si vous comptez jusqu'à 4 chiffres aprés la virgule celà veut dire que vous allez jusqu'aux "Dix-millièmes"
Dans ce même exemple il y aurait donc cent vingt dix-millième et le Zéro n'aurait plus besoin d'être écrit.
Cette macro était prévue pour des "Centimes" donc deux chiffres 10 centimes --> dix centimes 1centimes --> un centimes.
on écrit pas le zéro devant car on sait que l'on parle de centimes.
Il en sera de même si vous comptez en "Dix-millièmes" ---> "cent vingt dix-millièmes" on sait qu'il y a un zéro devant.
Bonjour Elisa et XmenPL,
Je rebondit sur ton msg car j'était en train de me poser la même question.
D'après la logique du programme, avec 123.012
On devrais lire avec 4 décimales: 123.0120 et donc avoir:
One Hundred Twenty Three spot Zero One Hundred Twenty
Pour revenir au premier point, il semble que le créateur n'as pas du tout prévu 4 décimales après la virgules.