Programmation VBA majuscule

Résolu/Fermé
laeti_1364 Messages postés 7 Date d'inscription lundi 2 mai 2022 Statut Membre Dernière intervention 12 mai 2022 - Modifié le 11 juin 2022 à 14:28
ALS35 Messages postés 1033 Date d'inscription jeudi 18 juillet 2019 Statut Membre Dernière intervention 9 janvier 2024 - 11 juin 2022 à 14:23
Bonjour,
Je ne suis pas très douée en programmation vba mais j'ai plus ou moins réussi à avoir ce que je voulais. J'ai réussi à convertir les chiffres monétaire en lettres, seulement tout se met en majuscule sauf "centimes" et il ne me met pas le "ET" entre les euros et les centimes. Pour être plus claire je vous donne un exemple.

actuellement dans mon fichier 32,56€ = TRENTE DEUX EUROS CINQUANTE SIX centimes
le résultat que j'aimerai avoir = TRENTE DEUX EUROS ET CINQUANTE SIX CENTIMES

Voici la fonction
Function chiffrelettre(s)
    Dim a As Variant, gros As Variant
    a = Array("", "UN", "DEUX", "TROIS", "QUATRE", "CINQ", "SIX", "SEPT", _
              "HUIT", "NEUF", "DIX", "ONZE", "DOUZE", "TREIZE", "QUATORZE", "QUINZE", "SEIZE", "DIX SEPT", _
              "DIX HUIT", "DIX NEUF", "VINGT", "VINGT ET UN", "VINGT DEUX", "VINGT TROIS", "VINGT QUATRE", _
              "VINGT CINQ", "VINGT SIX", "VINGT SEPT", "VINGT HUIT", "VINGT NEUF", "TRENTE", "TRENTE ET UN", _
              "TRENTE DEUX", "TRENTE TROIS", "TRENTE QUATRE", "TRENTE CINQ", "TRENTE SIX", "TRENTE SEPT", _
              "TRENTE HUIT", "TRENTE NEUF", "QUARANTE", "QUARANTE ET UN", "QUARANTE DEUX", "QUARANTE TROIS", _
              "QUARANTE QUATRE", "QUARANTE CINQ", "QUARANTE SIX", "QUARANTE SEPT", "QUARANTE HUIT", _
              "QUARANTE NEUF", "CINQUANTE", "CINQUANTE ET UN", "CINQUANTE DEUX", "CINQUANTE TROIS", _
              "CINQUANTE QUATRE", "CINQUANTE CINQ", "CINQUANTE SIX", "CINQUANTE SEPT", "CINQUANTE HUIT", _
              "CINQUANTE NEUF", "SOIXANTE", "SOIXANTE ET UN", "SOIXANTE DEUX", "SOIXANTE TROIS", _
              "SOIXANTE QUATRE", "SOIXANTE CINQ", "SOIXANTE SIX", "SOIXANTE SEPT", "SOIXANTE HUIT", _
              "SOIXANTE NEUF", "SOIXANTE DIX", "SEPTANTE", "SEPTANTE ET UN", "SEPTENTE DEUX", _
              "SEPTENTE QUATRE", "SEPTANTE CINQ", "SEPTANTE SIX", "SEPTANTE SEPT", _
              "SEPTANTE HUIT", "SEPTANTE NEUF", "QUATRE-VINGTS", "QUATRE-VINGT UN", _
              "QUATRE-VINGT DEUX", "QUATRE-VINGT TROIS", "QUATRE-VINGT QUATRE", "QUATRE-VINGT CINQ", _
              "QUATRE-VINGT SIX", "QUATRE-VINGT SEPT", "QUATRE-VINGT HUIT", "QUATRE-VINGT NEUF", _
              "NONANTE", "NONANTE ET UN", "NONANTE DEUX", "NONANTE TROIS", _
              "NONANTE QUATRE", "NONANTE CINQ", "NONANTE SIX", "NONANTE SEPT", _
              "NONANTE HUIT", "NONANTE NEUF")
              
    gros = Array("", "billions", "milliards", "millions", "mille", "EUROS", "billion", _
                 "milliard", "million", "mille", "Euro")
    sp = Space(1)
    chaine = "00000000000000"
    centime = s * 100 - (Int(s) * 100)
    s = Str(Int(s)): lg = Len(s) - 1: s = Right(s, lg): lg = Len(s)
    If lg < 15 Then chaine = Mid(chaine, 1, (15 - lg)) Else chaine = ""
    s = chaine + s
    'billions au centaines
    gp = 1
    For k = 1 To 5
        x = Mid(s, gp, 1): c = a(Val(x))
        x = Mid(s, gp + 1, 2): d = a(Val(x))
        If k = 5 Then
            If t2 <> "" And c & d = "" Then mydz = "Euros" & sp: GoTo fin
            If t <> "" And c = "" And d = "un" Then mydz = "un Euros" & sp: GoTo fin
            If t <> "" And t2 = "" And c & d = "" Then mydz = "d'Euros" & sp: GoTo fin
            If t & c & d = "" Then myct = "": mydz = "": GoTo fin
        End If
        If c & d = "" Then GoTo fin
        If d = "" And c <> "" And c <> "un" Then mydz = c & sp & "cents " & gros(k) & sp: GoTo fin
        If d = "" And c = "un" Then mydz = "CENT " & gros(k) & sp: GoTo fin
        If d = "un" And c = "" Then myct = IIf(k = 4, gros(k) & sp, "un " & gros(k + 5) & sp): GoTo fin
        If d <> "" And c = "un" Then mydz = "cent" & sp
        If d <> "" And c <> "" And c <> "un" Then mydz = c & sp & "cent" + sp
        myct = d & sp & gros(k) & sp
