Une fonction qui met des "0" où il faut et qui beugue

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Quand Excel renvoie des chiffres, il élimine les "0" superflus, mais parfois, dans un tableau, on aimerait les conserver pour une question essentiellement visuelle. Je m'explique :
On décide que tous les chiffres apparaissant sur un tableau aient 4 chiffres après la virgule. Nous obtiendrons ceci :
1,2365 g
1,12 g
1,365 g
1 g

Mais, en fait nous désirerions :
1,2365 g
1,1200 g
1,3650 g
1,0000 g

Comment y parvenir sans passer par le formatage ?
J'ai tenté de bidouiller une fonction :
VB:
Function ZerosFinDeChaine(cel As Range, x As Byte) As String
'Rajoute (éventuellement) des 0 en fin de chaîne
'Magic_Doctor
'- cel : cellule sélectionnée
'- x : nombre de "0" que l'on veut après la ","
'Si x = 4 : - num = 12,7896 ---> ZerosFinDeChaine(12,7896, 4) = "12,7896"
'           - num = 7,12  ---> ZerosFinDeChaine(7,12, 4) = "7,1200"
'           - num = 25 ---> ZerosFinDeChaine(25, 4) = "25,0000"

Dim txt As String, pos As Byte, largo1 As Byte, largo2 As Byte
Dim beforvirgule As String, aftervirgule As String, i As Byte

On Error Resume Next 'au cas où le nombre de décimales après la "," est supérieur à x
txt = CStr(cel): txt = Replace(txt, ".", ",") 'transforme le chiffre en chaîne de caractères et remplace le "."
                                              '(équivalent de la "," chez les Anglo-Saxons) par ","
If cel = CInt(cel) Then '"cel" contient un entier
    ZerosFinDeChaine = txt & "," & Application.Rept("0", x)
Else
    pos = InStr(txt, ",") 'position de la virgule
    largo1 = Len(txt) - pos 'nombre de caractères après la ","
    beforvirgule = Left(txt, pos - 1) 'texte avant la ","
    aftervirgule = Right(txt, largo1) 'texte après la ","
    largo2 = Len(aftervirgule) 'longueur du texte après la ","
    i = x - largo2
    If i > 0 Then aftervirgule = aftervirgule & Application.Rept("0", i)
    ZerosFinDeChaine = beforvirgule & "," & aftervirgule
End If
End Function

La fonction semble bien marcher sauf si le nombre de chiffres avant la virgule est supérieur à x (apparaît alors un "truc" bizarre avec 2 virgules...).
Je tourne en rond et ne comprends pas pourquoi.
Je ne doute pas un instant qu'il puisse y avoir un moyen plus simple.
En attendant, merci d'avance pour qui m'aidera à résoudre ce problème.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Une fonction qui met des "0" où il faut et qui beugue

Bonjour pierrejean, re hola job,

job, effectivement tu es en droit de te poser des questions, puisque en un tournemain tu résous le problème du formatage de la 2ème colonne de la ComboBox. Je ne pensais pas que ce serait aussi tordu, mais pierrejean a compris, vu que cela avait un rapport avec un autre fil.
Il se trouve que toutes ces valeurs sont récupérées dans un dictionnaire où le formatage de la 2ème colonne se perdait. Je me suis alors dit que le meilleur moyen de contourner ce problème était, via une fonction ad hoc, de reformater ces items dans le dictionnaire. Ma fonction, même bancale pour certaines valeurs sans importance pour des mv, marchait alors très bien pour le formatage de la 2ème colonne du ComboBox. En revanche, par la suite, c'était un peu galère... La solution de pierrejean résout parfaitement le problème.
J'aurais dû, en effet, être plus explicite, mais je ne me doutais pas un instant que je m'égarais dans une mauvaise direction, alors qu'avec le rajout d'un "détail" dans la sentence :
VB:
dico(x) = dico(x) & Format(Range(col2 & n), "0.0000") & " g/mL" & "|"
le problème se résolvait instantanément.

Merci à tous pour votre collaboration.
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : Une fonction qui met des "0" où il faut et qui beugue

Re

Je serais plus prudent à l'avenir !!
J'ignorais cette propriété
Merci à Dranreb et et à toi
Magic_Doctor pourra donc utiliser:

Code:
dico(x) = dico(x) & Range(col2 & n).Text & "|"

la plus concise des ecritures
 

Discussions similaires

Statistiques des forums

Discussions
312 294
Messages
2 086 902
Membres
103 404
dernier inscrit
sultan87