Convertir un nombre en lettres
Comment convertir un nombre en toutes lettres, pour l’imprimer par exemple sur un chèque ? Par exemple,
1234.56
donnerait «mille deux cent trente-quatre euros et cinquante-six centimes
« …
J’ai repris les bouts de code fournis sur cette page poussiéreuse 🙂 du site de Microsoft. Mais j’ai un peu nettoyé parce que le code donné en exemple…
- datait d’Access 2 (au moins)
- utilisait des variables de type
K$
,N$
… au lieu de types clairs (String) - utilisait beaucoup de variables globales
- et surtout donnait le résultat en francs 😉
Normalement, avec le nouveau code ci-dessous…
- le programme est un peu plus structuré (j’espère !)
- on peut utiliser ses propres unités. On peut donc afficher des valeurs en euros, ou en dollars, par exemple. On peut aussi choisir ses centimes (« centimes » ou « cents » notamment).
- on peut aussi n’utiliser aucune unité.
- on peut afficher un résultat à plus de 2 décimales.
Le code
Recopiez tout ce qui suit (oui, tout ça !) dans un module standard :
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 |
' Constantes diverses ' (voir tableau astrSpecial et fonction InitialisationMots) Public Const CONV_ZERO As Integer = 1 Public Const CONV_MOINS As Integer = 2 Public Const CONV_ET As Integer = 3 Public Const CONV_VIRGULE As Integer = 4 ' Constantes liées aux nombres ' (voir tableau astrSpecial et fonction InitialisationMots) Public Const CONV_60 As Integer = 5 Public Const CONV_80 As Integer = 6 Public Const CONV_1E2 As Integer = 7 Public Const CONV_1E3 As Integer = 8 Public Const CONV_1E6 As Integer = 9 Public Const CONV_1E9 As Integer = 10 ' Tableau des mots Dim astrMot(1 To 24) As String Dim astrSpecial(1 To 10) As String ' --- ' Conversion d'un nombre en lettres ' --- ' Entrée : strValeur <= Nombre à convertir ' strDevise <= Nom au singulier de la devise (facultatif). ' Ex. : "euro" ' strCentime <= Nom au singulier des centimes (facultatif). ' Ex. : "centime" ou "cent" ' intDigits <= Nombre de décimales. ' Sortie : Nombre en toutes lettres ' Function NbEnLettres( _ ByVal strValeur As String, _ Optional ByVal strDevise As String = "", _ Optional ByVal strCentime As String = "", _ Optional ByVal intDigits As Integer = 2) _ As String Dim strA As String Dim strK As String Dim strN As String Dim intI As Integer Dim strResultat As String Dim blnVirgule As Boolean ' Initialisation du tableau contenant les mots interprétés InitialisationMots If strDevise = "" Or strCentime = "" Then astrSpecial(CONV_ET) = astrSpecial(CONV_VIRGULE) End If ' Récupération de paramètre passé strA = strValeur + " " ' Initialisation des variables de travail strN = "" blnVirgule = False strResultat = "" ' Traiter toute la chaîne de valeur For intI = 1 To Len(strA) ' On extrait chacun des caractères strK = Mid(strA, intI, 1) Select Case strK ' Gèrer les montants négatifs Case "-" AjouterMot strResultat, astrSpecial(CONV_MOINS) ' Pour les caractères numériques, bâtir la chaine strN Case "0" To "9" strN = strN + strK ' Sinon, on teste si on est arrivé à une virgule Case Else If blnVirgule Then ' Les centimes sont comptés sur 2 digits, réajustés de ' manière inverse aux devises, puisqu'on lit les unités ' et dizaines de manière inversée (0,2€ = 20c et 0,02€ = 2c) strN = Right("000" + Left(strN + "000", intDigits), intDigits) If Val(strN) = 0 Then strN = "" End If ' On traduit le nombre stocké dans strN strResultat = TraduireEntier(strResultat, strN) ' Puis on détermine son unité en fonction de la présence ' ou non d'une virgule If (Not blnVirgule) And Val(strN) > 0 Then AjouterMot strResultat, strDevise ' Et on accorde l'unité avec le nombre ' (sauf s'il n'y a pas de devise) If strDevise <> "" Then If Val(strN) > 1 Then AjouterMot strResultat, "s" End If ElseIf blnVirgule And Val(strN) > 0 Then AjouterMot strResultat, strCentime ' On ajoute un "s" si nécessaire If strCentime <> "" Then If Val(strN) > 1 Then AjouterMot strResultat, "s" End If End If strN = "" Select Case strK Case Chr(13) intI = intI + 1 Case Is < " " Case ",", "." blnVirgule = True ' Si une valeur en devises est exprimée, et que le ' nombre de centimes est suffisant pour être traité, ' on lie les 2 par le mot "et" If Val(strA) <> 0 And Val("0." + Mid(strA, intI + 1)) >= 0.01 Then AjouterMot strResultat, astrSpecial(CONV_ET) End If Case Else End Select End Select Next ' Valeur finale NbEnLettres = strResultat End Function ' --- ' Traduction d'un nombre entier contenu dans une chaîne de caractères ' en son équivalent ordinal. ' --- ' Entrée : strChaine <= Chaîne de départ (à compléter) ' strNombreATraduire <= Nombre à traduire (!) ' Sortie : Nombre traduit en toutes lettres ' Function TraduireEntier( _ ByVal strChaine As String, _ ByVal strNombreATraduire As String) _ As String Dim strNombre As String Dim intLongueur As Integer Dim strCDU As String Dim strCentaines As String Dim strDizaines As String Dim strUnites As String Dim blnEt As Boolean Dim blnTiret As Boolean strNombre = strNombreATraduire If strNombre <> "" Then ' Si le nombre est 0, on ne perd pas de temps If Val(strNombre) = 0 Then AjouterMot strChaine, astrSpecial(CONV_ZERO) Else ' Sinon, on convertit celui-ci en une chaine de caractères ' de intLongueur multiple de 3, afin de pouvoir la lire par blocs ' de 3 caractères strNombre = Right("000", -((Len(strNombre) Mod 3) <> 0) _ * (3 - (Len(strNombre) Mod 3))) + strNombre For intLongueur = Len(strNombre) To 3 Step -3 strCDU = Left(strNombre, 3) strNombre = Right(strNombre, intLongueur - 3) ' On extrait ainsi des ensembles de 3 chiffres, ' de la gauche vers la droite If strCDU <> "000" Then ' ... dont on tire une valeur de ' centaines, dizaines et unités strCentaines = Left(strCDU, 1) strDizaines = Mid(strCDU, 2, 1) strUnites = Right(strCDU, 1) ' On convertit les unités non muettes pour les centaines If strCentaines >= "2" Then AjouterMot strChaine, Equivalent(Val(strCentaines)) End If ' Et on traite les 1 muets If strCentaines >= "1" Then AjouterMot strChaine, astrSpecial(CONV_1E2) ' On applique les règles d'accords pour les centaines If Val(strNombre) = 0 And strDizaines + strUnites = "00" _ And Len(strChaine) > 4 Then AjouterMot strChaine, "s" End If ' On analyse si le mot ET est nécessaire (21, 31, 41...) blnEt = (strDizaines >= "2") And (strUnites = "1") ' Ainsi que les tirets pour certains couples ' dizaines-unités blnTiret = ((strDizaines >= "2") And (strUnites > "1") _ Or (strDizaines >= "1" And strUnites >= "7")) And (Not blnEt) ' Traitement des valeurs 80-99 If strDizaines >= "8" Then AjouterMot strChaine, astrSpecial(CONV_80) blnEt = False ' Retenue nécessaire pour 90 à 99 If strDizaines = "8" Then strDizaines = "0" Else strDizaines = "1" blnTiret = True End If ' Traitement d es unités If strUnites > "0" Then blnTiret = True Else AjouterMot strChaine, "s" End If ' Sinon on traite les valeurs 70 à 79 ElseIf strDizaines = "7" Then AjouterMot strChaine, astrSpecial(CONV_60) ' Retenue pour les dizaines strDizaines = "1" If strUnites <> "1" Then blnTiret = True End If ' Valeurs entre 10 et 16 If (strDizaines = "1") And (strUnites <= "6") Then strDizaines = "0" strUnites = "1" + strUnites End If ' Sinon, on gère toutes les autres dizaines If strDizaines >= "1" Then ' Gérer les tirets pour les dizaines composées If blnTiret And strDizaines = "1" _ And Val(Right(strCDU, 2)) > 19 Then AjouterMot strChaine, "-" End If ' Traduction de la dizaine... AjouterMot strChaine, Equivalent(Val(strDizaines + "0")) ' Accorder l'exception des vingtaines If strDizaines + strUnites = "20" And strCentaines <> "0" Then AjouterMot strChaine, "s" End If End If ' Si le mot Et est nécessaire, on l'ajoute If blnEt Then AjouterMot strChaine, astrSpecial(CONV_ET) ' ... ainsi que le tiret, liant ' une dizaine et une unité If blnTiret Then AjouterMot strChaine, "-" ' puis on traduit l'unité du nombre If Val(strUnites) >= 22 Or ((Val(strUnites) >= 1 _ And (Val(strCDU) > 1 _ Or intLongueur <> 6))) Then AjouterMot strChaine, Equivalent(Val(strUnites)) End If ' Enfin, la pondération du nombre est respectée, ' en ajoutant le multiple nécessaire, et en ' l'accordant s'il le faut Select Case intLongueur Case 6 AjouterMot strChaine, astrSpecial(CONV_1E3) Case 9 AjouterMot strChaine, astrSpecial(CONV_1E6) If Val(strCDU) > 1 Then AjouterMot strChaine, "s" Case 12 AjouterMot strChaine, astrSpecial(CONV_1E9) If Val(strCDU) > 1 Then AjouterMot strChaine, "s" Case Else End Select End If Next End If End If TraduireEntier = strChaine End Function ' --- ' Ajout d'un terme traduit à une chaine ' --- ' Entrée : strChaine <= Chaîne à laquelle ajouter un terme. ' strMot <= Terme à ajouter. ' Sortie : strChaine est directement modifiée. ' Sub AjouterMot( _ ByRef strChaine As String, _ ByVal strMot As String) If strChaine <> "" Then ' Le nouveau terme est directement collé aux précédents ' dans le cas des "S" à rajouter, ou des tirets If Right(strChaine, 1) = "-" Or strMot = "s" Or strMot = "-" Or strMot = "" Then strChaine = strChaine + strMot Else ' Sinon, ajouter le terme après un espace strChaine = strChaine + " " + strMot End If Else strChaine = strMot End If End Sub ' --- ' Recherche d'un mot équivalent à une valeur numérique ' --- ' Function Equivalent(ByVal intValeur As Integer) As String Select Case intValeur Case Is < 21 Equivalent = astrMot(intValeur) Case Else Equivalent = astrMot(18 + (intValeur / 10)) End Select End Function ' --- ' Initialisation du tableau de mots ' --- ' Sub InitialisationMots() ' Termes principaux astrMot(1) = "un" astrMot(2) = "deux" astrMot(3) = "trois" astrMot(4) = "quatre" astrMot(5) = "cinq" astrMot(6) = "six" astrMot(7) = "sept" astrMot(8) = "huit" astrMot(9) = "neuf" astrMot(10) = "dix" astrMot(11) = "onze" astrMot(12) = "douze" astrMot(13) = "treize" astrMot(14) = "quatorze" astrMot(15) = "quinze" astrMot(16) = "seize" astrMot(20) = "vingt" astrMot(21) = "trente" astrMot(22) = "quarante" astrMot(23) = "cinquante" astrMot(24) = "soixante" ' Termes spéciaux astrSpecial(CONV_ZERO) = "zéro" astrSpecial(CONV_MOINS) = "moins" astrSpecial(CONV_ET) = "et" astrSpecial(CONV_VIRGULE) = "virgule" ' Constantes liées aux nombres astrSpecial(CONV_60) = "soixante" astrSpecial(CONV_80) = "quatre-vingt" astrSpecial(CONV_1E2) = "cent" astrSpecial(CONV_1E3) = "mille" astrSpecial(CONV_1E6) = "million" astrSpecial(CONV_1E9) = "milliard" End Sub |
Pour tester…
- Faites apparaître la fenêtre Exécution (
CTRL
+G
). - Tapez (sur une seule ligne) quelque chose comme :
? NbEnLettres(123.54)
- Validez par
[Entrée]
. Vous devriez obtenir ceci :
cent vingt-trois virgule cinquante-quatre
En fait, vous pouvez transmettre plusieurs paramètres à la fonction :
- 1er paramètre : le nombre à convertir.
Ce paramètre est obligatoire (ben oui, on fait comment sinon ?).
Le nombre est converti en chaîne avant d’être affiché. Si vous transmettez directement une chaîne, celle-ci ne doit pas être formatée avec des espaces (évitez :"1 234.56"
, alors que"1234.56"
sera correct).
Note : aucun arrondi n’est calculé. Si vous transmettez la valeur 1.357, et que l’affichage se fait sur 2 décimales, vous obtenez « un virgule trente-cinq ». - 2ème paramètre : l’unité principale.
Ce paramètre est facultatif. Il doit être donné au singulier.
Un « s » sera ajouté au pluriel (ça veut dire que l’affichage n’est pas prévu pour gérer une unité de type « quintal » !).
Ex. : « euro », « dollar », « mètre », « kilogramme ». - 3ème paramètre : l’unité associée aux décimales.
Mêmes remarques que pour l’unité principale.
Ex. : « centime », « cent », « centimètre », « gramme ». - 4ème paramètre : le nombre de décimales à prendre en compte pour l’affichage.
Si vous calculez en grammes, ce nombre devrait être 3, par exemple.
Note : si vous omettez ce paramètre, la valeur par défaut est de 2.
? NbEnLettres(1.35)
un virgule trente-cinq
? NbEnLettres(1.35, "euro", "centime")
un euro et trente-cinq centimes
Application pratique
La fonction NbEnLettres()
n’est pas cantonnée à une utilisation en VBA : elle peut être bien sûr utilisée dans les requêtes, les formulaires, les états. Par exemple, si vous construisez la requête suivante :
… vous obtenez ce résultat :
Merci Mr Hervé je vous remercie énormément, vous faciliter tellement la vie pour les gents
Merci !
merci
Génial ! Comme souvent. Merci 😉
Merci aussi ! 🙂
Vous m’avez beaucoups aidé…merci Hervé !
Merci !
Un grand, un très grand, merci.
merci bien » HERVÉ INISAN «
Bonjour,
Un petit cheveu dans la coupe ? En voilà
A ma connaissance, avant le vba, on saisit une valeur en toutes lettres sur les chèques ou les factures « en manuscrit » pour prendre véritablement conscience du montant inscrit. D’ailleurs, le code de commerce stipule en ce qui concerne le chèque qui si il ya discordance entre le montant en chiffres et le montant en lettres, c’est celui en lettres qui sera pris en considération. Donc, quel intérêt à automatiser cette conversion de nombres en toutes lettres ?
Il n’empêche que j’utilise vitre fonction dans l’édition de mes docs commerciaux.
Et merci
Je ne suis pas spécialiste du code du commerce, donc je vais peut-être répondre à côté. 😉 Mais de nombreuses grandes surfaces, par exemple, utilisent une imprimante qui remplit intégralement le chèque. Par rapport à l’argument de discordance : on garantit d’une certaine manière qu’il n’y a pas de différence entre le montant lettres et le montant chiffres.
Et effectivement, le code VBA peut servir à d’autres choses : rédaction de contrats avec montants…
Bonjour Hervé ! Je reviens à vous. En essayant de monter l’impression de mes chèques, j’ai formé les codes ci dessous qui donne bien :
Private Sub Report_Load()
Me.Mtchque = « *** » & DLookup(« [Montant] », « T_cheque ») & « *** »
Me.MtLettre = NbEnLettres(DLookup(« Montant », « T_cheque »)) & » Francs CFA »
End Sub
Seulement, le résultat de Me.Mtcheque ne me satisfait pas. Je l’avait formaté que le montant soit en millier (***854 422 452***), mais en voici le résultat (***854422452***). Comment faire?
Merci pour ta disponibilité.
Le DLookup() récupère la valeur brute uniquement, il faut donc la formater en écrivant :
Hervé grand grand grand grand grand …. merci! Ca marche très bien.
Merci ! 🙂
Bonjour.
Merci cette fonction qui va me faire du bien.
Je suis entrain de vouloir imprimer mes chèques avec cette fonction. Comment arriver à concaténer pour avoir ce résultat dans un champs: ***250 100*** (*** Montant chèque***).
Merci.
Bonjour Hervé!
Pourquoi les requetes où la formule « NbEnLettres() » sont utilisées ne sont plus visible pour une fusion avec Word pour publipostage.
Comment y remdier? Merci.
Les requêtes qui font appel à des éléments externes (non standard du coup) sont effectivement ignorées dans une fusion (ainsi que quelques requêtes standard). Il y a peut-être des alternatives, quel est l’objectif ?
Je voudrais à partir de Word effectuer des publipostages pour de lettre de règlement à partir d’une requête ayant des montants (avec NbEnLettres()).
La conversion avec
NbEnLettres()
ne pourra pas être récupérée dans Word. Par contre, il y aurait peut-être une autre approche qui consisterait à utiliser un champ Word. Dans les grandes lignes :Ctrl + F9
dans Word. Des accolades s’affichent.=12345 \*cardtext
Word devrait afficher la traduction du montant en toutes lettres. Maintenant, reste à adapter pour un montant venant d’Access (a priori, il faudra remplacer 12345 par un champ Access). A voir aussi si les restrictions de Word sur les montants suffiront.
Merci pour votre fonction.
Elle fonctionne très bien et je n’ai pas besoin d’écrire un autre
C’est super
Content que ça puisse aider ! 🙂
Merci Mille Fois, vous êtes vraiment généreux Mr
Merci ! 🙂
Djamel > Il ne faut pas que le module qui contient le code porte le même nom qu’une fonction VBA. En d’autres termes, si une fonction s’appelle
NbEnLettres
, il faut appeler le module autrement. Sinon, il peut y avoir conflit. On dirait que c’est ton cas ?Prézi > Supprimer ou les 3 lignes ou les passer en commentaires (c’est-à-dire ajouter une apostrophe devant) fait le même effet. C’est l’un ou l’autre (si les lignes sont supprimées, on ne peut de fait plus les commenter).
Ça ne devrait par contre pas « casser » la fonction, et elle devrait toujours afficher quelque chose.
Bonsoir Hervé!
J’ai utilisé ton code qui permet de convertir les nombres en lettres; il marche très bien mais seulement, certains montants sont erronés; j’ai essayé de supprimer les trois lignes « buggées » comme tu le recommandes mais, aucune valeur ne s’affiche plus; il reste certainement à commenter lesdites lignes: mais comment faut-il le faire concrètement?
Merci d’avance.
Bonjour,
En fait j’ai essayé le code VBA, mais à l’exécution j’ai ce message « erreur de compilation » « variable ou procédure attendue et non un module ».
Pourvez-vous m’éclairer, en faire je ne suis pas très familier avec VBA.
JPP65 > Merci également ! 🙂
Extra !
Merci beaucoup et encore bravo.
Cordialement,
JPP
José > Effectivement, la grammaire française est compliquée à gérer, avec ses variantes et ses exceptions… 😉 Merci pour le retour.
Bonjour Monsieur Inisan
En parcourant le Net je suis tombé sur votre site et votre excellent programme de conversion de nombre en lettres.
Permettez moi une remarque :
Vingt et cent ne prennent ‘s’ final que s’ils sont multipliés par un nombre et non suivis par un autre. On écrira donc :
300 -> Trois cents
304 -> Trois cent quatre
1 100 -> Mille cent — ici cent n’est pas multiplié par un nombre
1 020 000 -> un million vingt mille
80 -> quatre-vingts
93 -> quatre-vingt-treize
Salutations cordiales.
Joséf LAMA > Oui. En VBA, le séparateur est la virgule, mais dans les couches graphiques (requêtes, formulaires, états), le séparateur est le point-virgule (sur une machine française en tout cas).
La règle est que dès qu’on passe en VBA ou en SQL, il faut penser anglais. Le reste du temps, il faut raisonner en fonction de son propre pays.
merci bien à vous, vs m’avez très bien aider,mais
une remarque dans une requête accès le les paramètres de séparation sont ; au lieu de , j’ais eu sa paras-art
Dan > Le champ DEDMONT est bien numérique ? Sinon, quel est le séparateur décimal, sur l’ordinateur ?
Bonsoir,
Je suis très intéressé par ce module, mais je ne parviens pas à le mettre en œuvre.
Voici la formule tapée dans ma requête : Expr1: NbEnLettres([DEDMONT]; »euro »; »cent »;2)
et voici le résultat obtenu : euros
le montant ne s’affiche pas.
Je ne comprend pas où j’ai pu commettre une erreur.
Merci pour vos éclaircissements.
Cordialement
christophe-vdw > Pour répondre aux 2 points :
=NbEnLettres([Montant]) & "*********"
Auto-extensible
sur «Oui
« . De cette manière, le champ s’agrandit verticalement (et automatiquement) sur l’état, en fonction de son contenu.bonsoir
avant tous merci pour votre « clartée »( même un débutant arrive a vous comprendre!!!!)
ma question:
je veux imprimer des chèques (créer un état avec en plaçant bien les champs )mais……
-le nombre ne tien pas toujours sur une ligne
(il faut « couper »le champ en deux partie!!!)
-il faut sécuriser l’écrit par des*******************************jusqu’a la fin du champ
d’avance merci
philippe-nemo > Welcome back, Philippe ! 🙂
Est-ce que le nom du module est bien différent des noms de fonctions ou de procédures donnés dans le code ?
Bonjour Hérvé,
de nombreuses années sont passées depuis mon premier post, et je suis toujours sur access !
mon programme doit être régulièrement mis à jour.
je viens de tester ton code, mais je reçois le message suivant : « erreur de compilation. Variable ou procédure attendue, et non un module. »
rimie > Est-ce que le nom de tes modules est différent des noms utilisés dans le code VBA ?
j’ai le message d’erreur suivant:
« erreur de compilation:
variable ou procédure attendu, et non un module »
hachimoto2891 > Le message était bien enregistré (mais les commentaires sont modérés pour éviter le spam massif).
j’ai cru que mon premier message n’a pas été posté
🙂
en tout cas merci énormément
hachimoto2891 > Merci ! 🙂
Vraiment Bravo!!!
ça marche hyper-ment bien même sur Excel
Chapeau et merci énormément pour tes efforts
Tigre > Normalement, un message apparaît (sous le ruban), demandant d’activer la base de données, à l’ouverture de celle-ci.
Microsoft access professionnel 2010 professionnel.
Je dois aller à quel endroit pour utiliser cette option « expressions non sécurisées »?
Tigre > De quelle version d’Access s’agit-il ?
Pour une version récente, est-ce que le code VBA (les « expressions non sécurisées ») sont autorisées à s’exécuter, à l’ouverture de la base ?
NbEnLettr: NbEnLettres([Transaction]!Nombre_b) est utilisé dans une requête.
Fonctionne seulement si j’exécute le module InitialisationMots manuellement.
Pourquoi?
Tigre > Oui, c’est tout à fait possible. Dans le paragraphe « Application pratique » de cet article, la fonction est par exemple utilisée dans une requête.
La seule chose à faire est de définir le champ calculé dans la requête, l’appel de la fonction
NbEnLettres()
est automatique. On peut utilise la fonction à tout endroit d’Access qui peut faire appel à des calculs (requêtes, formulaires, états, VBA).Le programme fonctionne bien seulement si j’ouvre le module et que je l’excécute. Est-ce que l’on peut charger le module automatiquement? (Sans d’abord l’excécuter manuellement dans VBA).
Merci!
Isa > Tout le code VBA doit être recopié dans un module standard. En cliquant sur le lien, tu auras plus d’infos. Le VBA crée la fonction
NbEnLettres()
.Ensuite effectivement, tu peux utiliser la fonction dans une requête, dans un formulaire, dans un état ou en VBA.
Pour transformer les montants de dons en lettres, la requête ressemblera à l’exemple que je donne.
Enfin, on peut imaginer construire un état à partir de cette requête (du coup, l’état récupèrera le montant en toutes lettres aussi).
Bonjour,
Merci pour ce code bien détaillé.
Je suis en train de créer une base de données sous Access mais je ne vois pas du tout où insérer ce code. Dans une requête comme dans votre exemple avec les films ?
Je ne sais pas où indiquer le nombre à convertir. (Convertir des montants de dons pour une association afin d’éditer les reçus)
Merci de votre aide !
Edouard > Si j’ai suivi :
Salut tout monde!
NB: J’ai plusieurs clients qui demandent à être facturés dans la monnaie en cours dans leur pays (Dollars Us , Euros , Livre Sterling, F CFA …)
Je voudrais savoir si je pourrais utilisé ce code pour convertir les montant de mes factures de sorte à avoir un bon résultat avec chaque monnaie.
Exemple: 1500,50 € = Mille cinq cent euros cinquante centimes – 200,50 £ = Deux cent livres cinquante cents etc…
Je ne saisi pas si je suis clair dans ma demande!
Merci d’avance.
Karim > Super 🙂
J’ai utilisé cette solution pour convertir un montant en toutes lettres avec MS ACCESS 2007 Fr. J’ai contourné la syntaxe anglo-saxonne exigée par le module par l’intermédiaire de la fonction Clong(): NbEnLettres(CLong([Total]); »euro »; »centime »)
C’est impec !
Merci beaucoup 😉
Il est surprenant de voir combien des années après ta prouesse suscite toujours autant d’engouement. Un seul mot » MERCI «
En tant que débutant en VBA j’ai râlé un max avec cette conversion qui pourtant est implémentée comme par baguette magique dans un logiciel que je ne citerais pas(sorry pas de pub). Encore Hervé. God Bless.
merci beaucoup pour le code de conversion de chiffre en lettre cela m’a aidé énormément
André Mansiaux > Les symptômes m’ont l’air normaux, en fait.
J’espère que ça peut dépanner…
Bonsoir Hervé Inisan
Je suis sous Access 2010, XP séparateur décimal dans le panneau de configuration : virgule, système français.
J’ai fait le test dans la partie « Execution » du module avec le résultat suivant :
– 1er cas avec un point comme séparateur décimal:
?NbEnLettres(123.45, »euro », »cent »)
cent vingt-trois euros et quarante-cinq cents
– 2ème cas avec une virgule comme séparateur décimal:
?NbEnLettres(123,45, »euro », »cent »)
pas de résultat mais affichage d’un message « Microsoft basic pour applications » indiquant « Erreur d’exécution ’13’:Incompatibilité de type ».
De plus lorsque j’utilise de module dans une requête, il faut toujours que j’utilise un point comme séparateur et de plus que j’utilise un point virgule à la place de la virgule entre le champ où la valeur est prise (Montant dans mon cas)et les unités « euro » et « cent » : NbEnLettres([Montant]; »euro »; »cent »)
Ceci n’est pas gênant mais curieux
Merci d’avance pour votre appui (je peux, si cela est plus pratique pour vous, vous envoyer des pages écrans)
André Mansiaux
André Mansiaux > Je viens de refaire un test : ça marche correctement sur ma machine (Access 2010, séparateur décimal dans le panneau de configuration : virgule, système français).
Est-ce que je peux avoir plus de précisions sur le problème dû à la virgule ?
Bonjour,J’ai juste un souci, c’est que la conversion ne marche pas si le nombre a une virgule comme séparateur décimal (pas de pb avec un point, ça marche vraiment très bien). J’ai vraiment besoin d’utiliser une virgule comme séparateur car il s’agit d’éditer des reçus fiscaux pour une association et je dois indiquer le montant en numérique avec séparateur virgule + le même montant en toutes lettres.
Merci d’avance pour votre appui
microsophistic > Comme il s’agit d’un autre sujet, le mieux est d’ouvrir une conversation sur le forum Access du site. Ce sera plus simple d’échanger par là-bas… 🙂
Bonjour, j’ai installé ce code et ça marche très bien, merci. Par contre j’ai besoin d’aide pour un code comparable que j’ai trouvé sur le net mais qui renvoie le nombre en caractère arabe. J’avais un problème de reconnaissance des caractères arabes dans mon état qui étaient illisibles, j’ai tout essayé avec les fonctions langue de win7 sans succès! Après un bidouillage car je suis débutant j’ai copié/collé le code dans un module de classe et remis toutes les fonctions langues en français et là l’arabe est lisible dans l’état! Ma question est pourquoi? Est-ce un hasard? Je peux éventuellement vous envoyer une copie de la base essai qui exploite plusieurs codes différents français, italien et arabe donc!
Merci d’avance de l’aide que vous voudrez bien m’apporter.
Gérard
thank you very much
Andiz > Ça, c’est plus simple : c’est une question de
Format
, à définir dans les propriétés du champ de table (ou de formulaire, ou d’état). Le format change automatiquement en fonction des paramètres « régionaux ».Et Comment faire pour que les chiffres apparaissent avec séparateur de milliers. Ex.2431000 s’afficherait ainsi : 2 431 000 ou 2.431.000 ou 2,431,000 ? (en fonction de l’environnement francophone ou anglophone). Merci.
Super, ça marche.Merci.
Andiz > Voir ma réponse n°8 (une fois les 3 lignes supprimées ou commentées, les valeurs que tu donnes devraient s’afficher correctement). Ouala !
Le Code marche bien à l’exception de quelques cas Ex. 2431000, la fonction donne « deux millions quatre cent trente virgule un mille » au lieu de « deux millions quatre cent trente un mille », 4071000, quatre millions soixante virgule onze mille ?, 9271200 neuf millions deux cent soixante virgule onze mille deux cents ???
Merci pour vos excellentes explications claires et précises.
Merci Hervé, A bientôt
badji demba > XD, content que ça marche !
Pour apprendre le VBA/Access, je conseille de faire en plusieurs étapes :
J’ai commencé une initiation aux fondamentaux sur cette page de http://www.self-access.com, ça peut déjà aider. Quelques petites choses sur les formulaires/états ici aussi.
MONSIEUR Hervé Inisan
Merci mille fois, dés-que j’ai appliqué vos consignes la virgule a disparu.
Je souhaiterais gardé le contact avec vous.
Ma particularité est que je suis capable de faire des programmes trés pointus avec ACCES sans écrire une seule ligne de code VBA. Mais je voudrais commencer à l’étudier, quel est le moyen le plus facile de le maitriser?
A l’école j’avais appris à programmer avec COBOL et je constate qu’il y’a certaines ressemblances avec VB
Merci Hervé, vous êtes un Grand Monsieur
badji demba > En supprimant les lignes buggées (voir réponse au message de kacemi), tu obtiendras la bonne valeur. Il ne faut pas non plus que ta valeur comporte d’espace : « 141800 » est correct.
Merci pour le tuyau.
Je l’ai essayé et ça marche excepté le nombre 141 800 qu’il a converti en Cent quarante virgule un mille huit cent.
Merci pour les éclaircissements
kacemi > Le bug ne se produit pas lorsque des devises sont fournies, je ne l’avais pas vu passer :-).
En supprimant (ou commentant) ces 3 lignes en début de listing, ça devrait marcher :
pourquoi 621 s’écrit six cent vingt virgule un
la même situation pour 321, 351, 121,…..
COMMENT PEUT ON CORRIGER CE BUG MERCI
Operateur > Ca marchera dans une zone de texte, mais pas dans une étiquette. Et dans une zone de texte, la formule sera du style :
=NbEnLettres([Champ à convertir])
Avec éventuellement les autres paramètres entre parenthèses (séparés par ;).
j’ai essayer dans une Etiquette ensuite dans une Zone de Texte, mais je n’est pas la convertion du Total TTc en lettre. Le net a payer dans mon Etat est en TTC donc Total TTC.
je ne comprend pas, pourquoi NBreENLettre s’affiche dans l’Etique quant j’execute l’Etat
Merci
finetos > Si j’ai compris la question, l’exemple 3 sur la capture d’écran plus haut (Fenêtre Exécution) donnerait la réponse.
boujours,
j’aurais juste une question a l’utilisation du code
comment parametrer l’unité principal et l’unité associée au decimales pour que euro et centime soit pris en compte
merci par avance votre code est genial car bien expliqué
A+
Operateur > A supposer que le montant est stocké dans un champ appelé [Montant], la formule (sur un état par exemple, et dans une zone de texte) donnerait quelque chose comme :
="Arrêté la présente facture à la somme de " & [Montant] & " F CFA (" & NbEnLettres([Montant]; "Franc CFA") & ")"
SALUT;
J’ai une facture cliente sur laquelle je voudrais que le montant des achats du client apparait en lettre. le montant convertis en C CFA.
J4AI ESSAYE AVEC LE CODE INDIQUE CI DESSOUS MAIS RIEN DE CONCRET. J’ai peut mal utulisé le code; mais voila ce je souhatérais obtenir. « Arrêté la présente facture a la somme de 2000 f cfa (deux Milles Francs CFA) »
je vous remercie pour ce blog.
Format de conversion belge
Bonjour,
Pouvez-vous m’aider à effectuer les adaptations nécessaires pour le format de chiffre belge
« Septante » et « nonante ». J’y suis arrivé pour « septante » mais bloc pour « nonante »
Grand merci pour votre aide
Pas facile effectivement. Je suis un peu pris ces temps-ci, et je n’aurai pas le temps de regarder immédiatement, mais pour plus tard :
1. Comment écrit-on 71 et 91 ? (septante un, nonante un ?).
2. Est-ce qu’il y a des tirets comme en France ? (du style : septante-trois ou nonante-quatre)