fin:
        t2 = mydz & myct
        t = t & mydz & myct
        mydz = "": myct = ""
        gp = gp + 3
    Next
    d = a(centime)
    If t <> "" Then myct = IIf(centime = 1, " centime", " centimes")
    If t = "" Then myct = IIf(centime = 1, " centime d'Euro", " centimes d 'Euro")
    If centime = 0 Then d = "": myct = ""
    chiffrelettre = t & d & myct
End Function




Merci d'avance à ceux qui prendront le temps de m'aider.

2 réponses

ALS35 Messages postés 1033 Date d'inscription jeudi 18 juillet 2019 Statut Membre Dernière intervention 9 janvier 2024 139
4 mai 2022 à 11:11
Bonjour,

Programme compliqué !
Essaie de remplacer les deux dernières instructions par celles-ci :
Dim e As String
If centime = 0 Then d = "": myct = "": et = "" Else e = " et "
chiffrelettre = UCase(t & e & d & myct)


Cordialement
1
laeti_1364 Messages postés 7 Date d'inscription lundi 2 mai 2022 Statut Membre Dernière intervention 12 mai 2022
4 mai 2022 à 11:25
Merci infiniment, ça fonctionne!
Belle journée à vous
0
brucine Messages postés 18317 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 20 décembre 2024 2 712
4 mai 2022 à 11:12
Bonjour,

C'est normal puisque "centimes" est en minuscules.

Le sujet est traité ici, mais pas en VBA:

https://forums.commentcamarche.net/forum/affich-37516117-convertir-des-chiffres-en-lettres-avec-une-unique-formule
0
Bonjour, j'ai un petit soucis au niveau du VBA.
Par exemple, lorsque j'ai un montant de 178,00€ il m'écris "UN CENT SEPTANTE HUIT EUROS" J'aimerai qu'il écrive uniquement "CENT SEPTANTE HUIT EUROS"

Function chiffrelettre(s)
Dim a As Variant, gros As Variant
a = Array("", "UN", "DEUX", "TROIS", "QUATRE", "CINQ", "SIX", "SEPT", _
"HUIT", "NEUF", "DIX", "ONZE", "DOUZE", "TREIZE", "QUATORZE", "QUINZE", "SEIZE", "DIX SEPT", _
"DIX HUIT", "DIX NEUF", "VINGT", "VINGT ET UN", "VINGT DEUX", "VINGT TROIS", "VINGT QUATRE", _
"VINGT CINQ", "VINGT SIX", "VINGT SEPT", "VINGT HUIT", "VINGT NEUF", "TRENTE", "TRENTE ET UN", _
"TRENTE DEUX", "TRENTE TROIS", "TRENTE QUATRE", "TRENTE CINQ", "TRENTE SIX", "TRENTE SEPT", _
"TRENTE HUIT", "TRENTE NEUF", "QUARANTE", "QUARANTE ET UN", "QUARANTE DEUX", "QUARANTE TROIS", _
"QUARANTE QUATRE", "QUARANTE CINQ", "QUARANTE SIX", "QUARANTE SEPT", "QUARANTE HUIT", _
"QUARANTE NEUF", "CINQUANTE", "CINQUANTE ET UN", "CINQUANTE DEUX", "CINQUANTE TROIS", _
"CINQUANTE QUATRE", "CINQUANTE CINQ", "CINQUANTE SIX", "CINQUANTE SEPT", "CINQUANTE HUIT", _
"CINQUANTE NEUF", "SOIXANTE", "SOIXANTE ET UN", "SOIXANTE DEUX", "SOIXANTE TROIS", _
"SOIXANTE QUATRE", "SOIXANTE CINQ", "SOIXANTE SIX", "SOIXANTE SEPT", "SOIXANTE HUIT", _
"SOIXANTE NEUF", "SEPTANTE", "SEPTANTE ET UN", "SEPTENTE DEUX", _
"SEPTENTE QUATRE", "SEPTANTE CINQ", "SEPTANTE SIX", "SEPTANTE SEPT", _
"SEPTANTE HUIT", "SEPTANTE NEUF", "QUATRE-VINGTS", "QUATRE-VINGT UN", _
"QUATRE-VINGT DEUX", "QUATRE-VINGT TROIS", "QUATRE-VINGT QUATRE", "QUATRE-VINGT CINQ", _
"QUATRE-VINGT SIX", "QUATRE-VINGT SEPT", "QUATRE-VINGT HUIT", "QUATRE-VINGT NEUF", _
"NONANTE", "NONANTE ET UN", "NONANTE DEUX", "NONANTE TROIS", _
"NONANTE QUATRE", "NONANTE CINQ", "NONANTE SIX", "NONANTE SEPT", _
"NONANTE HUIT", "NONANTE NEUF")

