XL 2019 Convertir nombre en lettre sans la monnaie

NatachaM

XLDnaute Nouveau
Bonsoir, bonjour

Je souhaite créer un fichier pour générer des fiches d'exercices. Pour cela j'ai fait le fichier ci-joint avec une ''VBA?'' trouvée sur internet ; mais j'ai deux soucis.
Le premier est que les nombres sont considérés comme des sommes d'argent et le terme ''euros'' apparaît, je voudrais le supprimer.
Le deuxième est qu'il n'y pas de trait d'union entre tous les mots (ce qui est demandé par l'éducation nationale) et même si je ne compte pas de faute si les élèves ne les mettent pas je ne peux pas leur présenter une feuille ou il en manque.

Si vous avez une solution, merci d'avance.
Natacha
 

Pièces jointes

  • Nombre en lettre.xlsm
    21.5 KB · Affichages: 33
Solution
Bonsoir,
juste remplacer cela : dans la procéduve vba au choix
si sans traits d'union
t = Replace(Left(Trim(t), Len(Trim(t)) - Len(Split(Trim(t), " ")(UBound(Split(Trim(t), " ")))) - 1), "-", " ")
si avec traits d'union
t = Replace(Left(Trim(t), Len(Trim(t)) - Len(Split(Trim(t), " ")(UBound(Split(Trim(t), " ")))) - 1), " ", "-")
cdt
Laurent

laurent950

XLDnaute Accro
Une toute derniére avec Optional pour pas rester sur ma faim ?

comment écrire le passages des arguments dans la fonction ?
sachant qu'il y a deux arguments en Optional
disont que je connais la valeur du premier mais pas du deuxiéme ?
j'envois 0 pour X
Rien pour resultat (car je dit que resultat = 5 dans la fonction)
VB:
Sub test()
' premier argument X
' si x = 0 et argument envoyé vers la fonction
' Deuxiéme arument (vide) j'envois rien a la fonction
'
' sachant qu'il y a des options (Pour la fonction)
'
'Premier argument =  j'envois la valeur 0 pour x vers (la fonction)
' Deuxiéme argument = Vide aucun resultat envoyé vers (la fonction)

Dim maRecursivFonction As Long
' comment écrire ci dessous pour que ca match avec Optional

'les deux fonctionne pas Pourquoi ?
    MsgBox maRecursivFonction 0
'ou
    MsgBox maRecursivFonction 0,
End Sub

Function maRecursivFonction(Optional x As Byte, Optional resultat As Long) As Long
' initialise le resultat s'incrémente tous seul.
'
resultat = resultat + 1
x = x + 1
If x < 10 Then maRecursivFonction x, resultat
maRecursivFonction = resultat
End Function
C'est le dernier passage pour comprendre se qui cloche
 
Dernière édition:

laurent950

XLDnaute Accro
mais la on s’égare on pollue le post de natacha ;)
Merci patrick tu as raison, je pense que natacha peux regarder les Postes #1 à #9 (ce sont les postes ou il y a les soltions)

Je te remerci Patrick pour ces explications sur la récurcivité, je verais par la suite optional (les différents cas)

Je te souhaite une bonne nuit et encore une fois un grand Merci.
laurent
 

NatachaM

XLDnaute Nouveau
Bonjour, bonsoir,
Merci à Laurent pour sa réponse rapide.
Mais je me suis mal faite comprendre il DOIT y avoir les traits d'union PARTOUT.
Exemple : cent-vingt-quatre-mille-sept-cent-quatre-vingt-deux

Mais je garde quand même ton fichier corriger Laurent car l'année prochaine on nous dira peut-être qu'il ne faut plus en mettre nul-part.:rolleyes:
 

laurent950

