Taille de police :

×

Lecture de la page :

Lire Test2

Traduire un nombre en lettres sans VBA

5
(1)

MAJ : 13/03/2026 - Partie "Extension de la formule"

On trouve facilement sur internet des codes en VBA pour cela donc voici une version avec une formule moins courante.

Fonction de traduction en lettre

Présentation de la fonction personnalisée

Permet de convertir des valeurs entières de 0 à 1066-1 (999 décilliards) écrites avec des chiffres en leurs versions en lettres.

  • Les valeurs décimales sont arrondies à l'entier.
  • Les valeurs négatives ne sont pas supportées.
  • Les valeurs supérieurs ou égales à 1 000 000 000 000 000 (1 billiard soit 1015) doivent être saisies en format texte (précision limite d'Excel pour les calculs, la limite en saisie avant conversion automatique en texte est 1020 si en format Nombre).
  • Espaces et espaces insécables tolérés (souvent utilisés comme séparateur de classe).

Syntaxe

=NbreLettres(Cellule)

Argument

  • Cellule : cellule contenant le nombre à convertir.

Exemples d'utilisation

Fonction NbreLettres

Le 3 dernières lignes (en rouge) sont en texte (remarquer l'alerte Excel par le triangle vert en haut à gauche de la cellule A45).

Formule liée à cette fonction

Il s'agit de la formule à copier dans le Gestionnaire de nom (ruban Formules) sous le nom de "NbreLettres" (par exemple).

=LAMBDA(Cellule_;LET(
   chaine;@SUBSTITUE(SUBSTITUE(Cellule_;" ";"");CAR(160);"");
   chiffre;{"";" un";" deux";" trois";" quatre";" cinq";" six";" sept";" huit";" neuf"};
   nbre;{" dix";" onze";" douze";" treize";" quatorze";" quinze";" seize";" dix-sept";" dix-huit";" dix-neuf"};
   diz;{"DIX";" vingt";" trente";" quarante";" cinquante";" soixante";" soixante";" quatre-vingt";" quatre-vingt"};
   classe;{" décilliard";" décillion";" nonilliard";" nonillion";" octilliard";" octillion";" septilliard";" septillion";" sextilliard";" sextillion";" quintilliard";" quintillion";" quadrilliard";" quadrillion";" trilliard";" trillion";" billiard";" billion";" milliard";" million";" mille";""};
   nbCl;ENT(NBCAR(chaine)/3)+1;
   grp;SEQUENCE(nbCl;;0);
   N;TEXTE(chaine;REPT(0;nbCl*3));
   C;STXT(N;3*grp+1;1)*1;
   D;STXT(N;3*grp+2;1)*1;
   U;STXT(N;3*grp+3;1)*1;
   Cl;23-nbCl+grp;
   Cltxt;INDEX(classe;Cl);
   Ctxt;SI(C>1;
           INDEX(chiffre;C+1);"")&
             SI(C;
                " cent"&SI((C>1)*(D=0)*(U=0)*(Cl<>21);"s";"");
                "");
   Dtxt;SI(D>1;
           INDEX(diz;D-((D=7)+(D=9))*(U<>0))&
             SI((D=8)*(U=0);"s";"")&
             SI((D<8)*(U=1);"-et";"")&
             SI((U>0)+(D=7)+(D=9);"-";"");
           "");
   Utxt;SI(((D=1)+(D=7)+(D=9));
           INDEX(nbre;U+1);
           SI(U=0;"";INDEX(chiffre;U+1)));
   res;CONCAT(SI(C+D+U;
                 Ctxt&Dtxt&SI((U=1)*(D=0)*(Cl=21);"";Utxt)&
                   Cltxt&
                   SI((Cl<21)*((C*10+D*10+U)>1);"s";"");
                 ""));
   SI(res="";
      "zéro";
      SUBSTITUE(SUPPRESPACE(res);"- ";"-"))
))

Interprétation de cette formule

  1. On génère 3 matrices centaines/dizaines/unités (C/D/U) ayant autant de lignes que de classes présentes.
  2. Puis on recherche la représentation textuelle de chaque valeurs (matrices Ctxt/Dtxt/Utxt).
  3. On concatène les 3 matrices pour obtenir la chaîne finale.
  • Cellule_ : Cellule à traduire.
  • chaine : Chaîne sans espaces.
  • chiffre, nbre, classe : matrice des représentations textuelles des valeurs.
  • nbCl : Calcul du nombre de classes présentes (nombre de groupe de 3 chiffres).
  • grp : Matrice des numéros de classe à traiter (de 0 à nb de classe-1).
  • N : On complète le nombre par des 0 à gauche pour avoir des classes complètes (8 000 devient 008 000 par exemple).
  • C, D, U : Matrice des Centaines/Dizaines/Unités.
  • Cl : Matrice des numéros de classe à extraire de la matrice classe.
  • Cltxt : Matrice noms de classe utilisés.
  • Ctxt : Matrice des textes centaines avec gestion du "s" pour les multiples sauf pour les milliers.
  • Dtxt : Matrice des textes dizaines avec gestion du "s" pour 80, du "et" pour 21 à 71 et du tiret.
  • Utxt : Matrice des textes unités avec gestion de la 1ere/2nde dizaine (10 à 19).
  • res : Texte résultant de la concaténation des matrices (des espaces superflus sont présents).

On termine en gérant le cas "zéro" et en nettoyant la chaîne res.

Si vous trouver une erreur/simplification dans ma formule n'hésitez pas à m'en faire part.

(Cette fonction pourrait facilement être adaptée à des versions plus anciennes d'Excel)

Extension de la formule

En commentaire de cet article, l'utilisateur Jo a demandé s'il était possible d'ajouter la gestion de décimales et d'une devise monétaire à la formule précédente.

Voici une 2nde formule, utilisant la 1ère formule et permettant de répondre à cette demande, du moins je l'espère 😁.
(Cela m'a permis de voir quelques "coquilles" et ainsi faire les corrections correspondantes à la formule et à l'article 😰).

Présentation de la fonction personnalisée

Permet de convertir des valeurs décimales écrites avec des chiffres en leurs versions en lettres.

  • Les valeurs décimales sont arrondies selon le nombre de décimale demandé.
  • Les valeurs négatives sont supportées.
  • Les valeurs utilisables sont beaucoup plus limitées que dans la 1ère formule, ses limites sont celles des nombres dans Excel (15 chiffres significatifs).
  • Le caractère pour le séparateur de classe est personnalisable.

Syntaxe

=NbreDecLettres(Cellule;[NombreDeDecimal];[SymboleDecimal];[SymboleGroupe];[TextePrefixe];[TexteMedian];[TexteMedianP];[TexteMedianL];[TexteSuffixe];[TexteSuffixeP];[Mode])

Arguments

  • Cellule : Cellule contenant le nombre à convertir.
  • NombreDeDecimal : Nombre de décimales. Si non précisé, prend toutes les décimales.
  • SymboleDecimal : Symbole utilisé comme séparateur décimal. Si non précisé, utilise celui par défaut (configuré dans Windows).
  • SymboleGroupe : Symbole utilisé comme séparateur de classe (facultatif).
  • TextePrefixe : Texte à afficher au début (facultatif). Exemple : "Total : "
  • TexteMedian : Texte à afficher entre la partie entière et décimale quand la partie entière est entre 1 et 0 (facultatif). Exemple : " euro".
  • TexteMedianP : Texte à afficher entre la partie entière et décimale quand la partie entière n'est pas entre 1 et 0 (facultatif). Exemple : " euros".
  • TexteMedianL : Texte à afficher entre la partie entière et décimale après TexteMedian et TexteMedianP servant à Lier les 2 parties (facultatif). Exemple : " et " ou " virgule ".
  • TexteSuffixe : Texte à afficher après la partie décimale (facultatif). Exemple : " centime".
  • TexteSuffixeP : Texte à afficher après la partie décimale (facultatif). Exemple : " centimes".
  • Mode : Modes de fonctionnement
    • 0 : Pour les nombres classique (valeur par défaut).
    • 1 : Pour les valeurs monétaires.

Exemples d'utilisation

Argument Mode = 0

Exemples d'utilisation avec l'argument MODE=0

Argument Mode = 1

Exemples d'utilisation avec l'argument MODE=1

Formule liée à cette fonction

Il s'agit de la formule à copier dans le Gestionnaire de nom (ruban Formules) sous le nom de "NbreDecLettres" (par exemple).

=LAMBDA(Cellule;NombreDeDecimal;SymboleDecimal;SymboleGroupe;TextePrefixe;TexteMedian;TexteMedianP;TexteMedianL;TexteSuffixe;TexteSuffixeP;Mode;
LET(SymboleDecimalSys;STXT(1/2;2;1);
    SymboleDecimal2;SI(SymboleDecimal="";SymboleDecimalSys;SymboleDecimal);
    ValConv;SIERREUR(SUBSTITUE(SUBSTITUE(Cellule;SI(SymboleGroupe="";" ";SymboleGroupe);"");
                               SymboleDecimal2;SymboleDecimalSys)*1;0);
    MatParties;FRACTIONNER.TEXTE(ABS(SI(ESTNUM(NombreDeDecimal);ARRONDI(ValConv;NombreDeDecimal);ValConv));
                                 SymboleDecimalSys);
    P_Entiere;INDEX(MatParties;;1);
    P_EntiereL;NbreLettres(P_Entiere);
    P_Decimale;INDEX(MatParties;;2);
    NombreDeDecimal2;SI(ISOMITTED(NombreDeDecimal);NBCAR(P_Decimale);NombreDeDecimal);
    P_Decimale2;SI(Mode;GAUCHE(P_Decimale&REPT("0";NombreDeDecimal2);NombreDeDecimal2);P_Decimale);
    P_DecimaleL;NbreLettres(P_Decimale2);
TextePrefixe&SI(ValConv<0;"moins ";"")&P_EntiereL&
   SI(P_Entiere*1>1;SI(ISOMITTED(TexteMedianP);"";TexteMedianP);SI(ISOMITTED(TexteMedian);"";TexteMedian))&
   SI(ESTNUM(P_Decimale*1);TexteMedianL&
       SI(Mode;"";REPT("zéro ";SOMME((STXT(P_Decimale2;SEQUENCE(NBCAR(P_Decimale2));1)="0")*1)))&
   P_DecimaleL&
   SI(P_Decimale*1>1;SI(ISOMITTED(TexteSuffixeP);"";TexteSuffixeP);SI(ISOMITTED(TexteSuffixe);"";TexteSuffixe));"")))

Interprétation de cette formule

  • SymboleDecimalSys : Symbole décimal système.
  • SymboleDecimal2 : Symbole décimal utilisé par la formule.
  • ValConv : Nettoyage de la valeur de Cellule.
  • MatParties : Matrice de 2 valeurs (Partie entière et partie décimale).
    • Suppression du signe négatif.
    • Arrondissement de la valeur au nombre de décimale demandé (c'est ici que l'on limite la formule a 15 chiffres significatifs).
  • P_Entiere : Extraction de la Partie entière.
  • P_EntiereL : Conversion de la Partie entière en Lettre.
  • P_Decimale : Extraction de la partie décimale.
  • NombreDeDecimal2 : Nombre de décimales à utiliser (si NombreDeDecimal est omis, on prend toutes les décimales).
  • P_Decimale2 : On complète P_Decimale avec des 0 pour avoir un nombre >= à NombreDeDecimal2.
  • P_DecimaleL : Conversion de P_Decimale2 en Lettre.

Calcul final (exemple avec -1,086 en mode1) :

La formule écrit

  • le texte de TextePrefixe (exemple > "Total :") puis
  • "moins" si la valeur est négative (exemple > "Total : moins") puis
  • le texte de la partie entière P_EntiereL (exemple > "Total : moins un") puis
  • le texte de TexteMedian ou de TexteMedianP selon les cas (exemple > "Total : moins un euro") puis
  • le texte de TexteMedianL (exemple > "Total : moins un euro et ") puis
  • le texte "zéro" répété si nécessaire et si Mode = 0 puis
  • le texte de P_DecimaleL (exemple > "Total : moins un euro et neuf") puis
  • le texte de TexteSuffixe ou de TexteSuffixeP selon les cas (exemple > "Total : moins un euro et neuf centimes") puis

Si vous trouver une erreur/simplification dans ma formule n'hésitez pas à m'en faire part.

Merci pour votre attention bienveillante.

Article intéressant ?

Cliquez sur une étoile pour noter cet article !

Note moyenne 5 / 5. Nombre de votes : 1

Aucun vote pour l'instant ! Soyez le premier à noter ce post.

Nous sommes désolés que cet article ne vous ait pas été utile !

Améliorons cet article !

Dites nous comment nous pouvons améliorer cet article ?

Publications similaires

3 commentaires

  1. Bonjour, votre formule me semble géniale ! Pensez-vous pouvoir l'adapter pour des nombre avec 2 décimales, et avec une monnaie ? Ex : "cent trente-et-un mille euros et soixante centimes".
    Quelqu'un avait l'air sur la bonne voie sur ce site (https://excel-exercice.com/convertir-un-nombre-en-lettres/) mais malheureusement avec quelques bugs et limitations qui font que la formule n'est pas exploitable...
    Je ne suis pas du tout assez calée en syntaxe de formules pour adapter moi-même votre proposition.
    Mille merci si jamais vous vous y lancez !

    1. Bonsoir Jo,

      Merci pour votre retour.
      Je voulais poster la formule ce soir mais je suis confronté à un dernier cas particulier non géré pour l'instant(j'espère que c'est le dernier).

      Je vais tenter de la finaliser d'ici la fin de la semaine mais là, je vais me coucher 😴.

Répondre à Arnaud Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *