IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

chiffres en lettres vraie fonction


Sujet :

Contribuez

  1. #21
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour casefayere comme promis je te livre la version finale

    un orthographe parfait et jusqu'à 999 sextillions.....
    utilisation seulement de 2 array pour les nombre de 1 a 19 et 10 a 90
    un 3 array pour les expressions (mille,million etc...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Function nombre_en_lettre5(nombre, Optional sstr As String = " euro", Optional sstr2 As String = " centime")
        Dim i As Long, unit1, unit10, tablo, e_dec(2), e As Long, u As Long, d As Long, c As Long, ct As String, cs As String, etE As String, a As String, decs As Long, ddd As String, ms, cms As Long, h As Long, ds As Long, et As String
        e_dec(0) = Split(nombre, ",")(0): e_dec(0) = Split(Trim(Format(e_dec(0), Application.Rept(" @@@", 20))), " ")
        If InStr(nombre, ",") > 0 Then e_dec(1) = Left(Split(nombre, ",")(1), 2): e_dec(1) = Split(Trim(Format(e_dec(1), Application.Rept(" @@@", 20))), " "): decs = 1
         etE = IIf(decs > 0, " et", ""): ddd = IIf(Val(Join(e_dec(0))) > 999000 And Right(Join(e_dec(0)), 6) = 0, IIf(sstr = " dollar", " de", " d'"), "")
        unit1 = Array("", " Un", " Deux", " Trois", " Quatre", " Cinq", " Six", " Sept", " Huit", " Neuf", " Dix", " Onze", " Douze", " treize", " Quatorze", " Quinze", " Seize", " Dix-Sept", " Dix-Huit", " Dix-Neuf", " cent", " zero")
        unit10 = Array("", " dix", " vingt", " trente", " quarante", " cinquante", " soixante", " soixante-dix", " quatre-vingt", " quatre-vingt-dix", " cent")
        ms = Array("", " sextillion", " Quintillion", " Quatrillion", " Trillion", " Billiard", " Billion", " milliard", " million", " mille", ""): cms = UBound(ms)
        For e = 0 To decs
            tablo = e_dec(e): h = UBound(tablo)
            For i = 0 To h
                If e = 1 And i = h Then tablo(i) = "000" & Left(tablo(i), 2)
                a = ms(cms - (h - i)): a = IIf(tablo(i) = 0 And i < h, "", a): a = IIf(tablo(i) > 1 And i < h - 1 And a <> " mille", a & "s", a)
                tablo(i) = IIf(e = 0, Right("000" & tablo(i), 3), Mid(tablo(i) & "0", 3, 3)): d = (tablo(i) Mod 100)
                c = Mid(tablo(i), 1, 1): c = IIf(c = 1, 20, c): ct = IIf(c < 20 And c > 1, " cent", ""): ct = IIf(tablo(i) Mod 100 = 0 And c <> 20 And c > 1, ct & "s", ct)
                cs = IIf(e > 0 And tablo(0) > 1, "s", ""): ds = Mid(Right(tablo(i), 2), 1, 1): u = Right(tablo(i), 1)
                u = IIf(Val(tablo(i)) = 1 And a = " mille", 0, u): u = IIf(tablo(i) = 0 And i = 0, 21, u)
                If d > 10 And d < 20 Or d > 70 And d < 80 Or d > 90 Then u = Val(Right(d, 1)) + 10: ds = Left(d, 1) - 1    'on calcul ds et u par le resultat du mod 100
                et = IIf(ds > 1 And ds < 9, IIf(Right(u, 1) = 1, IIf(ds = 8, "-", " et"), IIf(d Mod 10 = 0 And ds = 8, "s", "-")), "")
                et = IIf(ds > 1 And ds < 7 And d Mod 10 = 0 And et = "-", "", et)
                If Join(e_dec(0)) = 0 And e = 0 Then sstr = "": etE = "": u = 0
                nombre_en_lettre5 = nombre_en_lettre5 & unit1((c)) & ct & unit10(ds) & et & unit1(u) & a
            Next
            nombre_en_lettre5 = Replace(nombre_en_lettre5 & IIf(e = 0, ddd & sstr & IIf(Int(nombre) > 1, "s", "") & etE, sstr2 & cs), "- ", "-")
        Next
    End Function
    et pour tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
        Debug.Print nombre_en_lettre5("5632145623,43", " euro", " centime")
        Debug.Print nombre_en_lettre5("1", " dollar", " cent")
        Debug.Print nombre_en_lettre5("1", " euro", " centime")
     
    Debug.Print nombre_en_lettre5("999214542145245164352465854265,2", " dollar", " cent")
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #22
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour Patrick
    Je te remercie et te félicite pour ton boulot et ta ténacité, d'autant que j'ai suivi le feuilleton sur le forum "Macros et Vba"
    Bonne journée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #23
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    merci a toi aussi Bonne journée

    on a fait un remake de Dallas un univers impitoyable
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #24
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    @Patrick
    70000

    soixante-dix-mille
    soixante-dix-euros


    Un tiret de plus
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #25
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    et c'est comme ca pour chaque dizaine? j'ai surfer un peu et parfois non???

    est ce que soixante-dix-huit-mille est correct parce que c'a m'enlève encore une ligne
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #26
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Tu as un tiret systématique après soixante-dix

    soixante-dix-machin
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #27
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oui mais les autre dizaines ?
    et puis c'est a 90% le contraire partout ou je fouine même le conjugueur

    vous allez me rendre dingue et dire que je les avais supprimer au milieu de ma discussion
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #28
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    On ne dit pas soixante-dix-euro(s) quand même. On écrit soixante-dix euro(s)
    On ne dit pas soixante-dix-mille quand même. On écrit soixante-dix mille
    On ne dit pas soixante-dix-millions quand même. On écrit soixante-dix millions

    http://leconjugueur.lefigaro.fr/nombre/70000.html

    Et alors?
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #29
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    a oui quand tu disais en plus tu signalais l'erreur
    je suis surpris je ne l'avais pas avant
    corrigé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    et = IIf(ds > 1 And ds < 9, IIf(Right(u, 1) = 1, IIf(ds = 8, "-", " et"), IIf(d Mod 10 = 0 And ds = 8, "s", IIf(u = 0, "", "-"))), "")
    sinon vous avez la méthode globale avec des if simples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Function nBlettre_methode_globale(nombres As String)
        Dim en_dec(2)
        unit1 = Array("", " Un", " Deux", " Trois", " Quatre", " Cinq", " Six", " Sept", " Huit", " Neuf", " Dix", " Onze", " Douze", " treize", " Quatorze", " Quinze", " Seize", " Dix-Sept", " Dix-Huit", " Dix-Neuf", " cent", " zéro")
        unit10 = Array("", " dix", " vingt", " trente", " quarante", " cinquante", " soixante", " soixante-dix", " quatre-vingt", " quatre-vingt-dix", " cent")
        ms = Array("", " sextillion", " Quintillion", " Quatrillion", " Trillion", " Billiard", " Billion", " milliard", " million", " mille", ""): cms = UBound(ms)
        decs = 0: nombres = Replace(nombres, ".", ","): en_dec(0) = Split(nombres, ",")(0): If InStr(nombres, ",") > 0 Then en_dec(1) = Split(nombres, ",")(1): decs = 1    'on separe le decimal de l'entier
        If Len(en_dec(0)) Mod 3 <> 0 Then en_dec(0) = Application.Rept("0", 3 - Len(en_dec(0)) Mod 3) & en_dec(0)    'on formate l'entier a 3 chiffre par tranche
        If decs = 1 Then en_dec(1) = Right("00" & Round(Val("0." & en_dec(1)), 2) * 100, 3)  ' NOUVELLE METHODE POUR ADAPTER LE DECIMAL on formate a 3 chiffres
        ex = cms - (Len(en_dec(0)) / 3) + 1    ' index de point de depart des expressions dans l'array ms
        For e = 0 To decs
            For i = 1 To Len(en_dec(e)) Step 3
                a = ex + Round(i / 3)    'position actuelle de ms
                nombre = Mid(en_dec(e), i, 3)    ' la tranche
                dix = Mid(nombre, 2, 1): u = Right(nombre, 1): c = Left(nombre, 1): If c > 1 Then c = c: ct = unit1(20) & IIf(Val(dix & u) > 0, "", "s") Else: ct = "": If c = 1 Then c = 20
                If dix = 1 Or dix = 7 Or dix = 9 And Right(u, 1) > 0 Then dix = dix - 1: u = u + 10   'on corrige le 1,7,9
                If dix > 1 And dix <> 8 And Right(u, 1) = 1 Then et = " et" Else If dix = 0 Then et = "" Else et = "-"    ' on accorde de 1 a 99
                If u = 0 Then If dix = 8 Then et = "s" Else et = ""    'le s a quatre-vingt tout seul
                If nombre = 0 And Len(en_dec(0)) = 3 Then u = 21: dix = 0    ' le zéro si l'entier vaut 0 tout simplement
                If nombre = 0 And i <> 1 Then a = 0 ' on est pas au debut  et que nombre = 0 on met pas l'expression 
                If nombre = 1 And i = 1 And ms(a) = " mille" Then u = 0'si au debut on un mille on met pas le un 
                If e = 0 And nombre > 1 And a < cms - 1 Then ss = "s" Else ss = ""
                nBlettre_methode_globale = nBlettre_methode_globale & Replace(unit1(c) & ct & unit10(dix) & et & unit1(u), "- ", "-") & IIf(e = 0, ms(a), "") & ss
            Next i
            nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, " virgule", "")
        Next e
    End Function
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #30
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Autre chose:

    quatre-vingt mille
    quatre-vingts millions
    quatre-vingts milliards
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #31
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Mercatog

    correction dans la version iif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    et = IIf(ds > 1 And ds < 9, IIf(Right(u, 1) = 1, IIf(ds = 8, "-", " et"), IIf(d Mod 10 = 0 And ds = 8, IIf(a = " mille", "", "s"), IIf(u = 0, "", "-"))), "")
    correction dans la version if simple méthode globale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If u = 0 Then If dix = 8 Then If ms(a) = " mille" Then et = "" Else et = "s"     'le s a quatre-vingt tout seul
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. [AC-2010] Incrémentation automatique sur chiffre ou lettre en fonction d'un critère
    Par MelaAllIn dans le forum VBA Access
    Réponses: 3
    Dernier message: 27/08/2015, 14h17
  2. [CR XI] Fonction de conversion de chiffre en lettre
    Par GodGives dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 18/05/2009, 19h46
  3. Fonction convertissant les chiffres en lettres
    Par damene dans le forum Débuter
    Réponses: 1
    Dernier message: 04/04/2008, 13h32
  4. Réponses: 1
    Dernier message: 30/05/2007, 18h19
  5. pl/sql fonction de conversion de chiffres en lettres
    Par sawasbanikh dans le forum PL/SQL
    Réponses: 1
    Dernier message: 18/04/2007, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo