Convertir un nombre en lettres

Temps de lecture : 3 minutes

Convertir un nombre en lettres

Pour convertir un nombre en mots, la solution passait toujours par la création d'une macro VBA très complexe. Certains sites, comme celui-ci, vous propose un exemple de code à utiliser mais selon les règles grammaticales des pays, le code devait toujours être adapté ; ce qui n'est pas facile et source d'erreurs.

Maintenant, avec Excel 365 et la nouvelle fonction LET, vous pouvez convertir un nombre en mots. La formule est très complexe et a nécessité beaucoup de temps pour son développement. Mais malgré cela, il y a certains points de la formule qui doivent être analysés avant de pouvoir l'utiliser.

Convertir Nombre en Lettres

Caractéristique de la formule

Avant de recopier la formule complète et de l'appliquer à votre classeur, il est important d'analyser certains points qui pourraient être cause de disfonctionnement.

Principe des matrices dans Excel

Excel 365 est la seule version qui sache interpréter les plages matricielles dynamiques (c'est -à-dire retourner le résultat dans plusieurs cellules).

Une matrice de plusieurs valeurs s'écrit toujours entre accolades, mais une matrice peut s'écrire en ligne ou en colonne selon le type de séparateur que vous utilisez.

Par exemple, en configuration française,

  • le séparateur pour les colonnes c'est le point.
  • le séparateur pour les lignes c'est le point-virgule.
Matrice en configuration France

Mais si votre système est configuré dans un autre pays, il est fort possible que le séparateur en ligne ne soit pas le point mais l'anti-slash (\) ou simplement la virgule (,) comme c'est le cas en configuration US.

Cette configuration est liée aux paramètres de votre ordinateur.

Séparateur de décimales

L'une des complexités de l'écriture de cette formule c'est qu'elle est capable d'interpréter les chiffres avec décimales et les chiffres sans.

L'astuce réside dans cette partie de la formule.

N; SUBSTITUE(TEXTE(A1; REPT(0;9)&",00" );",";"0")

Sans trop rentrer dans le détail de cette formule, ce qu'il faut constater c'est que nous avons 2 fois le symbole décimale virgule d'écrit.

  • ,00.
  • et le symbole de remplacement de la fonction SUBSTITUE à la fin ",";"0".

Si vous travaillez avec le séparateur de décimales point (.) il vous faudra remplacer ces 2 virgules par un point dans la fonction.

N; SUBSTITUE(TEXTE(A1; REPT(0;9)&".00" );".";"0")

Ecrire Euros/Centimes ou rien

Telle que la formule est écrite, elle va toujours rajouter Euros à la fin d'un nombre et centimes si le nombre comporte des décimales.

Denom; {" million ";" mille ";" Euros ";" Centimes"}

Maintenant, si vous ne souhaitez pas afficher les mots Euros et Centimes, il faut simplement effacer ces mots MAIS EN CONSERVANT les guillemets vides pour respecter le nombre d'occurrences dans la matrice.

Denom; {" million ";" mille ";"";""}

Formule pour convertir un nombre en lettres (France)

Pour combiner les différentes parties dans une seule et même formule, nous devons utiliser la fonction LET.

La formule complète est la suivante :

=LET(
Denom; {" million ";" mille ";" Euro ";" Centimes"};
Nums; {""."Un"."Deux"."Trois"."Quatre"."Cinq"."Six"."Sept"."Huit"."Neuf"};
Teens; {"Dix"."Onze"."Douze"."Treize"."Quatorze"."Quinze"."Seize"."Dix-sept"."Dix-huit"."Dix-neuf"};
Tens; {""."Dix"."Vingt"." Trente"." Quarante"."Cinquante"."Soixante"." Soixante"."Quatre-vingt"."Quatre-vingt"};
grp; {0;1;2;3};
LET(
N; SUBSTITUE( TEXTE( A1; REPT(0;9)&",00" );",";"0");
H; CNUM( STXT( N; 3*grp+1; 1) ); T; CNUM( STXT( N; 3*grp+2; 1) );
U; CNUM( STXT( N; 3*grp+3; 1) );
Htxt; SI( H; SI(H>1; INDEX( Nums; H+1 ) & " cent "; "cent " ); "");
Ttxt; SI( T>1; INDEX( Tens; T+1 ) & SI( U>0; " "; "" ); " " );
Utxt; SI((T+U); SI((T=1)+(T=7)+(T=9); INDEX(Teens;U+1 );INDEX(Nums;U+1)));
SUPPRESPACE(SUBSTITUE(NOMPROPRE(CONCAT( SI( H+T+U; Htxt & Ttxt & Utxt & Denom; "" )));"Un Mille";"Mille"))
))

P.S : 3 Excel MVP et 6 jours de développement pour obtenir ce résultat 😉

Formule pour convertir un nombre en lettres (Belgique et Suisse)

Ces 2 pays n'utilisent pas soixante-dix et quatre-vingt-dix donc la formule doit être adaptée. Par contre, les Suisses n'utilisent pas non plus le quatre-vingt mais huitante ou octante. Il suffit juste de corriger cette information dans la formule suivante dans la ligne Tens.

=LET(
Denom, {" million ";" mille ";" Euro ";" Centimes"},
Nums, {"","Un","Deux","Trois","Quatre","Cinq","Six","Sept","Huit","Neuf"},
Teens, {"Dix","Onze","Douze","Treize","Quatorze","Quinze","Seize","Dix-sept","Dix-huit","Dix-neuf"},
Tens, {"","Dix","Vingt"," Trente"," Quarante","Cinquante","Soixante"," Septante","Quatre-vingt","Nonante"},
grp, {0;1;2;3},
LET(
N, SUBSTITUTE( TEXT( A1, REPT(0,9)&",00" ),",","0"),
H, VALUE( MID( N, 3*grp+1, 1) ), T, VALUE( MID( N, 3*grp+2, 1) ),
U, VALUE( MID( N, 3*grp+3, 1) ),
Htxt, IF( H, IF(H>1, INDEX( Nums, H+1 ) & " cent ", "cent " ), ""),
Ttxt, IF( T>1, INDEX( Tens, T+1 ) & IF( U>0, " ", "" ), " " ),
Utxt, IF((T+U), IF(T=1, INDEX(Teens,U+1 ),INDEX(Nums,U+1))),
TRIM(SUBSTITUTE(PROPER(CONCAT( IF( H+T+U, Htxt & Ttxt & Utxt & Denom, "" ))),"Un Mille","Mille"))
))

Vous trouverez des informations complémentaires sur la fonction LET sur le site de Microsoft.

29 Comments

  1. Pierrick
    17/05/2022 @ 14:52

    Merci pour ce partage.
    Est-ce quelqu'un aurait fait les adaptations pour respecter les règles d'accord des nombres en français ?

    Reply

  2. FUCHY Pierre
    29/03/2022 @ 14:08

    Bonjour!
    Assez nul et vieux, j'ai Excel 365. J'ai tout bêtement copié la formule France et collé dans B1, après avoir mis un nombre dans A1. Le miracle ne s'est pas produit.
    La formule s'est collée en 15 cellules de B1 à B15, et pas de message d'erreur.
    J'ai tenté de passer par word pour tout coller dans la même cellule: toujours pas bon.
    Problème d'espaces, ou autre chose tellement évidente que vous n'en parlez pas?
    Ou bien quoi, je n'ai pas le niveau?
    Si vous pouvez me répondre, merci d'avance.
    Pierre

    Reply

  3. SB
    06/11/2021 @ 08:35

    Hello,
    génialissime !
    Mais... si je mets 10 000,05 € ou 10 000, j'ai pas le "Euro" et d'ailleurs ça devrait être "Euros" avec un s...
    Bravo,
    SB

    Reply

    • Frédéric LE GUEN
      07/11/2021 @ 15:06

      Oui, exact, c'est à cause des 3 valeurs des unités qui sont à 0 donc 0 * 'euro' ne renvoie rien.

      Reply

      • hamidi
        01/12/2021 @ 20:41

        Bonjour,

        Un grand merci pour ce qui vous faites
        juste pour 100 000 ça donne "Cent Faux Mille" au lieu de Cent Mille
        Merci.

      • Frédéric LE GUEN
        05/12/2021 @ 17:05

        Oui, c'est le seul bug (mais vous pouvez le corriger à la main)

  4. Véro
    05/11/2021 @ 19:59

    WOW ! Géniale !! Merci ! NbLettre fonctionne vraiment difficilement, là c'est top !

    Reply

  5. nathalie
    22/10/2021 @ 12:34

    J'ai eu aussi un soucis avec 3grp qu'il fallait écrire 3*grp, après cela ça marche nickel....que de temps gagné.
    Merci beaucoup.

    Reply

    • Frédéric LE GUEN
      23/10/2021 @ 16:16

      Mille merci pour avoir relevé la coquille dans l'article. C'est corrigé

      Reply

  6. Sandra
    02/07/2021 @ 08:36

    Bonjour,

    Merci pour cette formule vraiment super et pour les commentaires qui aident bien!
    J'ai une petite question tenant du format... J'aimerai que le nombre écrit en toute lettre ne comporte que des minuscules, j'ai essayé de simplement remplacer les majuscules par des minuscules dans la formule mais ça n'a rien changé...

    Il y a-t-il une manip supplémentaire à effectuer ?

    En vous remerciant par avance

    Reply

    • Frédéric LE GUEN
      02/07/2021 @ 09:08

      Il faut retirer l'instruction NOMPROPRE. C'est elle qui écrit chaque première lettre en majuscule

      Reply

  7. aleya
    02/04/2021 @ 12:17

    bonjour, je suis un novice en excel, j'ai pas réussi à utiliser la formule, j'ai coller dans une cellule mais j'ai pas compris comment introduire la cellule avec le chiffre

    Reply

    • Maxime Caruel
      06/04/2021 @ 07:51

      A la 10eme ligne dans la formule, tu as A1 que tu dois remplacer par ta cellule qui contient de valeur en chiffres. Novice aussi j'ai réussi. Merci pour le partage de cette formule

      Reply

      • NGUYEN
        07/04/2021 @ 16:09

        Bonjour,

        Moi c'est pareil que ALEYA. J'ai aussi remplacé la cellule qui contient de valeur en chiffres mais c'est toujours #NOM?

        Savez - vous pourquoi ?

        En vous remerciant par avance,

      • Frédéric LE GUEN
        07/04/2021 @ 16:12

        Votre version d'Excel ne connait pas la fonction LET. Il faut Excel 365

      • NGUYEN
        09/04/2021 @ 09:28

        Effectivement, j'ai Excel 365 mais peut - être la version n'est pas à jour.
        Et puis j'ai changé l'ordinateur et ça marche bien.

        Par ailleurs, quand c'est 1000; 4000; ... il n'affiche pas Euros, seulement Mille, Quatre mille. Comment on peut ajouter quand il s'agit le chiffre x Mille ?

        Je vous remercie beaucoup pour ce beau travail.

        Bien à vous,

  8. Nicolas Georges
    27/02/2021 @ 11:44

    Merci pour ce partage !

    J'ai du lire tout l'article pour trouver que . devait s'écrire \ dans ma configuration ;-)
    J'ai eu un soucis avec 3grp qu'il fallait écrire 3*grp.
    Sinon, j'ai aussi un soucis avec Utxt : je dois ajouter un ;"") à la fin du premier IF sinon j'obtiens par exemple "Dix Mille Cent Faux Euros", moi je veux des vrais euros :-p

    Nicolas.

    PS: la formule FR finale avec ma version d'Excel 365 (version 2101 build 13628.20274) :
    =LET(
    Denom; {" million ";" mille ";" Euro ";" Centimes"};
    Nums; {""\"Un"\"Deux"\"Trois"\"Quatre"\"Cinq"\"Six"\"Sept"\"Huit"\"Neuf"};
    Teens; {"Dix"\"Onze"\"Douze"\"Treize"\"Quatorze"\"Quinze"\"Seize"\"Dix-sept"\"Dix-huit"\"Dix-neuf"};
    Tens; {""\"Dix"\"Vingt"\" Trente"\" Quarante"\"Cinquante"\"Soixante"\" Soixante"\"Quatre-vingt"\"Quatre-vingt"};
    grp; {0;1;2;3};
    LET(
    N; SUBSTITUE( TEXTE( $I$7; REPT(0;9)&",00" );",";"0");
    H; CNUM( STXT( N; 3*grp+1; 1) ); T; CNUM( STXT( N; 3*grp+2; 1) );
    U; CNUM( STXT( N; 3*grp+3; 1) );
    Htxt; SI( H; SI(H>1; INDEX( Nums; H+1 ) & " cent "; "cent " ); "");
    Ttxt; SI( T>1; INDEX( Tens; T+1 ) & SI( U>0; "-"; "" ); " " );
    Utxt; SI((T+U); SI((T=1)+(T=7)+(T=9); INDEX(Teens;U+1 );INDEX(Nums;U+1));"");
    SUPPRESPACE(SUBSTITUE(NOMPROPRE(CONCAT( SI( H+T+U; Htxt & Ttxt & Utxt & Denom; "" )));"Un Mille";"Mille"))
    ))

    Reply

    • Frédéric LE GUEN
      27/02/2021 @ 17:46

      Il faut tout lire ;) Il y a toujours une raison derrière une formule.
      Ok pour le 3*grp et merci

      Reply

    • Rémy
      10/05/2021 @ 19:34

      Bonjour et merci pour la formule "compatible" avec ma version. Mais petit souci pour moi, les sommes s'affichent en centimes
      Par exemple
      70 = soixantedix centimes
      700 = 7 euro
      Je cherche mais je ne trouve pas où est l'erreur
      vous avez une idée ?

      Reply

    • FredB
      27/08/2021 @ 14:47

      Merci pour tous ces partages, lorsque je mets 101000 j'obtiens le résultat : Cent Mille. Je n'arrive pas à voir ce qui pêche dans la formule.
      Merci d'avance pour vos retours.

      Reply

      • Frédéric LE GUEN
        05/09/2021 @ 10:24

        Aucune idée. La formule n'a pas été développée au-delà de 99 999

      • Sébastien
        20/12/2021 @ 18:16

        Bonjour,
        le probleme ce pose à partir de l'affichage de 21 000, 31 000 etc...

      • Sébastien
        20/12/2021 @ 19:16

        Mon bidouillage pour que cela fonctionne avec les milliards de Franc CFA ... et réglant le probléme de 21 000, 31 000 etc ...

        =LET(
        Denom;{" milliard ";" million ";" mille ";" ";" "};
        Nums;{""."Un"."Deux"."Trois"."Quatre"."Cinq"."Six"."Sept"."Huit"."Neuf"};
        Teens;{"Dix"."Onze"."Douze"."Treize"."Quatorze"."Quinze"."Seize"."Dix-sept"."Dix-huit"."Dix-neuf"};
        Tens;{""."Dix"."Vingt"." Trente"." Quarante"."Cinquante"."Soixante"." Soixante"."Quatre-vingt "."Quatre-vingt "};
        grp;{0;1;2;3;4};
        LET(
        N;SUBSTITUE(TEXTE(ARRONDI(F38;0);REPT(0;12)&",00");",";"0");
        H;CNUM(STXT(N;3*grp+1;1));
        T;CNUM(STXT(N;3*grp+2;1));
        U;CNUM(STXT(N;3*grp+3;1));
        Htxt;SI(H;SI(H>1;INDEX(Nums;H+1)&" cent ";"cent ");"");
        Ttxt;SI(T>1;INDEX(Tens;T+1)&SI(U>0;" ";"");" ");
        Utxt;SI((T+U);SI((T=1)+(T=7)+(T=9);INDEX(Teens;U+1);INDEX(Nums;U+1));" ");
        SUPPRESPACE(SI(C13=1000;SUBSTITUE(NOMPROPRE(CONCAT(SI(H+T+U;Htxt&Ttxt&Utxt&Denom;"")));"Un Mille";" Mille");NOMPROPRE(CONCAT(SI(H+T+U;Htxt&Ttxt&Utxt&Denom;""))))))&" Franc CFA")

  9. Ephram
    25/01/2021 @ 15:41

    Par contre pour modifier selon le pays, par exemple, la Suisse il faut juste remplacer "quatrevingt" par huitante et quatre vingt dix par nonante ou il faut modifier d'autres point de la formule ?

    Reply

    • Frédéric LE GUEN
      25/01/2021 @ 15:51

      Oui, oui, oui, .... un peu de patience.
      Je sais que je dois le faire mais j'ai mille tâches à réaliser avant.
      Ce n'est pas simple d'être le dernier MVP en langue Française. J'ai bcp de sujet à couvrir.
      Mais ça sera fait.

      Reply

      • Ephram
        26/01/2021 @ 15:49

        Ok merci de l'article et des conseils super pratiques.

    • Frédéric LE GUEN
      25/01/2021 @ 22:35

      Mais pour soixante-dix, c'est bien septante, comme en Belgique

      Reply

  10. Charles
    21/01/2021 @ 10:08

    Chapeau ! Pourtant, à la lecture de la formule définitive, j'ai tout de suite vu... que c'est un véritable casse-tête !
    Par contre, j'adore l'idée de le faire avec des formules SANS MACRO !
    Bravo !

    Reply

    • Frédéric LE GUEN
      21/01/2021 @ 15:14

      C'est sur, il y a eu du travail. C'est pour cela que j'ai partager la fonction car c'est impossible de créer ce genre de formule de toute pièce. Et les macros, si on peut les éviter, c'est bien mieux

      Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

MICROSOFT MVP

RECHERCHE D’EMPLOI AVEC

Back to top