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.
 

Misange

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

Bonjour

J'abonde dans le sens de Mutzik (coucou !). Qui plus est par ta méthode tu transformes tes nombres en texte. Je sens qu'ensuite tu vas revenir demander comment addition des textes entre eux :)
IL est autrement plus sûr de formater la cellule selon ce que tu souhaites avec un format de nombre 1,0000
 

jmps

Nous a quitté
Repose en paix
Re : Une fonction qui met des "0" où il faut et qui beugue

Bonjour à tous,

Je dirais même plus. Avec un format de nombre personnalisé comme ça :
# ###,0000" g"
On va avoir les 4 décimales, le "g" en bout de chaîne et on reste en format nombre pour pouvoir additionner, soustraire, etc...
 

Modeste geedee

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

Bonsour®
Comment y parvenir sans passer par le formatage ?

Je ne doute pas un instant qu'il puisse y avoir un moyen plus simple.

:confused:
plus simple que le formatage ????

:cool: Coluche disait :
pourquoi est-il conseillé de ceuillir les cerises avec la queue ??
c'est déja suffissament difficile avec la main ...
 

job75

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

Bonjour à tous,

Bien d'accord avec mes petits camarades et Coluche :)

Mais pour répondre strictement au problème posé :

Code:
Function ZerosFinDeChaine(txt$, x As Byte) As String
Dim i%, t$, n$
If txt = "" Then Exit Function
For i = 1 To Len(txt)
  t = Mid(txt, i, 1)
  If Not IsNumeric(t) And t <> "," And t <> "." Then Exit For
Next
t = Replace(Left(txt, i - 1), ",", ".")
n = IIf(i = 1, "", Format(Val(t), "0." & String(x, "0")))
ZerosFinDeChaine = n & Mid(txt, i)
End Function
Cette fonction sera utile si les données d'origine ne sont pas des nombres...

Fichier joint.

A+
 

Pièces jointes

  • Décimales(1).xls
    36 KB · Affichages: 47

Magic_Doctor

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

Hummm,

Je m'attendais à vos réactions. Pourquoi faire compliqué quand on peut faire simple ? Magic_Doctor disjoncte complètement. Il a dû forcer sur le mate...
Petite explication :
Je rentre des données dans une colonne qui est formatée ainsi : 0,0000 "g/mL". Tous les chiffres, avec leur suffixe, sont parfaitement alignés. Bref, c'est bô !
Je veux récupérer certains de ces chiffres dans une ComboBox multicolonnes et j'obtiens, dans la 2ème colonne, par ex. :
VB:
acide citrique       1,2365 g/mL
huile de croton      0,23 g/mL
eau                  1 g/mL
Alors que vous vous doutez bien que je voudrais :
VB:
acide citrique       1,2365 g/mL
huile de croton      0,2300 g/mL
eau                  1,0000 g/mL
J'ai pensé à forcer le formatage dans la ComboBox (et ça marche) au moyen d'une fonction qui marche presque à tous les coups, sauf dans le cas de figure expliqué plus haut. Ce n'est pas gravissime car, dans mon cas, jamais on a vu, du moins sur cette planète, des mv avec autant de chiffres avant la virgule. Mais quitte à faire une fonction, autant faire en sorte qu'elle marche dans toutes les situations. Question d'honneur !
Bien sûr, s'il y a un moyen plus simple pour la présentation dans la 2ème colonne de la ComboBox, je suis preneur.
 

Dranreb

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

Bonjour à tous.
Indépendament de la solution de job75, l'objet Range est équipé d'une propriété Text. C'est une propriété String en lecture seule qui représente le texte affiché dans la cellule après application de son format. Si donc ça s'affiche bien dans une cellule Cel, il suffit d'affecter Cel.Text au lieu de Cel.Value à la colonne de votre ComboBox.
Mais on peut aussi bien sûr y affecter Format(Cel.Value, "0.0000") & " g/ml"
Cordialement.
 
Dernière édition:

Magic_Doctor

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

Bonjour job, Dranreb,

Sitôt m'être expliqué au sujet de mon projet, disons, "rocambolesque", j'ai essayé ta fonction qui marche très bien.
C'est quand même bizarre que pour un truc, ma foi, aussi simple, ma fonction achoppe et qu'il faille traiter du texte et non des nombres. Ce n'est pas bien grave mais c'est curieux.
En revanche s'il y a un autre moyen pour parvenir à ce que je voulais en ce qui concerne la présentation de la liste de la ComboBox, j'aimerais bien alors le connaître.

Merci job et bonne après-midi.
 

pierrejean

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

Bonjour à tous

Comme je crois savoir ou se situe ton pb cher Magic_Doctor , je te propose

Code:
dico(x) = dico(x) & Format(Range(col2 & n), "0.0000") & " g/mL" & "|"

Et je gage que tu sauras ou le mettre
 

job75

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

Re, salut Bernard, [Edit] salut Pierre

J'avoue ne pas trop comprendre car il n'y a rien de spécial à faire.

Sur Excel 2003, la ComboBox affiche automatiquement les nombres au format des cellules sources.

Fichier joint.

A+
 

Pièces jointes

  • Décimales ComboBox(1).xls
    28.5 KB · Affichages: 37
  • Décimales ComboBox(1).xls
    28.5 KB · Affichages: 44
  • Décimales ComboBox(1).xls
    28.5 KB · Affichages: 42
Dernière édition:

pierrejean

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

Re

Salut Gerard

Vrai dans le cas du combobox dans la feuille
Pas dans celui du combobox dans un userform

D'ailleurs pour envisager le cas ou les formats seraient différents dans la cellule il faudrait peut-être envisager autre chose
Je propose ceci à Magic_Doctor qui fonctionne pour un format appliqué à toute la colonne et je teste les comportements avec des formats differents

Code:
dico(x) = dico(x) & Format(Range(col2 & n), Range(col2 & n).NumberFormat) & "|"
 

Pièces jointes

  • Décimales ComboBox(1).xls
    54.5 KB · Affichages: 54
  • Décimales ComboBox(1).xls
    54.5 KB · Affichages: 44
  • Décimales ComboBox(1).xls
    54.5 KB · Affichages: 42

pierrejean

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

Re

Voila qui permet de choisir
 

Pièces jointes

  • Décimales ComboBox(1).xls
    61 KB · Affichages: 37
  • Décimales ComboBox(1).xls
    61 KB · Affichages: 38
  • Décimales ComboBox(1).xls
    61 KB · Affichages: 40

job75

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

Re,

Vrai dans le cas du combobox dans la feuille
Pas dans celui du combobox dans un userform

Désolé de te contredire Pierre, mais c'est pareil dans les 2 cas.

Simplement alimenter la Combo par ListFillRange (feuille) ou RowSource (USF).

Et si l'on veut utiliser la méthode AddItem :

Code:
Private Sub UserForm_Initialize()
For n = 1 To 3
 Me.ComboBox1.AddItem Range("A" & n).Text
 Me.ComboBox1.List(Me.ComboBox1.ListCount - 1, 1) = Range("B" & n).Text
Next
End Sub
Avec la propriété Text comme disait Dranreb.

A+
 

Discussions similaires

Statistiques des forums

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