gros = Array("", "billions", "milliards", "millions", "mille", "EUROS", "billion", _
"milliard", "million", "mille", "Euro")
sp = Space(1)
chaine = "00000000000000"
centime = s * 100 - (Int(s) * 100)
s = Str(Int(s)): lg = Len(s) - 1: s = Right(s, lg): lg = Len(s)
If lg < 15 Then chaine = Mid(chaine, 1, (15 - lg)) Else chaine = ""
s = chaine + s
'billions au centaines
gp = 1
For k = 1 To 5
x = Mid(s, gp, 1): c = a(Val(x))
x = Mid(s, gp + 1, 2): d = a(Val(x))
If k = 5 Then
If t2 <> "" And c & d = "" Then mydz = "Euros" & sp: GoTo fin
If t <> "" And c = "" And d = "un" Then mydz = "un Euros" & sp: GoTo fin
If t <> "" And t2 = "" And c & d = "" Then mydz = "d'Euros" & sp: GoTo fin
If t & c & d = "" Then myct = "": mydz = "": GoTo fin
End If
If c & d = "" Then GoTo fin
If d = "" And c <> "" And c <> "un" Then mydz = c & sp & "cents " & gros(k) & sp: GoTo fin
If d = "" And c = "un" Then mydz = "CENT " & gros(k) & sp: GoTo fin
If d = "un" And c = "" Then myct = IIf(k = 4, gros(k) & sp, "un " & gros(k + 5) & sp): GoTo fin
If d <> "" And c = "un" Then mydz = "cent" & sp
If d <> "" And c <> "" And c <> "un" Then mydz = c & sp & "cent" + sp
myct = d & sp & gros(k) & sp
fin:
t2 = mydz & myct
t = t & mydz & myct
mydz = "": myct = ""
gp = gp + 3
Next
d = a(centime)
If t <> "" Then myct = IIf(centime = 1, " centime", " centimes")
If t = "" Then myct = IIf(centime = 1, " centime d'Euro", " centimes d 'Euro")
Dim e As String
If centime = 0 Then d = "": myct = "": et = "" Else e = "et "
chiffrelettre = UCase(t & e & d & myct)
End Function
0
ALS35 Messages postés 1033 Date d'inscription jeudi 18 juillet 2019 Statut Membre Dernière intervention 9 janvier 2024 139 > laeti_1364
11 juin 2022 à 14:23
Bonjour,

1) C'est parce que tes valeurs définies sont en majuscule
(a = Array("", "UN", "DEUX", "TROIS", "QUATRE", "CINQ", "SIX", "SEPT", _ )
et que le code vba compare avec la chaîne en minuscule "un"
Soit tu passes toutes tes valeurs en minuscules, ce qui est plus juste à mon avis (et tant qu'à faire en mettant les traits d'union), soit tu places l'instruction
Option Compare Text 
en début de module qui permet de s’affranchir des minuscules et majuscules
2) tu as un autre souci pour les valeurs inférieures à 1 euro avec le mot et qui est ajouté à tort
Remplace l'avant dernière instruction par :
If centime = 0 Then d = "": myct = "": e = "" Else If t <> "" Then e = "et "


Cordialement
0