Autres evaluate qui donne une erreur en dynamique et bonne encodé en dur

patricktoulon

XLDnaute Barbatruc
bonsoir a tous
j'ai un petit soucis avec evaluate
il me donne une erreur codé en dynamique et me donne le resultat ecrit en dur

VB:
Option Explicit

Sub test()
    Dim x$

    x = "cent mille"
    MsgBox NbLettreToNumeric(x)

    x = "un million"
    MsgBox NbLettreToNumeric(x)

    x = "neuf cent soixante six milliards cinq cent soixante-neuf millions six cent cinquante-cinq mille quatre cent dix-huit Euros "
    MsgBox NbLettreToNumeric(x)
End Sub

Function NbLettreToNumeric(x As String)

    Dim Lettres, Chiffre, unitM, Multipl, i&, Segments, m&, s$, ch, c&, ind&, z#, texte$, tb

    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", _
                    "mille", "million", "milliard", "mille", "millions", "milliards")

    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", "*1000|", "*1000000|", "*1000000000|", "*1000|", "*1000000|", "*1000000000|")

    x = Replace(Replace(x, " et ", " "), "d'", " ")
    x = Replace(Replace(x, "Euros", ""), "Euro", "")
    x = Replace(x, "-", " ")

    ch = Split(Application.Trim(x), " ")
    For c = LBound(ch) To UBound(ch)
        ind = WorksheetFunction.Match(ch(c), Lettres, 0) - 1
        s = Trim(s) & " " & Chiffre(ind) & "+"
        s = Replace(s, "+ *", "*")

        s = IIf(Left(s, 1) = "*", 1 & s, s)
    Next c
    s = s & "0"
    tb = Split(s, "|")
    For i = 0 To UBound(tb)
        texte = texte & "(" & Replace(tb(i), "*1000", ")*1000") & "+"
        texte = Replace(Replace(texte, "+ )", ")"), "(+", "(")
    Next
    'NbLettreToNumeric = Evaluate(texte)

    Debug.Print Replace(texte, " ", "") & "0)"

    Debug.Print Evaluate(Replace(texte, " ", ""))
    Debug.Print "---------------------------------------------"

End Function

'pour tant ici ca match '
Sub test2()
    MsgBox Evaluate("(9*100+ 60+ 6)*1000000000+( 5*100+ 60+ 9)*1000000+( 6*100+ 50+ 5)*1000+( 4*100+ 10+ 8+0+0)")
End Sub
des idées??? ;)
 
Solution
1580032428991.png


Patrick essayé cette correction ici de votre code poste #7
1580033013072.png


resultat :
1580033860391.png

laurent950

XLDnaute Accro
Bonjour Patrick, Modeste geede, sylvanus, le forum.

Alors je suis vraiment content d'avoir pu avoir trouver cette solution c'était Pas-Triste :p :p Heureusement avec les images c'est plus clair :D:D:D ... ha ha ha Modeste geedee... je suis un débutant qui apprend vite :p:p:p

Merci à vous tous pour votre partage de toutes vos connaissances sur ce forum magique est Excel-Ent :D:D:D

Laurent
 

eriiic

XLDnaute Barbatruc
Bonjour,

par tranche oui mais va traduire les tranches de "un million" toiavec ton split ca donne "cent |"
Effectivement, j'avais apporté une correction que je devais appliquer à 2 endroits et j'en ai oublié un.
Et comme je n'avais testé que la chaine la plus longue...
Correction :
VB:
Function NbLettreToNumeric(x As String)
    Dim puissance, i As Long, ch
    puissance = Array("milliard", "million", "mille")
    '...
    x = Replace(Replace(x, " et ", " "), "d'", " ")
    x = Replace(Replace(x, "Euros", ""), "Euro", "")
    x = Replace(x, "-", " ")
    ' insérer puissances absentes
    For i = 0 To UBound(puissance)
        x = Replace(x, puissance(i) & "s", puissance(i)) ' supp pluriels
        If InStr(x, puissance(i)) = 0 Then
            If i = 0 Then x = puissance(i) & x Else x = Replace(x, puissance(i - 1), puissance(i - 1) & " " & puissance(i))
        End If
    Next i
    For i = 0 To UBound(puissance)
        x = Replace(x, puissance(i), "|")
    Next i
    ch = Split(x, "|")
    For i = 0 To UBound(ch)
        'traiter des nombres de 0 à 999 à formater "000"
    Next i
    ' concaténer résultat
End Function

"cent mille" donne bien maintenant : "| |cent |"
et
"neuf cent soixante six milliards six cent cinquante-cinq mille quatre cent dix-huit Euros " donne
"neuf cent soixante six | | six cent cinquante cinq | quatre cent dix huit "
(j'ai supprimé les millions pour créer une absence)
avec milliards, millions, milles et unités à leur place

La tienne du post #12 est plus courte certes, mais retourne un peu n'importe quoi ;-)
Perso je ne suis pas un adepte du compactage à outrance, je préfère la lisibilité.
eric
 

laurent950

XLDnaute Accro
Comment gérer ce cas Patrick !

L'adjectif numéral « mille » est invariable : Ma tante Fernande m'a légué dix mille euros. En revanche, le nom « mille », unité de mesure internationale pour les distances en navigation aérienne et maritime, prend un « s » au pluriel : Le navire se trouve à dix milles de la côte la plus proche !
 

Discussions similaires

Statistiques des forums

Discussions
312 080
Messages
2 085 144
Membres
102 793
dernier inscrit
volfy