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

patricktoulon

XLDnaute Barbatruc
bonsoir
justement pour faire une conversion numérique seuls les traits d'union seront ton point de repère car en effet il n'en faut pas partout sauf pour une somme d'argent

perso je fait déjà très bien l'inverse ,mais là; ça demande quand même un petit algo
il va te falloir mettre les mains dans le cambuie

commence par faire des array de correspondance (lettre /chiffre)
peut etre auusi commencer par splitter le texte par les expressions de mesures (mille , million , milliard , etc....,)pour te créer des segment a analyser
t 'a du boulot ;)
 

laurent950

XLDnaute Accro
Bonsoir,
Peut être un petit algo en une seule ligne !

a rajouter a la fin de la procédure pour t
t = Replace(Left(Trim(t), Len(Trim(t)) - Len(Split(Trim(t), " ")(UBound(Split(Trim(t), " "))))), "-", " ")

soit :
VB:
' explication décomposition
't = t
'a = Trim(t)
'b = Len(Split(a, " ")(UBound(Split(a, " "))))
'c = Left(a, Len(a) - b)
'd = Replace(c, "-", " ")
' soit :
'd = Replace(c, "-", " ")
'c = Replace(Left(a, Len(a) - b), "-", " ")
'b = Replace(Left(a, Len(a) - Len(Split(a, " ")(UBound(Split(a, " "))))), "-", " ")
'a = Replace(Left(Trim(t), Len(Trim(t)) - Len(Split(Trim(t), " ")(UBound(Split(Trim(t), " "))))), "-", " ")
' donc :
t = Replace(Left(Trim(t), Len(Trim(t)) - Len(Split(Trim(t), " ")(UBound(Split(Trim(t), " "))))), "-", " ")
Laurent
 

Pièces jointes

  • Nombre en lettre (Correction).xlsm
    23.8 KB · Affichages: 21
Dernière édition:

patricktoulon

XLDnaute Barbatruc
regarde en bas dans le debug ;)

demo3.gif
 

patricktoulon

XLDnaute Barbatruc
terminé c'est au point ;)
demo3.gif


reste à la faire en fonction avec le recall (recursif)pour les décimales et voila
;)
comme çà a froid en rentrant du boulot :p:cool:

le principe est tres simple
ramener l'orthographe niveau maternelle ;)
c'est a dire supprimer toutes les mot et caracteres qui n'ont rien a voir avec les nombre

donc ceci
quatre-vingt-dix-huit milliards sept cent soixante-six millions cinq cent quarante-huit mille trois cent quatre-vingt-un Euros

DONNE CELA
vingt neuf|quatre cent trente cinq|deux cent quarante cinq|cent quarante un
j'ai donc supprimer les mesures traits d'union , les "s", et tout le toutim
a la place des mesures je met"|"

je split la chaine obtenue par les "|" et j'ai donc chaque segment en lettre

avec ces 2 arrays et quelques petits matchs le tour est joué

les deux array

VB:
   x = [A5] 'la valeur a convertir
 lettres = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", _
                    "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", _
                    "dix-huit", "dix-neuf", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante dix", "quatre vingt", "quatre vingt dix", "cent")
  
    chiffre = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, "*100")
    unitm = Array("milliard", "million", "mille")
    For i = 0 To UBound(unitm)
        x = Replace(Replace(Replace(x, unitm(i) & "s", "|"), unitm(i), "|"), "-", " ")
    Next
tu devrais deviner facilement la suite ;)

pou le coup c'est vraiment simple (beaucoup plus que l'inverse)
 

laurent950

XLDnaute Accro
j'aimerais aussi apprendre la recursivité, et je ne sais pas dans qu'elle cas l'appliquer, si vous avez un petit exemple simple et concret pour que je comprenne le pricncipe, j'en serais ravis.