XLDnaute Accro
Bonsoir,
juste remplacer cela : dans la procéduve vba au choix
si sans traits d'union
t = Replace(Left(Trim(t), Len(Trim(t)) - Len(Split(Trim(t), " ")(UBound(Split(Trim(t), " ")))) - 1), "-", " ")
si avec traits d'union
t = Replace(Left(Trim(t), Len(Trim(t)) - Len(Split(Trim(t), " ")(UBound(Split(Trim(t), " ")))) - 1), " ", "-")
cdt
Laurent
 

Pièces jointes

  • Nombre en lettre (Correction V2).xlsm
    24.3 KB · Affichages: 14

patricktoulon

XLDnaute Barbatruc
re
bonsoir
houlah ...heu.... o_O
pour l'exemple je vais massacrer la syntaxe et je vais ajouter des espaces a gogo et des tirets a foison

t = "cent ---------- vingt quatre -- mille ---- sept - cent quatre -vingt -deux"
voila bien massacrée la chaîne ;):p:cool:

maintenant en une ligne je te la remet nikel!!!

t = Replace(Application.Trim(Replace(t, "-", " ")), " ", "-")

voyons voir dans le msgbox ;)

MsgBox t

pas compliqué non ?;)

magic!! ce application.trim hein ;)
 

laurent950

XLDnaute Accro
Bonjour Patrick,
Alors c'est Pa-Triste heu :p:p:p Pat-Trick... ce soir tu es un peux Pa-Traque... Hi Hi Hi... mais alors lorsque la magie opère avec :
t = Replace(Application.Trim(Replace(t, "-", " ")), " ", "-")
l'expression de besoin de NatachaM... est "le terme ''euros'' apparaît, je voudrais le supprimer" et donc par Magie il réaparaissent "le terme ''euros'' :p:p:p
C'est de la haute voltige :):):)
Laurent
Ps : C'est une pointe d'humour j'espère que vous le prenais bien, car je vous trouve super agréable :):)
 

patricktoulon

XLDnaute Barbatruc
re
rien compris o_O ;) :cool:

tiens

chaine bien pourrie

t = "cent ---------- vingt quatre -- mille ---- sept - cent quatre -vingt -deux euroeuros euros euros euros euros "

coup de baguette magique
t = Replace(Application.Trim(Replace(Trim(Replace(Replace(t, "euros", ""), "euro", "")), "-", " ")), " ", "-")

et le lapin sort de son chapeau ;)
MsgBox t


fonction
trim niveau debutant
replace niveau debutant
Application.Trim faut juste savoir qu'elle existe


Pa-Traque toi même :cool: :p ;)
 

laurent950

XLDnaute Accro
re patrick.

Tu as entièrement raison pour l'utilisation de trim et replace, j'aurais dû le voir c'est moi qui suis pa-Traque et toi tu es Ex-Traque :p :p :p

Ps : C'est un autre code plus propre (que j'ai trouvé Patrick) C'est pas de moi.
Regarde cette procédure avec le fichier ci-joint
la fonction est =NbEnLettres(B5) / en B5 =ALEA.ENTRE.BORNES(0;100000000000)
le resultat en cellule A5

et 3 possibilités :
'Au choix !
' Valeur finale Standard
'NbEnLettres = strResultat
' Valeur finale Tiret entre chaque mot
NbEnLettres = Replace(strResultat, " ", "-")
' Valeur finale sans aucun Tiret entre chaque mot
'NbEnLettres = Replace(strResultat, "-", " ")

Je joint le fichier Patrick.
 

Pièces jointes

  • Nombre en lettre (Correction V3).xlsm
    30.4 KB · Affichages: 10
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bon ben la je crois qu'on a perdu Laurent :p :cool: ;)
Capture.JPG
 

laurent950

XLDnaute Accro
Re j'ai corrigé :p:p
quarante-et-un-milliards-trois-cent-soixante-et-onze-millions-deux-cent-vingt-quatre-mille-cinq-cent-deux
41 371 224 502​
Version 4 Ligne de code désactivé (Je pense Trop !)

