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

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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.
 
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. 😉
 
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

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.
 
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.
 
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.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…