Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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.
 

TooFatBoy

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.
 

job75

XLDnaute Barbatruc
Bonsoir Magic_Doctor, Marcel32,

Cette fonction VBA renvoie un texte :
VB:
Function Milliers(v As Double) As String
Milliers = Replace(Format(v, "#,##0"), Chr(160), ".")
End Function
A+
 

Pièces jointes

  • Milliers(1).xlsm
    15.3 KB · Affichages: 2

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

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.
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…