Version 5 Moins de ligne de code désactivé que la version 4 = Peut-être la meilleure !

Il faudrait voir et comprendre se code, pas très simple à digérer quand même :D:D
 

Pièces jointes

  • Nombre en lettre (Correction V4).xlsm
    29.4 KB · Affichages: 3
  • Nombre en lettre (Correction V5) sans vigule obtimisé.xlsm
    29.5 KB · Affichages: 6
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
c'est une purée d'usine a gaz ton truc
cherche bien tu devrais trouver la mienne dans les ressource

la fonction fait moins de 30 lignes ;) et je vais jusqu'a 999 décilliard

il serait facile d'y enlever la partie "euros " et de lui mettre les tirets partout ;)
 

patricktoulon

XLDnaute Barbatruc
re
VB:
'           *******************************************************************************************************
'           *                      <<<<convertion un nombre en toute lettre en fonction de la monnaie "Euro">>>>  *
'           *                                                                                                     *
'           * Auteur:patricktoulon pour exceldownload                                                             *
'           * Version:2.0                                                                                         *
'           * Date version:28/10/2019                                                                             *
'           * Old version Date 22/04/2013 sur developpez.com
'           * Methode compact par tranche de 3 caracteres numerique                                               *
'           * longueur maximale de chaine; 66 caracteres pour l'entier soit 999 décilliard .....                  *
'           *                                                                                                     *
'           * renvoie ""OutOFF(CAR*66)!!"" si la chaine est plus longue que 66 caracteres                         *
'           * renvoie ""Invalid Chaine!!"" n'est pas ou pas completement numerique                                *
'           *                                                                                                     *
'           *******************************************************************************************************

Option Explicit
Sub test()
    Debug.Print NblettreFR(380)
    Debug.Print NblettreFR(100)
    Debug.Print NblettreFR(1000)
    Debug.Print NblettreFR(1000000000#)
    Debug.Print NblettreFR(10020000000#)
    Debug.Print NblettreFR(1000000)
    Debug.Print NblettreFR(31000)
    Debug.Print NblettreFR(0)
    Debug.Print NblettreFR(371)
    Debug.Print NblettreFR(853)
    Debug.Print NblettreFR("191471851,56")
    Debug.Print NblettreFR(191471851.56)
    Debug.Print NblettreFR("135761973946357916972394685379,56")
End Sub
Sub test2()
   MsgBox NblettreFR("999994542365897698745632155546325698763218965423698745325698745288,10")

End Sub
Function NblettreFR(chain As String) As String
    Dim t, dixx&, dix&, cxx&, u&, Part, ms, m, Ul, Diz, n&, I&, seg$, cc$, et$, Ss$, R$, md$, euro$, centime
    Ul = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf", "cent ")
    Diz = Array("", "dix", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix", "cent")
    ms = Array("", " decilliard", " decillion", " nonilliard", " nonillion", " octillard", " octillion", " septilliard", " septillion", " sextilliard", " sextillion", " quintilliard ", " Quintillion", " quadrilliard", " quadrillion", " trilliard", " trillion", " Billiard", " billion", " milliard", " million", " mille", "")
    If LCase(chain) Like "*[a-z|:|;|/|\]*" Then NblettreFR = "Invalid Chaine!!": Exit Function
    Part = Split(chain, ","): If Len(Part(0)) > 66 Then NblettreFR = "OutOFF(CAR*66)!!": Exit Function
    euro = IIf(Val(Part(0)) > 999000 And Val(Right(Part(0), 6)) = 0, "d'euro", "euro") & IIf(Part(0) > 1, "s ", " ") & IIf(UBound(Part) > 0, "et ", "")
    centime = IIf(UBound(Part) > 0, "Centime", ""): If UBound(Part) > 0 Then If Part(1) = 0 Then Part = Array(Part(0)): centime = "": euro = Replace(euro, "et", "")
    For n = LBound(Part) To UBound(Part)
        t = Split(Trim(Format(String((300 - Len(Part(n))) Mod 3, "0") & Part(n), WorksheetFunction.Rept(" @@@", Len(String((300 - Len(Part(n))) Mod 3, "0") & Part(n)) / 3))))
        If n = 1 Then If Len(Part(1)) = 1 Then t = Array("0" & Part(1) & "0")    'ajustement centime(0.5 = 0.50)
        m = UBound(ms) - UBound(t)
        For I = LBound(t) To UBound(t)
            cxx = Left(t(I), 1): dixx = Right(t(I), 2): dix = Mid(t(I), 2, 1): u = Right(t(I), 1)
            If cxx = 1 Then cxx = 20: cc = "" Else cc = IIf(cxx > 0, " cent ", "")
            If dix = 9 Or dix = 7 Then dix = dix - 1: u = Val(u) + 10
            If dixx > 9 And dixx < 20 Then dix = 0: u = u + 10
            If dix >= 2 And dix <= 7 And (u = 1 Or u = 11) Then et = " et " Else et = IIf(dix <> 0 And u <> 0, "-", " ")
            If dixx = 80 Then Ss = "s" Else Ss = ""
            If I = UBound(t) - 1 And Part(0) = 1000 Then u = 0
            md = ms(m): If Val(t(I)) > 1 And I < UBound(t) - 1 Then md = md & "s"
            R = R & Application.Trim(Ul(cxx) & cc & Diz(dix) & et & Ul(u)) & Ss & IIf(Val(t(I)) > 0, md, "") & " "
            m = m + 1
        Next
        If Val(Part(0)) = 0 Then euro = ""
        R = R & IIf(n = 0, euro, centime): If n = 1 Then If Part(1) > 1 Then R = R & "s" & IIf(Part(0) = 0, " d'euro", "")
        If Trim(R) = "" Then R = ""
     Next n
    NblettreFR = Application.Trim(R)
End Function
 

laurent950

XLDnaute Accro
Il est super compact (Votre code patrick), je comprend enfin "je comprend que c'est très complex et surtout pensé", je sais lire le code en partie le code mais pas tout le code comme :
WorksheetFunction.Rept(" @@@", ici je connais pas " @@@",

C'est le sujet d'un autres poste, et je sais qu'il ne faut pas encombrer le fil inutilemement, cela dit encore une fois... je suis une 2CV :p :p:p et vous la bugatti veyron :D:D:D, mais j'apprend vraiment ici...

Enfin votre code est magnifique, et je solicite NatachaM à utilisé votre code et a utilisé votre code :):):)

Un très grand Merci pour ce nouveau partage Patrick et aussi merci pour accepter detemps en temps un peux d'humour sur le fil, vous êtes super agréable ca fait plaisir.

Ps : J'ai trouver cela sur le Support Office :
- https://support.office.com/fr-fr/ar...-en-mots-a0d166fb-e1ea-4090-95c8-69442cd55d98
Convertion de Nombre vers lettre en anglais US
Essaie non réussit pour Convertion de Nombre vers lettre en Francais FR
Fichier ci-joint

Laurent
 

Pièces jointes

  • Convertir Nombre en chiffre Office support.xlsm
    22.3 KB · Affichages: 9
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®oui compact !!!
;)mais pas pour la partie centimes ...
12782,983814925​
douze mille sept cent quatre-vingt-deux euros et neuf milliards huit cent trente-huit millions cent quarante-neuf mille deux cent cinquante et un Centimes
:cool:
petit ajout :
chain = Format(chain, "0.00")
12782,983814925​
douze mille sept cent quatre-vingt-deux euros et quatre-vingt-dix-huit Centimes

envisager possibilité de passer monnaie et décimales en arguments optional
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 413
Messages
2 088 199
Membres
103 764
dernier inscrit
nissassa