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

Macros et VBA Excel Discussion :

conversion d'une somme en lettre et chiffre [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2013
    Messages : 110
    Points : 63
    Points
    63
    Par défaut conversion d'une somme en lettre et chiffre
    salut tout le monde
    je suis coincé. je cherche un code VBA ou une formule excel pour convertir une somme à la fois en lettre et chiffre.
    voici un exemple : la somme de 204 DIRHAMS 18 CENTIMES
    Je voudrais que cette somme soit convertie de cette façon :
    deux cents quatre dirhams et 18 centimes.
    merci pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 587
    Points : 34 258
    Points
    34 258
    Par défaut
    Salut,


    on a traite le sujet des transformations des nombre de chiffres en lettres ici :

    http://access.developpez.com/sources...ffresEnLettres

    un peu d'huile de cerveau et ca devrait pouvoir s'adapter facilement a ton cas de figure
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    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 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    Bonsoir on a trazité ce sujet il y a pas longtemps encore

    l'exercice était de réduire les usines a gaz connues afin d'avoir un code compact et solide

    ma version traite l'euro mais il sera facile d'adapter cela au dirham
    et elle est utilisable en tant que fonction dans les cellules

    fonction:
    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
    27
    28
    Function nombre_en_lettre5(nombre As String, 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
        Dim decs As Long, ddd As String, ms, cms As Long, h As Long, ds As Long, et As String
        nombre = Replace(nombre, ".", ","): 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 < 9 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, IIf(a = " mille", "", "s"), IIf(u = 0, "", "-"))), "")
                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
    exemple
    formule a mettre dans une cellule pour tester
    =nombre_en_lettre5("12365.68")
    a la place du nombre tu peut mettre une cellule avec une condition si elle est pleine

    exemple
    =SI(A13=0;" ";nombre_en_lettre5(A13))
    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. #4
    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 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour grizan

    sinon il y a ma petite dernière qui arrondi a 2 chiffres après la virgule en arrondissant au supérieur avec ma méthode dite globale dans une fonction récursive

    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
    27
    28
    29
    30
    31
    32
    33
    34
    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 Or u = 0 Then et = "" Else et = "-"  ' on accorde de 1 a 99
     
     
                If u = 0 Then If dix = 8 Then If ms(a) = " mille" Then et = "" Else et = "s"     '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
                If nombre = 1 And i = 1 And a = cms - 1 Then u = 0
                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
    Sub tes2()
        MsgBox nBlettre_methode_globale(256354.2153)
    End Sub
    elle est beaucoup moins compliqué en terme de lisibilité de code
    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

  5. #5
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2013
    Messages : 110
    Points : 63
    Points
    63
    Par défaut
    salut tout le monde
    je me debats toujours
    je n'arrive pas à m'en sortir car je suis novice en VBA
    pouvez vous modifier ma piece jointe
    merci pour votre aide

  6. #6
    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
    eh bien, tu l'as ou j'ai la berlue

    Nom : BEN TU L'AS.JPG
Affichages : 3771
Taille : 53,8 Ko
    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...)

  7. #7
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2013
    Messages : 110
    Points : 63
    Points
    63
    Par défaut
    salut casefayere
    la formule en question affiche la somme en lettre
    par contre moi je voudrais qu'elle affiche une partie de la somme en lettre et l'autre partie en chiffre
    comme suit
    deux cent quatre dirhams et 18 centimes

  8. #8
    Membre expert

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 564
    Points : 3 554
    Points
    3 554
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Ecrire en C26 la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =chiffrelettre(ENT($I$23))&" et "&ENT(100*MOD($I$23;1))&" centimes"
    Cordialement
    Claude

  9. #9
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2013
    Messages : 110
    Points : 63
    Points
    63
    Par défaut
    merci à papouclo

  10. #10
    Membre confirmé Avatar de grisan29
    Homme Profil pro
    ouvrier poseur
    Inscrit en
    Octobre 2006
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ouvrier poseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 866
    Points : 520
    Points
    520
    Par défaut
    bonsoir PatrickToulon

    très bien ta fonction mais si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, " et ", "centimes")
    pour avoir et "et" a la place de "virgule" et c'est très bien
    la seule chose est que si je veux un espace entre "et" et "centimes" je ne peux pas l'écrire comme ceci sans bug avec un nombre d'arguments incorrect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, " et ", " ", "centimes")
    j'ai essayer le code du post3 et celui la est parfait mais le calcul n'est pas correct si le nombre a plus de 2 chiffres après virgule l'arrondi n'est compté
    Pièce jointe 215593

    Pascal

  11. #11
    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 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    allons grizan un peu de reflection

    le iif sert a mettre "virgule"ou rien selon "e" qui represente l'etape des entier pour 0 et 1 pour les décimales tu ne peut donc pas mettre "centimes" dans les guillemts vides
    puisqu'il faut tout faire voila fin de la fonction comme tu le souhaite ca m'a pris 15 secondes !!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, " euros et ", "") & IIf(e = 1, "  centimes", "")
        Next e
    End Function
    la condition rouge sert a mettre virgule ,euros ou tout ce que tu veux si decs=1 et e est encore a zéro
    la condition verte que je viens d'ajouter sert a jouter les centimes si e=1 ca veut dire que la boucle a tourner 2 fois la 2 eme pour les chiffres après la virgule

    on pourrais ajouter aussi l'accords comme dans l'autre
    le "de ou "d'" d'euros ou de dirham etc....
    exemple
    un million d'euros et 23 centimes
    un million de dirham et 23 centimes

    pas compliqué non de dieu
    j'ai passer plus de 7 jours a les mettre au points ces fonctions afin que l'orthographe (accent ,trait d'union , les pluriels ,etc....) satis face le plus grand nombre et toi tu me colle cette
    question
    change la ligne originale pour celle qui est en couleur et tout ira bien

    edit tien regarde cette version de la ligne j'accorde le s a euros si pas de décimales sinon coup de bluff "euro" sans le "s" sert a euro cent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, " euros et ", " euro") & IIf(e = 0 And decs = 0, "s", "") & IIf(e = 1, "cent", "")
    voila voila

    test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub tes2()
        MsgBox nBlettre_methode_globale(524153256354.2153)
     
    MsgBox nBlettre_methode_globale(698745236256354)
    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

  12. #12
    Membre confirmé Avatar de grisan29
    Homme Profil pro
    ouvrier poseur
    Inscrit en
    Octobre 2006
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ouvrier poseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 866
    Points : 520
    Points
    520
    Par défaut
    bonjour PatrickToulon
    Merci de tes réponses qui correspondent bien

    je vais laisser le post a atlaslion tranquille, car depuis bientôt 3 ans, je vois que l'offre que m'avais fait gentiment BlueMonkey n'est pas encore digérée, et pourtant depuis de l'eau a couler

    Pascal

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Changer une série de lettres en chiffres
    Par hominidae dans le forum MATLAB
    Réponses: 4
    Dernier message: 10/11/2015, 10h14
  2. Conversion d'une date en texte et chiffre
    Par Zandes dans le forum Cobol
    Réponses: 7
    Dernier message: 11/01/2012, 07h02
  3. convertir une somme en lettres
    Par popofpopof dans le forum Word
    Réponses: 38
    Dernier message: 07/08/2008, 16h01
  4. Réponses: 3
    Dernier message: 26/09/2006, 12h33

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