Bonjour
j'ai créé une facture avec access 2007 ( formulaire /sous formulaire)
donc pour le total c'est bon, mais je dois convertir ce total en lettre.
38000 === trente huit mille
aidez moi SVP
merci d'avance
Bonjour
j'ai créé une facture avec access 2007 ( formulaire /sous formulaire)
donc pour le total c'est bon, mais je dois convertir ce total en lettre.
38000 === trente huit mille
aidez moi SVP
merci d'avance
Bonjour
Un petit tour dans la Faq: https://access.developpez.com/sources/?page=Conv#ChiffresEnLettres
Bonjour,
Quoique 90 s’écrit quatre-vingt-dix et non quatre-vingts-dix
Correction brutale : modifier la dernière instruction de la « Function Nb2Mot$(Valeur$) »
Nb2Mot$ = Résultat$
par
Nb2Mot$ = Replace(Résultat$, "quatre-vingts-dix", "quatre-vingt-dix")
Code corrigé en annexe.
P.-S. Chez nous, on dit « nonante » : c'est plus simple !![]()
merçi bouceaup ClaudeLELOUP![]()
C'est surtout Gayot que tu dois remercier : j'ai seulement corrigé une faute d'orthographe !
Bonjour Gayot
Je me permets de solliciter ton intervention sur le code convertissant des chiffres en lettres. Je l'ai recopié dans un module, puis dans un contrôle d'un formulaire j'ai inséré la formule suivanteet j'ai comme résultat ceci : #nom
Code : Sélectionner tout - Visualiser dans une fenêtre à part =TraduireEntier(Nomdemoncontrôle àtraduire)
Est-ce que tu pourrais m'orienter dans l'utilisation de ton code qui me paraît très génial (notamment pour les factures)
Merci d'avance.
Cordialement
bonjour,
1) TraduireEntier: une Sub ne renvoie rien elle exécute un code et c'est tout, elle ne peut donc pas être utilisée en tant que fonction dans un formulaire...
Il te faudra créer ta propre fonction pour qu'elle te renvoie un résultat.
2) on ne peut pas non plus utiliser le nom d'un contrôle comme argument d'une fonction dans sa propre source contrôle car cela crée une référence circulaire, on ne peut le faire que sur sortie du contrôle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Moncontrole_Exit(Cancel As Integer) Me.Moncontrole = MafonctionTraduireEntier(Me.Moncontrole) End Sub
Re Tee_Grandbois
Je te remercie ( une fois de plus) de venir à mon secours. Comme tu t'en doute, je ne suis pas un expert en VBA, d'où mes erreurs.
J'ai utilisé en fait deux contrôles le premier est la source et le deuxième affiche le résultat du code.
J'ai pensé faire ceci en rapport à un code de calcul de durée entre deux dates.Pour utiliser ce code, j'ai crée un contrôle recevant le résultat de ce code et dans ce contrôle j'ai mis la formule suivante
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 ' CALCUL DU TEMPS ENTRE DEUX DATES Function AMJ(DateDebut As Date, DateFin As Date) As String Dim NbAns As Long, NbMois As Long, NbJours As Long Dim Tmp As Date Tmp = DateSerial(Year(DateFin), Month(DateDebut), Day(DateDebut)) NbAns = Year(DateFin) - Year(DateDebut) + (Tmp > DateFin) NbMois = Month(DateFin) - Month(DateDebut) - (12 * (Tmp > DateFin)) NbJours = Day(DateFin) - Day(DateDebut) ' [ Date Début, Date Fin [ If NbJours < 0 Then NbMois = NbMois - 1 NbJours = Day(DateSerial(Year(DateFin), Month(DateFin), 0)) + NbJours End If AMJ = NbAns & " a, " & NbMois & " m et " & NbJours & " j" End Functionet le résultat est sous la forme 1a, 8m et 10j
Code : Sélectionner tout - Visualiser dans une fenêtre à part =amj([datedebut];[datefin])
C'est pour cela que j'ai travaillé de même.
Donc si je veux utiliser ce code je dois utiliser le code que tu fournis dans le n° 2 de ta réponse.
Une question subsiste pour moi, car tu dis qu'il ne peut être utiliser qu'à la SORTIE du contrôle. Si c'est un contrôle calculé ou l'utilisation de ce code dans un Etat.
Merci encore de partager ta science.
Cordialement
bonjour,
ce n'est pas ce que j'ai dit.Donc si je veux utiliser ce code je dois utiliser le code que tu fournis dans le n° 2 de ta réponse.
Une question subsiste pour moi, car tu dis qu'il ne peut être utiliser qu'à la SORTIE du contrôle.
j'ai dit:
donc ceci est permis pour le source contrôle:on ne peut pas non plus utiliser le nom d'un contrôle comme argument d'une fonction dans sa propre source contrôle car cela crée une référence circulaire, on ne peut le faire que sur sortie du contrôle:
mais pas cela:
![]()
Bonjour Tee_Grandbois
En ce qui concerne le code AMJ tout fonctionne car j'avais procédé comme tu l'as fait.
Mais quand j'essaye de faire de même avec TraduireEntire Cf photo n° 1 (sur Etat), j'ai la fenêtre photo n° 2 qui s'ouvre me demandant la valeur de TraduireEntier.
Je ne saisis pas toutes les nuances.
Voyant que TraduireEntier n'est pas reconnu, j'ai essayé de passer par Fonction et ouvrant le module2 où ce trouve le code TraduireEntier, je ne le vois, par contre en module1 je retrouve bien mon AMJ. Où est le blème......
Cordialement
Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération![]()
Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
Gestion sur un planning des présences et des absences des employés
Gestion des rendez-vous sur un calendrier mensuel
Importer un fichier JSON dans une base de données Access :
Import Fichier JSON
Bonjour USER
Je te remercie de me rappeler les propos de Tee_Grandbois. Personnellement je ne suis pas un expert pour savoir créer une fonction car je ne saurais pas par où commencer.
Merci néanmoins d'avoir pris le temps de répondre.
Cordialement
merci
Pas de soucis
Si vous avez créé une sub ou procédure, normalement vous devez avoir dans votre module quelque chose comme :
Il faudrait que vous postiez ce code qu'on y regarde de plus près pour voir s'il y a moyen de renvoyer quelque chose du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 sub TraduireEntier(...) ... end sub
Cdlt,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function TraduireEntier(...) as string ... TraduireEntier="blablabla" end Function
Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération![]()
Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
Gestion sur un planning des présences et des absences des employés
Gestion des rendez-vous sur un calendrier mensuel
Importer un fichier JSON dans une base de données Access :
Import Fichier JSON
Re
Merci de ta réponse ultra rapide.
J'ai récupéré le code sur post # 2 de Gayothttps://access.developpez.com/source...ffresEnLettres
Code : Sélectionner tout - Visualiser dans une fenêtre à part https://access.developpez.com/sources/?page=Conv#ChiffresEnLettres
Il y a plusieurs codes à savoir si je dois tous les mettre ou est-ce que tu vas les voir sur le lien ci-dessus.
Sinon j'ai créé un petit bout de fichier à toutes fin utiles, pour mieux me faire comprendre.
Cordialement
Voici les codes :
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
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 Dim mot$(25), Résultat$, N$ Dim Virgule, B, K$, nombre$, longueur Dim cdu$, C$, D$, U$, Et, Tiret Sub Ajoute(MotSimple$) '--- ajoute un nouveau terme traduit à la chaine résultat If Résultat$ <> "" Then '--- vérifie s'il est nécessaire de coller le nouveau terme au '--- précédent dans le cas des "S" à rajouter, ou des tirets If Right$(Résultat$, 1) = "-" Or _ MotSimple$ = "s" Or MotSimple$ = "-" Then Résultat$ = Résultat$ + MotSimple$ '--- sinon, ajoute le terme après un espace Else Résultat$ = Résultat$ + " " + MotSimple$ End If Else Résultat$ = MotSimple$ End If End Sub Function Equivalent$(Valeur) '--- recherche le mot équivalent à une valeur numérique Select Case Valeur Case Is < 21 Equivalent$ = mot$(Valeur) Case Else Equivalent$ = mot$(18 + (Valeur / 10)) End Select End Function Function Nb2Mot$(Valeur$) Dim a$ '--- initialisation du tableau contenant les mots interprétés mot$(1) = "un" mot$(2) = "deux" mot$(3) = "trois" mot$(4) = "quatre" mot$(5) = "cinq" mot$(6) = "six" mot$(7) = "sept" mot$(8) = "huit" mot$(9) = "neuf" mot$(10) = "dix" mot$(11) = "onze" mot$(12) = "douze" mot$(13) = "treize" mot$(14) = "quatorze" mot$(15) = "quinze" mot$(16) = "seize" mot$(20) = "vingt" mot$(21) = "trente" mot$(22) = "quarante" mot$(23) = "cinquante" mot$(24) = "soixante" '--- récupération de paramètre passé a$ = Valeur$ + " " '--- initialisation des variables de travail N$ = "" Virgule = 0 Résultat$ = "" '--- pour toute la longueur de celui-ci For B = 1 To Len(a$) '--- on extrait chacun de ses caractères K$ = Mid$(a$, B, 1) Select Case K$ '--- gère les montants négatifs Case "-" Ajoute "moins" '--- si ceux-ci sont numériques, on batit la chaine n$ Case "0" To "9" N$ = N$ + K$ '--- sinon, on teste si on est arrivé à une virgule Case Else If Virgule = 1 Then '--- les centimes sont comptés sur 2 digits, réajustés de '--- manière inverse aux euros, puisqu'on lit les unités '--- et dizaines de manière inversée (0,2? = 20c et '--- 0,02?=2c) N$ = Right$("000" + Left$(N$ + "000", 2), 2) If Val(N$) = 0 Then N$ = "" End If '--- on traduit le nombre stocké dans n$ TraduireEntier N$ '--- puis on détermine son unité en fonction de la présence '--- ou non d'une virgule If Virgule = 0 And Val(N$) > 0 Then Ajoute "euro" '--- et on accorde l'unité avec le nombre If Val(N$) > 1 Then Ajoute "s" ElseIf Virgule = 1 And Val(N$) > 0 Then Ajoute "centime" '--- en ajoutant un "s" si nécessaire If Val(N$) > 1 Then Ajoute "s" End If N$ = "" Select Case K$ Case Chr$(13) B = B + 1 Case Is < " " Case ",", "." Virgule = 1 '--- si une valeur en euros est exprimée, et que le '--- nombre de centimes est suffisant pour être traité, '--- on lie les 2 par le mot "et" If Val(a$) <> 0 And _ Val("0." + Mid$(a$, B + 1)) >= 0.01 Then Ajoute "et" Case Else End Select End Select Next Nb2Mot$ = Replace(Résultat$, "quatre-vingts-dix", "quatre-vingt-dix") End Function Sub TraduireEntier(NombreATraduire$) '--- convertit un nombre entier contenu dans une chaine de caractères '--- en son équivalent ordinal nombre$ = NombreATraduire$ If nombre$ <> "" Then '--- si le nombre est 0, on ne perd pas de temps If Val(nombre$) = 0 Then Ajoute "zéro" Else '--- sinon, on convertit celui-ci en une chaine de caractères '--- de longueur multiple de 3, afin de pouvoir la lire par blocs '--- de 3 caractères nombre$ = Right$("000", -((Len(nombre$) Mod 3) <> 0) * (3 - (Len(nombre$) Mod 3))) _ + nombre$ For longueur = Len(nombre$) To 3 Step -3 cdu$ = Left$(nombre$, 3) nombre$ = Right$(nombre$, longueur - 3) '--- on extrait ainsi des ensembles de 3 chiffres, de la '--- gauche vers la droite If cdu$ <> "000" Then '--- dont on tire une valeur de centaines, dizaines et '--- unités C$ = Left$(cdu$, 1) D$ = Mid$(cdu$, 2, 1) U$ = Right$(cdu$, 1) '--- on convertit les unités non muettes pour les '--- centaines If C$ >= "2" Then Ajoute Equivalent$(Val(C$)) '--- et on traite les 1 muets If C$ >= "1" Then Ajoute "cent" '--- en appliquant les règles d'accords pour les '--- centaines If Val(nombre$) = 0 And D$ + U$ = "00" _ And Len(Résultat$) > 4 Then Ajoute "s" End If '--- on analyse si le mot ET est nécessaire (21, 31, '--- 41 ...) Et = (D$ >= "2") And (U$ = "1") '--- ainsi que les tirets pour certains couples '--- dizaines-unités Tiret = ((D$ >= "2") And (U$ > "1") _ Or (D$ >= "1" And U$ >= "7")) And Not Et '--- traitement des valeurs 80-99 If D$ >= "8" Then Ajoute "quatre-vingt" Et = 0 '--- retenue nécessaire pour 90 à 99 If D$ = "8" Then D$ = "0" _ Else D$ = "1": Tiret = True '--- et traitement des unités If U$ > "0" Then Tiret = True Else Ajoute "s" '--- sinon on traite les valeurs 70 à 79 ElseIf D$ = "7" Then Ajoute "soixante" '--- avec une retenue pour les dizaines D$ = "1" If U$ <> "1" Then Tiret = True End If '--- valeurs entre 10 et 16 If (D$ = "1") And (U$ <= "6") Then D$ = "0" U$ = "1" + U$ End If '--- sinon, on gère toutes les autres dizaines If D$ >= "1" Then '--- gère les tirets pour les dizaines composées If Tiret And D$ = "1" _ And Val(Right$(cdu$, 2)) > 19 Then Ajoute "-" End If '--- traduction de la dizaine... Ajoute Equivalent$(Val(D$ + "0")) '--- en accordant l'exception des vingtaines If D$ + U$ = "20" And C$ <> "0" Then Ajoute "s" End If '--- si le mot Et est nécessaire, on l'ajoute If Et Then Ajoute "et" '--- ainsi que le tiret, liant une dizaine et une '--- unité If Tiret Then Ajoute "-" '--- puis on traduit l'unité du nombre If Val(U$) >= 22 Or ((Val(U$) >= 1 And (Val(cdu$) > 1 Or longueur <> 6))) Then Ajoute Equivalent$(Val(U$)) 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 longueur Case 6: Ajoute "mille" Case 9: Ajoute "million" If Val(cdu$) > 1 Then Ajoute "s" Case 12 Ajoute "milliard" If Val(cdu$) > 1 Then Ajoute "s" Case Else End Select End If Next End If End If End Sub
bonsoir User et lmc71,pas si simple à modifier car le code ne renvoie pas le nombre entier en lettres.
par contre, il est possible avec nb2Mot() d'avoir un nombre entier converti en lettres en utilisant Fix():
et si on veut enlever le mot " euro" ou " euros":
Code : Sélectionner tout - Visualiser dans une fenêtre à part nb2mot(fix(MonMontant))
exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part replace(replace(nb2mot(fix(MonMontant))," euros",""),"euro","")
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ?replace(replace(nb2mot(fix(1234.56))," euros",""),"euro","") mille deux cent trente-quatre
Re Tee_GrandBois
Effectivement avec Fix le contrôle reçois le nombre en lettres, mais n'accepte pas les décimales.
Je crois que je vais laisser tomber car cela vous prend votre temps et personnellement je ne sais pas récupérer.
Cordialement
je croyais que tu voulais récupérer uniquement la partie entière du montantEffectivement avec Fix le contrôle reçois le nombre en lettres, mais n'accepte pas les décimales.
dans ce cas, utilises nb2mot() sans le fix() cela te donnera le montant complet !
il suffisait de bien lire le post
Code : Sélectionner tout - Visualiser dans une fenêtre à part =nb2mot(MonMontant)
Re
Un grand merci. Tout fonctionne à merveille tant dans un formulaire que dans un Etat.
Je me suis amusé et plus exactement de comprendre tous les codes utilisés pour arriver à faire cette traduction de chiffres en lettres, c'est inouï.
Je vous félicite.
Merci à tout le Forum et tous les intervenants. Vous êtes super.
Cordialement
PS: Je n'ai pas la possibilité de mettre affaire résolu ?
bonjour lmc71,
malheureusement non: seul l'auteur du post, rifman2015, peut le faire (mis à part, peut être, un modérateur ...)PS: Je n'ai pas la possibilité de mettre affaire résolu ?
Bonjour
Merci pour l'info
En effet, ce n'est pas moi qui ai créé cette discussion.
Bon 8 mai
Cordialement
Partager