Demande d'un utilisateur : Dans un publipostage, afficher une valeur monétaire avec décimales en lettres.
Problématique
Microsoft offre aux utilisateurs des commutateurs de champ permettant de préciser le format d'affichage de ceux-ci (voir Liste des codes de champ dans Word - Support Microsoft).
Nous trouvons notamment \*CardText qui permet d'afficher la valeur "45 122" par exemple sous la forme suivante : "quarante-cinq mille cent vingt-deux". Cela semble répondre directement à la demande.
Mais cette solution n'est pas pleinement satisfaisante car elle possède certaines limitations qui peuvent être gênantes :
- La valeur doit être entre 0 et 999 999.
- Si la valeur possède des décimales, elle sera arrondie à l'euro entier le plus proche (avec "2,7", on aura "trois").
- La valeur doit être positive.
Solution proposée
Je vous propose une solution allant jusqu'à 999 millions (adaptable si on a besoins de dépasser cette limite), arrondissant au centime d'euro et acceptant les valeurs négatives.
Déclaration de signets
On commence par déclarer/saisir les signets suivant au début du document : La valeur de départ est le champ de fusion "Montant_Facture".
{ SET "Val" { MERGEFIELD Montant_Facture } }
{ SET "Val_ab" { = ABS( { Val } ) } }
{ SET "Val_pe" { = INT({ Val_ab } ) } }
{ SET "Val_pd" { = ({ Val_ab } - { Val_pe })*1OO } }
{ SET "Val_c3" { = INT({ Val_ab }/1000000) } }
{ SET "Val_c21" { = INT({ Val_ab } - ({ Val_c3 }*1000000)) } }- Val : Référence le champ contenant la valeur et ainsi en cas de changement de champs seul cette valeur est à adapter.
- Val_ab : Valeur absolue de la valeur.
- Val_pe : Partie entière de la valeur.
- Val_pd : Partie décimale de la valeur.
- Val_c3 : Partie de la classe des millions de la valeur (par exemple le 12 de 12 345 678,9).
- Val_c21 : Partie de la classe des milliers et des unités de la valeur (par exemple le 345 678 de 12 345 678,9).
Rappels :
- Pour basculer l'affichage entre le code des champs et leurs valeurs : Alt + F9.
- Pour mettre à jour les valeurs des champs : F9.
- Pour créer un champ (les accolades) : Ctrl + F9 (! Saisir directement les accolades ne fonctionne pas !).
Formule
À l'endroit où l'on doit s'afficher la valeur, on saisit la formule.
{ IF { Val } < 0 "moins " ""}{ IF { Val_c3 } > 0 "{ Val_c3 \*CardText } million" ""}{ IF { Val_c3 } > 1 "s" ""}{ IF { Val_c3 } > 0 " " ""}{ IF { = AND ({ Val_c21 } = 0 ; { Val_c3 } > 0) } = 1 "d'" "{ Val_c21 \*CardText } " }{ IF { Val_ab } > 1 "euros" "euro"} et { Val_pd \*CardText } { IF { Val_pd } > 1 "centimes" "centime"}Capture d'écran de la formule
Attention aux espaces symbolisés ici par des points.

Interprétation de la formule
{ IF { Val } < 0 "moins " ""} => On affiche le texte "moins" et un espace pour les valeurs négatives.
{ IF { Val_c3 } > 0 "{ Val_c3 \*CardText } million" ""} => On affiche la classe des millions, un espace et le texte "million" si la classe des millions existe.
{ IF { Val_c3 } > 1 "s" ""} ) => On ajoute un "s" s’il y a plusieurs millions.
{ IF { Val_c3 } > 0 " " ""} => On affiche un espace si la classe des millions existe.
{ IF { = AND ({ Val_c21 } = 0 ; { Val_c3 } > 0) } = 1 "d'" "{ Val_c21 \*CardText } " } => On gère les cas comme 2 000 000 > "Deux millions d'euros".
{ IF { Val_ab } > 1 "euros" "euro"} => On ajoute le texte "euro" ou "euros".
et => On ajoute un espace, le texte "et", un espace.
{ Val_pd \*CardText } => On ajoute la partie "décimale" et un espace (à l’extérieur des accolades), les décimales seront supprimées par \*CardText.
{ IF { Val_pd } > 1 "centimes" "centime"} => On ajoute le texte "centimes" ou "centime".Merci pour votre attention bienveillante.