j'ai décripté et déchifré votre méthode, pas si simple pour moi, mais J'ai compris le principe et je n'aurais jamais eu cette idée, c'est génial.
un grand merci car franchement c'est un super niveau.
laurent
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
la récursivité c'est la fonction elle meme qui se recall

un exemple comme ça a l'arrache

VB:
Sub test()
MsgBox maRecursivFonction
End Sub

Function maRecursivFonction(Optional x = 0, Optional resultat As Long = 0)
resultat = resultat + 1
x = x + 1
If x < 10 Then maRecursivFonction x, resultat
maRecursivFonction = resultat
End Function
en gros au lieu de faire une boucle de 10 dans la fonction c'est la fonction qui s'auto appelle 10 fois
et a chaque fois les argument x et resultat sont injecter et mis a jour
quand elle a fini de s'auto appeler elle rend la main a la sub qui l'a appeler la premiere fois
comme elle est égale a resultat ben .......t 'a le résultat dans le msgbox

rigolo non ? ;)
 

laurent950

XLDnaute Accro
Super j'ai compris c'est super, c'est se qui sert lorsque l'on fait des tri quicksort par exemple ont utilise la recurcivité. j'ai déjà vu cela.

j'ai compris le principe c'est validé pour moi.

Optional = C'est lorsqu'il y a pas d'argument lorsque l'on envoit vers
1 ) une fonction "function" = Vrai ou Faux
2) une Procedure "Sub" = Vrai ou Faux

Autre question cela sert a quoi : Optional x = 0 (= 0 pourquoi le signe = et une valeur)

Autres question
Optional x = 0, Optional resultat As Long = 0
il y a le signe = avec Optional est obligatoire = Vrai ou faux ?


VB:
Sub test()
MsgBox maRecursivFonction
End Sub

Autres question : je peux écrire comme cela 
ou c'est comme cela qu'il faut l'écrire
Function maRecursivFonction(Optional x As Byte = 0, Optional resultat As Long = 0)
si je l'écris comme cela c'est faut ?
Function maRecursivFonction(Optional x As Byte, Optional resultat As Long)

Il y a une différence = si oui laqu'elle ?

Function maRecursivFonction(Optional x As Byte, Optional resultat As Long)
resultat = resultat + 1
x = x + 1
If x < 10 Then maRecursivFonction x, resultat
maRecursivFonction = resultat
End Function

Toujours un grand Merci Patrick
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
optional est ce qu'il veut dire optionel tu le met ou pas
tu constatera que dans l'apel je le met pas j'apelle la fonction sans arguments
dans l'appel de la sub
MsgBox maRecursivFonction 'pas d'arguments

par contre dans le recall DANS !!! la fonction!!!! les arguments sont réinjectés pour qu'il soit mis a jour sinon bien évidement il reste a zero

If x < 10 Then maRecursivFonction x, resultat

après il y a bien d'autre subtilité avec la récursivité
presque cet exemple ne veut rien dire c’était juste pour te montrer le principe
 

laurent950

XLDnaute Accro
J'ai compris
tu initialises les variables
Function maRecursivFonction(Optional x As Byte = 0, Optional resultat As Long = 0)

et donc
tu initialises compris
Optional (C'est l'option avec ou sans resultat) x (c'est la valeur) As Byte (le type) = 0 (la valeur en relation avec le type)

c'est comme si :

sub test
dim x as byte
x = 0 ' ............................................ mais tu aurais pu dire x = 100
dim resultat as long
resultat = 0 ' ............................... Comme resultat = 25

J'ai compris top

end sub
 

patricktoulon

XLDnaute Barbatruc
oui si tu veux une fonction et non un Sub est sensé te retourner une valeur ou un object

ca
resultat = 25

ca donne la même chose que

resultat = mafonction

function mafonction ()
mafonction=25
end function
mais la on s’égare on pollue le post de natacha ;)
ouvre un post si tu a des questions ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 418
Messages
2 088 256
Membres
103 793
dernier inscrit
letocost