XL 2010 Fonction qui place le/les séparateur(s) de milliers

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'essaie, sans succès, de rédiger une fonction (VBA) qui traite un nombre entier ou décimal, de telle sorte que celui-ci présente, le cas échéant, 1 ou plusieurs points (à la française ou à l'espagnole !!!) qui séparent les milliers.
Exemples :
f(1256) = 1.256
f(235686,693) = 235.686,693
f(1256877,035) = 1.256.877,035

Merci d'avance pour toute aide.
 

job75

XLDnaute Barbatruc
Avec des nombres décimaux :
VB:
Function Milliers(v As Double) As String
Milliers = Replace(Format(Int(CDec(v)), "#,##0"), Chr(160), ".")
If InStr(v, Application.DecimalSeparator) Then Milliers = Milliers & Mid(v, InStr(v, Application.DecimalSeparator))
End Function
 

Pièces jointes

  • Milliers(2).xlsm
    16.3 KB · Affichages: 5

mapomme

XLDnaute Barbatruc
Supporter XLD
Ou bien encore, plus officiel sur le site du Bureau International des Poids et Mesures :

La Résolution 10 de la 22e Conférence générale des poids et mesures (2003) : Lien
1647988574872.png
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

1- Peux-tu nous fournir le code de ta fonction ?

2- Pourquoi développer une fonction et ne pas simplement utiliser la mise en forme monétaire ?


Remarque : en français le séparateur de milliers est l'espace et non le point. ;)
Bonsoir Marcel32,

Pas de code de fonction, puisque je n'ai pas réussi à la faire.
Je veux récupérer ce nombre sous forme de chaîne qui, par la suite, sera incluse dans une autre chaîne.
Oui, c'est vrai, en français on met un espace. Personnellement, je trouve que le point est plus parlant. Mais ce que je voulais éviter à tout prix, c'est la virgule.
 

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

La solution de job75 (post #4) m'a permis de compléter une fonction que job75 avait rédigée à ma demande :
VB:
Function ZerosFinDeChaine$(num As Variant, x As Byte)
'**********************************************************************************************************************
'Complète, avec des 0, un nombre décimal, de telle sorte qu'il y ait un nombre déterminé de chiffres après la virgule
'job75
'**********************************************************************************************************************
'- num : un nombre
'- x   : le nombre de chiffres voulu après la virgule
'Exemple : si x = 5 => num = 2          --> 2,00000
'                      num = 2,203      --> 2,20300
'                      num = 2,02454524 --> 2,02455

    Dim signe$, Txt$, i%, t$, n$

    On Error Resume Next 'pour que n'apparaisse pas #¡VALOR! si num = ""
    'If num = "" Then Exit Function
    signe = IIf(num = Abs(num), "", "-")
    num = FormatNumber(num, 15) 'pour éviter que ne s'impose la notation scientifique
    Txt = CStr(Abs(num))
    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")))
    If x = 0 Then n = Replace(n, ",", "") 'pas de décimale après la virgule donc pas de virgule
    ZerosFinDeChaine = signe & n & Mid(Txt, i)
End Function
J'ai donc fait quelques rajouts, comme j'ai pu, pour obtenir une chaîne avec des points séparateurs de milliers :
VB:
Function ZerosFinDeChaine$(num As Variant, x As Byte, Optional sep As Boolean = True)
'**********************************************************************************************************************************
'Complète s'il le faut, avec des 0, un nombre décimal, de telle sorte qu'il y ait un nombre déterminé de chiffres après la virgule
'Place éventuellement des points séparateurs de milliers
'job75 / Magic_Doctor
'**********************************************************************************************************************************
'- num   : un nombre
'- x     : le nombre de chiffres voulu après la virgule
'Exemple : si x = 2 & sep = True ou omis => num = 2               --> 2,00
'                                           num = 125752,22       --> 125.752,22
'                                           num = -202454524565,5 --> -202.454.524.565,50
'          si sep = False il n'y aura pas de point(s) séparateur(s) de milliers

    Dim signe$, Txt$, i%, t$, n$, nb$, largo As Byte, pos As Byte, gauche$, droite$, millier$

    On Error Resume Next 'pour que n'apparaisse pas #¡VALOR! si num = ""
    'If num = "" Then Exit Function
    signe = IIf(num = Abs(num), "", "-")
    num = FormatNumber(num, 15) 'pour éviter que ne s'impose la notation scientifique
    Txt = CStr(Abs(num))
    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")))
    If x = 0 Then n = Replace(n, ",", "") 'pas de décimale après la virgule donc pas de virgule
    
    nb = n & Mid(Txt, i)
    largo = Len(nb)
    pos = InStr(1, nb, ",")
    gauche = Left(nb, pos - 1)
    droite = Right(nb, largo - pos)
    
    millier = Replace(Format(CDec(gauche), "#,##0"), Chr(160), ".")
    If InStr(gauche, Application.DecimalSeparator) Then millier = millier & Mid(gauche, InStr(gauche, Application.DecimalSeparator))
    
    ZerosFinDeChaine = IIf(sep, signe & millier & IIf(x = 0, "", ",") & droite & Mid(Txt, i), signe & n & Mid(Txt, i))
End Function
En revanche, je n'ai pas compris Mid(Txt, i).
Je pense que tout ça pourrait se simplifier.
 

Magic_Doctor

XLDnaute Barbatruc
Que j'écrive au final ça :
VB:
ZerosFinDeChaine4 = IIf(sep, signe & millier & IIf(x = 0, "", ",") & droite & Mid(Txt, i), signe & n & Mid(Txt, i))
ou ça :
VB:
ZerosFinDeChaine4 = IIf(sep, signe & millier & IIf(x = 0, "", ",") & droite, signe & n)
j'obtiens le même résultat.