Conversion de nombres écrits en chiffres vers écriture en texte

Toine45

XLDnaute Junior
Bonjour à tous
Je sollicite votre aide pour finir une macro Excel 2003 (mon niveau étant assez faible)
Je cale sur la conversion de nombres écrits en chiffres vers écriture en texte, lorsque les cellules contiennent également du texte.
Je joins mon fichier où vous trouverez la macro de conversion (trouvée sur le net), ainsi que la macro de lancement (la mienne) toute 2 situées dans le module 2

Voir l'onglet "Procédure" de mon fichier pour la piste que j'envisage (mais ne sais pour l'instant pas faire)
(je fais les tests dans la colonne B de l'onglet Travail)

Exemples :
123 => cent vingt trois (OK : fonctionne)

45,87 => quarante cinq virgule quatre vingt sept (OK : fonctionne)

Chose => N'est pas à convertir (OK, pas de problème)


Toto 45 => Impossible à convertir
(désiré : Toto quarante cinq)

64,52 Machin 5684 => Impossible à convertir
(désiré : soixante quatre virgule Machin cinq mille six cent quatre vingt quatre

Truc958,23Titi456toto6.38 => Impossible à convertir
(désiré : Truc neuf cent cinquante huit virgule vingt trois Titi quatre cent cinquante six toto six virgule trente huit
En pièce jointe: mon fichier d'essai (la macro est dans le module 2) (celle du module 1 ignore les 0 des décimales)

Pour ceux que ça intéresse, cette macro est tout à fait fonctionnelle, dès l'instant où il n'y a pas de texte
(Ne conserver que le module 2.)

2 ème chalange : je désirerais, si c'est possible inclure Toute la macro, uniquement dans un userform, sans se servir de module.

Merci d'avance pour votre aide et bon week-end
 

Pièces jointes

  • Chiffres_Vers_Lettres19.xls
    110 KB · Affichages: 53
Dernière édition:

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour Toine45,

Utilisez cette nouvelle fonction :

Code:
Function ConvNumberLetterWithText$(t)
t = Replace(t, ".", Mid(1 / 10, 2, 1)) 'séparateur décimal de l'ordi
For Each t In Split(Application.Trim(t)) 'l'espace est le séparateur
  If IsNumeric(t) Then t = ConvNumberLetter(CDbl(t))
  ConvNumberLetterWithText = ConvNumberLetterWithText & " " & t
Next
ConvNumberLetterWithText = Mid(ConvNumberLetterWithText, 2)
End Function
Elle est utilisée en colonne D du fichier joint.

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres(1).xls
    125.5 KB · Affichages: 46
Dernière édition:

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Re,

La fonction ConvNumberLetter ne traite que 2 décimales.

Cette fonction traite toutes les décimales, quel que soit leur nombre :

Code:
Function ConvNumberLetterWithText$(t)
Dim s, i%
t = Replace(t, ",", ".")
For Each t In Split(Application.Trim(t)) 'l'espace est le séparateur
  s = Split(t, ".")
  If IsNumeric(s(0)) Then
    If UBound(s) Then
      t = IIf(Val(s(1)), s(1), "")
      If Len(t) = 1 Then t = t & 0 'facultatif...
      For i = 1 To Len(t) 'compte les zéros
        If Mid(t, i, 1) <> "0" Then Exit For
      Next
      t = ConvNumberLetter(Val(s(0))) & " virgule " & _
        Application.Rept("zéro ", i - 1) & ConvNumberLetter(Val(t))
    Else
      t = ConvNumberLetter(Val(t))
    End If
  End If
  ConvNumberLetterWithText = ConvNumberLetterWithText & " " & t
Next
ConvNumberLetterWithText = UCase(Mid(ConvNumberLetterWithText, 2, 1)) _
  & Mid(ConvNumberLetterWithText, 3)
End Function
J'en ai profité pour faire commencer le résultat par une majuscule.

Fichier (2).

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres(2).xls
    118.5 KB · Affichages: 52
Dernière édition:

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour Toine45, le forum,

On peut aussi paramétrer (argument facultatif) le nombre maximum de décimales à traiter :

Code:
Function ConvNumberLetterWithText$(t, Optional Ndec As Byte = 0)
Dim s, i%
t = Replace(t, ",", ".")
For Each t In Split(Application.Trim(t)) 'l'espace est le séparateur
  s = Split(t, ".")
  If IsNumeric(s(0)) Then
    If UBound(s) Then
      If Ndec And Len(s(1)) > Ndec Then
        t = Format(Val(t), "0." & String(Ndec, "0"))
        s(0) = Left(t, Len(t) - Ndec - 1)
        s(1) = Right(t, Ndec)
      End If
      t = IIf(Val(s(1)), s(1), "")
      If Len(t) = 1 Then t = t & 0 'facultatif...
      For i = 1 To Len(t) 'compte les zéros
        If Mid(t, i, 1) <> "0" Then Exit For
      Next
      t = ConvNumberLetter(Val(s(0))) & " virgule " & _
        Application.Rept("zéro ", i - 1) & ConvNumberLetter(Val(t))
    Else
      t = ConvNumberLetter(Val(t))
    End If
  End If
  ConvNumberLetterWithText = ConvNumberLetterWithText & " " & t
Next
ConvNumberLetterWithText = UCase(Mid(ConvNumberLetterWithText, 2, 1)) _
  & Mid(ConvNumberLetterWithText, 3)
End Function
Fichier (3).

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres(3).xls
    141.5 KB · Affichages: 43
Dernière édition:

Toine45

XLDnaute Junior
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour Job75 ...et tous les autres contributeurs du forum
Merci de t' être penché sur mon problème

J'ai testé ta proposition : ça fonctionne bien: tu dois avoir de nombreuses années de pratique des formules Excel.
J'ai remarqué, cependant un cas où ça ne fonctionne pas : c'est lorsque les lettres et les chiffres se touchent (pas d'espace séparateur) y a t'il un moyen de contourner ce problème (cas logiquement assez rare, mais qui pourrais cependant arriver) ?

Tu es parti sur un fonctionnement par formule : ça peut aider pas mal de monde, moi aussi d'ailleurs, c'est un plus, mais au départ, ce n'est pas trop ce que je recherchais.

Ce que j'essaie de faire, c'est une conversion par macro, dans un premier temps, puis l'intégration de cette macro, dans un userform multi pages, ceci sans utiliser aucun module, les macros devants être contenues uniquement dans l'userform ou son bouton de lancement, pour en faire un "couteau suisse" de plusieurs macros regroupées uniquement dans cet userform.
(J'en profite pour remercier encore Robert pour son aide pour le début de cet userform, que j'ai bien fait évoluer depuis : c'est vraiment un pro en ce domaine : tout est commenté (très instructif pour les débutants)
Sur mon fichier, la macro se lance par le bouton vert, qui lance la macro située dans le module 2.

Ce problème va certainement faire chauffer les neurones de quelques contributeurs ce week-end
(Les deux miens sont déjà en surchauffe depuis quelques jours.)

Je vais déjà passer quelque jours à étudier tes propositions et essayer de les comprendre, de les reproduire et éventuellement les adapter à mes besoins finaux.
Là ou tu passe une heure sur un problème, il me faut bien plusieurs jours (voir mois) pour arriver à un résultat approchant.

Sur ce, bon week-end à tous
et merci encore pour tous le temps passé sur ce problème
 

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Re,

Si vous voulez une procédure Sub pour obtenir les résultats c'est très simple :

Code:
Private Sub CommandButton1_Click()
Dim Ndec As Byte, tablo, resu$(), i&
Ndec = [B1] 'nombre maximum de décimales
tablo = Range("A3", Range("A" & Rows.Count).End(xlUp)(3))
ReDim resu(1 To UBound(tablo), 1 To 1)
For i = 1 To UBound(tablo)
  resu(i, 1) = ConvNumberLetterWithText$(tablo(i, 1), Ndec)
Next
[B3].Resize(UBound(resu)) = resu
Rows(UBound(resu) + 3 & ":" & Rows.Count).Delete
End Sub
Au lieu d'utiliser la fonction dans une cellule on l'utilise dans la macro.

Fichier (4).

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres(4).xls
    145.5 KB · Affichages: 42

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Re,

Pour la question des espaces, cette fonction permet de les insérer :

Code:
Function Espaces(t As Variant) As Variant
'insère des espaces entre les textes et les nombres
Dim i%, x$, y$
If Not IsNumeric(t) Then
  t = Replace(t, " ", "")
  For i = Len(t) - 1 To 1 Step -1
    x = Mid(t, i, 1): y = Mid(t, i + 1, 1)
    If IsNumeric(x) And Not IsNumeric(y) _
      Or IsNumeric(y) And Not IsNumeric(x) Then _
        t = Application.Replace(t, i + 1, 0, " ")
  Next
  t = Replace(Replace(t, " .", "."), ". ", ".")
  t = Replace(Replace(t, " ,", ","), ", ", ",")
End If
Espaces = t
End Function
Fichier (5).

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres(5).xls
    154.5 KB · Affichages: 31

Toine45

XLDnaute Junior
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Merci Job75 pour tout le temps passé là dessus
ça fonctionne impécablement bien.
Je vais essayer de cogiter sur toutes ces réponses ces prochains jours pour en comprendre le fonctionnement et organiser tout ça à ma sauce pour essayer de la faire fonctionner à partir d'un userform.
Je n'aurais jamais trouvé ça tout seul, surtout en si peu de temps ! on vois qu'il y a de nombreuses années de pratique assidue.
Bonne soirée
 

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour Toine45, le forum,

En cas d'espaces entre les textes il vaut mieux :

Code:
Function Espaces(t As Variant) As Variant
'insère des espaces entre les textes et les nombres
Dim i%, x$, y$
If Not IsNumeric(t) Then
  t = Application.Trim(t) 'SUPPRESPACE
  For i = Len(t) To 2 Step -1
    x = Mid(t, i - 1, 1): y = Mid(t, i, 1)
    If IsNumeric(x) And Not IsNumeric(y) _
      Or IsNumeric(y) And Not IsNumeric(x) Then _
        t = Application.Replace(t, i, 0, " ")
  Next
  t = Replace(t, " . ", ".")
  t = Replace(t, " , ", ",")
  t = Application.Trim(t)
End If
Espaces = t
End Function
Fichier (6).

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres(6).xls
    114 KB · Affichages: 48

Toine45

XLDnaute Junior
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour à tous
J'ai pas mal avancé sur mon projet de conversion (pour mon faible niveau) mais j'aurais encore besoin de votre aide, si ce n'est pas trop abuser.

J'ai 2 petits soucis + 1 gros.
Les petits :
Dans ma macro, Avec la souris, je sélectionne une plage dans une colonne quelconque (exemple colonne B) Si je sélectionne 2 cellules ou plus, ça fonctionne impeccable. Au cas où je ne veux sélectionner qu'une seule cellule : la conversion ne se fait pas Je ne vois pas d'où peut venir ce problème. … Avez-vous une idée pour y remédier ?

Je souhaite effectuer le choix de la virgule par l'intermédiaire d'une InputBox, afin de choisir moi-même selon le séparateur désiré (exemple : " virgule" ou ", "ou"&" ou "et" ou tiret ….
Je n'arrive pas à faire fonctionner correctement, car mon InputBox s'ouvre à chaque lignes de ma sélection (au lieu de ne s'ouvrir qu'une seule fois) au fur et à mesure de l'exécution de la macro. Je ne dois pas le mettre à la bonne place. J'ai essayé plusieurs possibilités sans succès… Pouvez-vous me corriger ma macro ?

Mon gros souci :
Dans un second temps, Je désire intégrer cette macro entièrement dans un Userform .
J'ai essayé de l'intégrer dans le bouton (CommandButton5) mais ça me met des erreurs que je n'arrive pas à contrer et ne fonctionne donc pas (certainement dû au fait que ma macro est composée de plusieurs macros ou fonctions, private fonctions…. )
Es-ce réalisable, si oui, comment faire ?
Je souhaiterais que Tout le code soit intégré dans l'userform et qu'il n'y ait plus rien dans le module.

Merci beaucoup à tous ceux qui se pencheront sur mes soucis
Et un gros merci à Job75 qui m'a déjà beaucoup aidé à avancer
 

Pièces jointes

  • Chiffres_Vers_Lettres28.xls
    100.5 KB · Affichages: 34

Toine45

XLDnaute Junior
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour à tous
J'ai réussi à solutionner la partie qui me semblait la plus difficile (l'intégration dans un UserForm) ça fonctionne apparemment bien.

Bouton de lancement de l'userform : UserForm Macros (Bouton jaune)
Bouton de lancement de la macro : Chiffres vers Lettres (Bouton rose)

J'ai cependant encore quelques soucis sur 3 points (Le premier point est le plus important pour moi, les autres étant secondaires) :

Possibilité (en option par Inputbox) de transcrire la "," en "virgule" (ou l'inverse) ou pouvoir choisir n'importe quel autre séparateur (exemple " * " ou " – ") en incluant un espace avant et après (exemple : 25,14 => Vingt cinq virgule quatorze ou Vingt cinq & quatorze
Contournement temporaire : Fonction Rechercher " virgule" et Remplacer par "," ou modifier la macro (dernière partie "Function ConvNumberLetterWithText")

L'InputBox qui renvoie la variable "vir" est déjà intégrée (à 2 places : Bouton 5 et dernière fonction) dans l'Userform (pas forcément au bon endroit) mais désactivée (ne fonctionne pas correctement)
- dans un cas, la box s'affiche correctement et une fois renseignée, la variable est ignorée ;
- dans l'autre cas ça fonctionne mais la box s'affiche à chaque ligne traitée et il faut la renseigner à chaque fois !
Les autres essais que j'ai faits n'ont pas été concluants, je n'ai donc gardé que ces 2 emplacements

Problèmes secondaires :
Si l'on ne sélectionne qu'une seule cellule, la conversion ne se fait pas (2 et + = OK)
Contournement temporaire : Sélectionner systématiquement au moins 2 cellules ou copier la cellule dans une partie vide de la feuille, convertir une plage de 2 cellules et recopier la cellule convertie à sa place.

Si l'on sélectionne 2 (ou plus) plages séparées (avec la touche CTRL) : la conversion ne se fait pas (certainement dû au fait que l'on utilise un tableau) est-ce contournable ?
Contournement temporaire : Convertir chaque plage une par une.

Quelqu'un aurait il une solution à me proposer ?

Je joins mon fichier modifié au cas où l'Userform intéresserait quelqu'un
Merci d'avance
 

Pièces jointes

  • Chiffres_Vers_Lettres29.xls
    96.5 KB · Affichages: 49

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour Toine45,

J'avoue que votre projet ne me plaît guère.

Sélectionner des plages dans la feuille n'est pas une très bonne idée, d'autant que vous avez dit vous-même que vous vouliez tout faire avec l'UserForm...

Voyez le fichier joint, le code de l'USF est facile à comprendre :

Code:
Private Sub CheckBox1_Click()
Dim t$
t = Espaces(ListBox1)
If CheckBox1 Then t = ConvNumberLetterWithText(t, Val(ComboBox1))
t = IIf(OptionButton1, UCase(t), IIf(OptionButton2, LCase(t), t))
If OptionButton3 Then t = UCase(Left(t, 1)) & Mid(t, 2)
If OptionButton4 Then t = Application.Proper(t)
TextBox1 = t
End Sub

Private Sub ComboBox1_Change()
CheckBox1_Click
End Sub

Private Sub ListBox1_Click()
CheckBox1_Click
End Sub

Private Sub OptionButton1_Change()
CheckBox1_Click
End Sub

Private Sub OptionButton2_Change()
CheckBox1_Click
End Sub

Private Sub OptionButton3_Change()
CheckBox1_Click
End Sub

Private Sub UserForm_Initialize()
Dim i&
ComboBox1.AddItem "-"
For i = 1 To 10
  ComboBox1.AddItem i
Next
ComboBox1 = "-"
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
  If Cells(i, 1) <> "" Then ListBox1.AddItem Cells(i, 1)
Next
End Sub
Une chose cependant un peu délicate, il faut utiliser ByVal dans la fonction :

Function ConvNumberLetterWithText$(ByVal t, Optional Ndec As Byte = 0)

Fichier joint.

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres avec USF(1).xls
    136 KB · Affichages: 37
Dernière édition:

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Re,

Une amélioration avec l'ajustement automatique des largeurs de la TextBox et de l'UserForm :

Code:
Private Sub CheckBox1_Click()
Dim t$
t = Espaces(ListBox1)
If CheckBox1 Then t = ConvNumberLetterWithText(t, Val(ComboBox1))
t = IIf(OptionButton1, UCase(t), IIf(OptionButton2, LCase(t), t))
If OptionButton3 Then t = UCase(Left(t, 1)) & Mid(t, 2)
If OptionButton4 Then t = Application.Proper(t)
TextBox1.AutoSize = True
TextBox1 = t
TextBox1.AutoSize = False
If TextBox1.Width < 388 Then TextBox1.Width = 388
Me.Width = TextBox1.Width + 14
End Sub
Fichier (2).

Bonne nuit et A+
 

Pièces jointes

  • Chiffres_Vers_Lettres avec USF(2).xls
    158.5 KB · Affichages: 41

job75

XLDnaute Barbatruc
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour Toine45, le forum,

Maintenant les boutons Sauvegarder et Effacer permettent de renseigner la feuille de calcul.

La ListBox a 3 colonnes :

- la 1ère (masquée) contient les numéros de lignes

- la 2ème les repères "x"

- la 3ème les libellés à traiter.

Fichier (3).

A+
 

Pièces jointes

  • Chiffres_Vers_Lettres avec USF(3).xls
    172 KB · Affichages: 48

Toine45

XLDnaute Junior
Re : Conversion de nombres écrits en chiffres vers écriture en texte

Bonjour Job75
J'ai regardé ce que tu me propose
Il y a des choses intéressantes (notamment, le fait de pouvoir convertir le texte en minuscule, ou majuscule ou nom propre en même temps que la conversion en lettres) mais ça diverge de ce que je désire effectuer.
Cet Userform me sera certainement utile pour une autre utilisation indépendante du projet que je souhaite pour l'instant réaliser (j'ai déjà une idée d'utilisation qui commence à germer).

Au départ, ce n'est pas ce que je cherchais à faire
Dans mon Userform, les boutons de changement de casse sont des macros totalement indépendantes (J'aurais tout aussi bien y inclure une macro de modification de format de feuille avec ou sans quadrillage etc.… et d'autres viendrons d'ailleurs s'y ajouter par la suite)

Le but de ma macro de conversion est de convertir une plage sélectionnée à la souris, dans une colonne quelconque (Colonne D ou colonne F ou colonne B, selon ce que je sélectionne)
Exemple : $G$11:$G$14 ou une plage de plusieurs colonnes (exemple : $D$4:$E$12)

J'aurais souhaité avoir la possibilité de ne sélectionner aussi qu'une seule cellule d'une colonne quelconque. (Exemples : $A$11 ou $E$56)

Je cherche surtout à pouvoir modifier mon Userform afin de pouvoir choisir le séparateur (en gardant " virgule " par défaut)
Le plus pratique pour moi est le choix par InputBox où l'on peut inscrire ce que l'on veut
(Exemple : ", " ou " & " ou " / " ou " – " ou " + " ou " € " ou " plus " etc. …)
Si le choix par Inputbox n'est pas possible, à la limite, je pourrais éventuellement me contenter avec des boutons d'options mais ça m'obligerais à les prédéfinir avant et j'aurais moins de possibilités qu'avec une InputBox.

Je pense que je ne suis pas loin du résultat, mais mon code pour l'InputBox ne doit pas être au bon endroit (Je l'ai désactivé pour l'instant) (Voir le dernier fichier que j'ai joint hier : Chiffres_Vers_Lettres29.xls‎ )

Pour la sélection Multi plage, c'est juste un plus que je voulais mettre si pas trop compliqué, mais je peux facilement m'en passer.

Bon après-midi
Cordialement
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote