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

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
 

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
Comme ça alors :
VB:
Function Groupe3(ByVal Txt As String) As String
   Groupe3 = String((30 - Len(Txt)) Mod 3, "0") & Format(CDec(Txt), "0,000")
   End Function
Mais ça ne convient pas pour des textes de plus de 29 chiffres.
 

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.
 

patricktoulon

XLDnaute Barbatruc
re
et oui je suis obligé de travailler en string je vais jusqu'au sextillion (30 caractères)

123 456 789 123 456 789 123 456 789 123

avec cdec j'ai 2 chiffres en trop(dépassement de capacité)
cela dit je pourrais très bien m’arrêter au milliard ou billiard
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…