Autres créer une chaîne numérique formaté en fonction du nombre de caractères

patricktoulon

XLDnaute Barbatruc
bonjour a tous
je simplifie mes macros
aujourd'hui je cherche a formater une chaîne numérique par groupe de 3 quelque soit le nombre de caractères

12345: doit donner 012 345

1234567: doit donner 001 234 567


j'ai tenté mod mais ca match pas a tout les coups
VB:
Sub test()
   Dim chaine$, adding$
    chaine = "12345678910111213182"
    adding = String(Len(chaine) Mod 3 + IIf(Len(chaine) Mod 3 > 0, 1, 0), "0")
    chaine = Format(adding & chaine, Application.Rept(" @@@ ", Len(chaine)))
    MsgBox chaine
End Sub
quelqu'un a une idée sans boucle
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour patricktoulon, danielco,

Fichier joint avec cette fonction VBA :
VB:
Function F(n As Variant) As String
F = RTrim(Format(n, Application.Rept("000 ", Application.RoundUp(Len(CStr(n)) / 3, 0))))
End Function
A+
 

Pièces jointes

  • Classeur(1).xlsm
    16.7 KB · Affichages: 11

patricktoulon

XLDnaute Barbatruc
bonsoir a tous
ou lala!! Job75
c'est pas résolu du tout
VB:
Sub test1()
Dim chaine
chaine = ("551561571581591501570268354298")
Debug.Print RTrim(Format(chaine, Application.Rept("000 ", Application.RoundUp(Len(CStr(chaine)) / 3, 0))))
End Sub

resultat
551 561 571 581 592 000 000 000 000 000

ça va plus du tout o_O
 

job75

XLDnaute Barbatruc
Bonsoir patricktoulon,

Oui la fonction Format convertit n en nombre et il y a une limite.

Avec ce code il n'y a bien sûr plus de limite :
VB:
Function F(n As String) As String
Dim ub%, a$(), i%
ub = Application.RoundUp(Len(n) / 3, 0)
ReDim a(1 To ub)
For i = Len(n) - 2 To 1 Step -3
    a(ub) = Mid(n, i, 3)
    ub = ub - 1
Next
If a(1) = "" Then a(1) = Left(String(Abs(i) + 1, "0") & n, 3)
F = Join(a)
End Function
Les caractères peuvent d'ailleurs être quelconques...

Fichier (2).

Bonne nuit.
 

Pièces jointes

  • Classeur(2).xlsm
    17.8 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
re
voila ce dont je me sert depuis dix ans
je voulais juste savoir si on pouvait encore simplifier
VB:
Sub test()
chaine = "1234567831"
If Len(chaine) Mod 3 <> 0 Then chaine = Application.Rept("0", 3 - Len(chaine) Mod 3) & chaine    'on formate l'entier a 3 chiffre par tranche
MsgBox Format(chaine, Application.Rept(" 000", Len(chaine) / 3))
End Sub

bonjour @Dranreb je vais tester
 

patricktoulon

XLDnaute Barbatruc
re
je pensait que l'on allait trouver mieux dix ans apres mais non
comme ça je suis illimité
VB:
Sub test()
chaine = "1234567831123654785654784521425654122145232564"
If Len(chaine) Mod 3 <> 0 Then chaine = Application.Rept("0", 3 - Len(chaine) Mod 3) & chaine    'on formate l'entier a 3 chiffre par tranche
MsgBox Format(chaine, Application.Rept(" @@@", Len(chaine) / 3))
End Sub
 

Dranreb

XLDnaute Barbatruc
Pour que ça convienne à des textes jusqu'à 300 de long (augmentable) :
VB:
Function Groupe3(ByVal Txt As String) As String
   Txt = String((300 - Len(Txt)) Mod 3, "0") & Txt
   Groupe3 = Format(Txt, WorksheetFunction.Rept(" @@@", Len(Txt) / 3))
   End Function
Mais on en vient tout doucement à ce que tu avais fait.
 

Statistiques des forums

Discussions
315 096
Messages
2 116 184
Membres
112 678
dernier inscrit
arno12345678