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:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

patricktoulon
Juste pour ma gouverne (et satisfaire ma curiosité)
Dans quel contexte, ce besoin de travailler en string s'exprime-t-il ?
Ou plutôt pourquoi donc tu dois ainsi formater tes chaines de caractères?
Pour quel usage professionnel?
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Stapple
je réécrit complètement ma fonction Nombre en lettre que j'avais faite il y a quelques années
avec des codes plus propres
la segmentation par 3 c'est pour déterminer les centaines,dizaine,unité de chaque tranche
elle me sert aussi a créer des références de mélange couleur pour mes machines qui sont sous ce format
et puis qui peut le plus peut le moins
 

patricktoulon

XLDnaute Barbatruc
re
voila ou j'en suis pour le moment
le moteur conversion c'est la boucle I
ca n'a pas trop changé de mon l'ancienne version (difficile de faire plus court)
me reste quelques corrections orthographiques pour les ("s"/"-") comme je l'avais fait dans l'ancienne

VB:
Option Explicit
Sub test()
    Nblettre2020 10020000000#
    Nblettre2020 1000000
    Nblettre2020 ("191471851,56")
    'Nblettre2020 191471851.56
    'Nblettre2020 ("135761973946357916972394685379,56")

End Sub

Function Nblettre2020(chaine)
    Dim t, dixx&, dix&, cxx&, u&, Part, ms, m, Ul, Diz, n&, I&, seg$, cc$, et$
    Ul = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf", "cent ")
    Diz = Array("", "dix", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix", "cent")
    ms = Array("", " sextillion", " Quintillion", " Quatrillion", " Trillion", " Billiard", " Billion", " milliard", " million", " mille", "")
    Part = Split(chaine, ",")
    For n = LBound(Part) To UBound(Part)
        chaine = Part(n)
        t = Split(Trim(Format(String((300 - Len(Part(n))) Mod 3, "0") & Part(n), WorksheetFunction.Rept(" @@@", Len(String((300 - Len(Part(n))) Mod 3, "0") & Part(n)) / 3))))
        m = UBound(ms) - UBound(t)
        For I = LBound(t) To UBound(t)
            seg = t(I)
            cxx = Left(seg, 1): dixx = Right(seg, 2): dix = Mid(seg, 2, 1): u = Right(seg, 1)
            If cxx = 1 Then cxx = 20: cc = "" Else cc = IIf(cxx > 0, " cent ", "")
            If dix = 9 Or dix = 7 Then dix = dix - 1: u = Val(u) + 10
            If dixx > 9 And dixx < 20 Then dix = 0: u = u + 10
            If dix >= 2 And dix <= 7 And (u = 1 Or u = 11) Then et = " et " Else et = IIf(dix <> 0 And u <> 0, "-", " ")
            Debug.Print Application.Trim(Ul(cxx) & cc & Diz(dix) & et & Ul(u)) & IIf(Val(seg) > 0, ms(m), "") & " (" & seg & ")"
            m = m + 1
        Next
        Debug.Print IIf(UBound(Part) > 0 And n = 0, "separateur", "")

    Next n

End Function

POUR INFO mon ancienne version
Code:
Option Explicit

Function nBlettre_methode_globale(nombres As String, Optional ByVal sstr As String = "virgule", Optional ByVal finance As Boolean = False)
    Dim en_dec(2), unit1, unit10, ms, cms As Long, decs As Long, ex As Long, ddd As String, centi As String, e As Long, i As Long, a As Long, dix As Long
    Dim nombre As String, u As String, c As String, ct As String, et As String, ss As String, neg As Boolean
    unit1 = Array("", " Un", " Deux", " Trois", " Quatre", " Cinq", " Six", " Sept", " Huit", " Neuf", " Dix", " Onze", " Douze", " treize", " Quatorze", " Quinze", " Seize", " Dix-Sept", " Dix-Huit", " Dix-Neuf", " cent", " zéro")
    unit10 = Array("", " dix", " vingt", " trente", " quarante", " cinquante", " soixante", " soixante-dix", " quatre-vingt", " quatre-vingt-dix", " cent")
    ms = Array("", " sextillion", " Quintillion", " Quatrillion", " Trillion", " Billiard", " Billion", " milliard", " million", " mille", ""): cms = UBound(ms)

    If Left(nombres, 1) = "-" Then nombres = Mid(nombres, 2, Len(nombres)): neg = True
    decs = 0: nombres = Replace(nombres, ".", ","): en_dec(0) = Split(nombres, ",")(0): If InStr(nombres, ",") > 0 Then en_dec(1) = Split(nombres, ",")(1): decs = 1    'on separe le decimal de l'entier
    If Len(en_dec(0)) Mod 3 <> 0 Then en_dec(0) = Application.Rept("0", 3 - Len(en_dec(0)) Mod 3) & en_dec(0)    'on formate l'entier a 3 chiffre par tranche
    If decs = 1 Then en_dec(1) = Right("00" & Round(Val("0." & en_dec(1)), 2) * 100, 3)  ' NOUVELLE METHODE POUR ADAPTER LE DECIMAL on formate a 3 chiffres
    ex = cms - (Len(en_dec(0)) / 3) + 1    ' index de point de depart des expressions dans l'array ms
    ddd = IIf(Val(en_dec(0)) > 999000 And Val(Right(en_dec(0), 6)) = 0, IIf("aAeEiIoOuUyY" Like "*" & Left(sstr, 1) & "*", " d' ", " de"), " ")
    centi = IIf(sstr <> "dollar", " centime", " cent")
    If sstr = "virgule" Then centi = ""
    sstr = IIf(Val(en_dec(0)) > 1, sstr & "s", sstr)
    If decs = 1 Then centi = IIf(Val(en_dec(1)) > 1, centi & "s", centi)
    For e = 0 To decs
        For i = 1 To Len(en_dec(e)) Step 3
            a = ex + Round(i / 3)    'position actuelle de ms
            nombre = Mid(en_dec(e), i, 3)    ' la tranche
            dix = Mid(nombre, 2, 1): u = Right(nombre, 1): c = Left(nombre, 1): If c > 1 Then c = c: ct = unit1(20) & IIf(Val(dix & u) > 0, "", "s") Else: ct = "": If c = 1 Then c = 20
            If dix = 1 Or dix = 7 Or dix = 9 And Right(u, 1) > 0 Then dix = dix - 1: u = u + 10   'on corrige le 1,7,9
            If dix > 1 And dix <> 8 And Right(u, 1) = 1 Then et = " et" Else: If dix = 0 Or u = 0 Then et = "" Else et = "-"  ' on accorde de 1 a 99

            If u = 0 Then If dix = 8 Then If ms(a) = " mille" Then et = "" Else et = "s"     'le s a quatre-vingt tout seul

            If nombre = 0 And Len(en_dec(0)) = 3 Then u = 21: dix = 0    ' le zéro si l'entier vaut 0 tout simplement
            If nombre = 0 And i <> 1 Then a = 0
            If nombre = 1 And i = 1 And a = cms - 1 Then u = 0
            If e = 0 And nombre > 1 And a < cms - 1 Then ss = "s" Else ss = ""
            nBlettre_methode_globale = nBlettre_methode_globale & Replace(unit1(c) & ct & unit10(dix) & et & unit1(u), "- ", "-") & IIf(e = 0, ms(a), "") & ss
        Next i
        If finance = False Then
            nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, " virgule ", "")
        Else
            nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, ddd & " " & sstr & " et ", IIf(decs = 0, " " & sstr, "")) & IIf(e = 1, centi, "")
        End If
    Next e
    If neg = True Then nBlettre_methode_globale = "moins " & nBlettre_methode_globale
End Function
Sub tes2()
    MsgBox nBlettre_methode_globale(256354.2153, "euro", True)
    MsgBox nBlettre_methode_globale(10000000.2153, "euro", True)
    MsgBox nBlettre_methode_globale(10000000.2153, "Dirham", True)
    MsgBox nBlettre_methode_globale(10000000.2153, "dollar", True)
    MsgBox nBlettre_methode_globale(1.1, "Dirham", True)
    MsgBox nBlettre_methode_globale(12563.2365)
    MsgBox nBlettre_methode_globale(1.01)
End Sub

la formule pour l'ancienne version:
=SI(A1=0;" ";nBlettre_methode_globale((A1);"dollar";1))
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour à tous,

qq chose m'échappe...
Pourquoi cette absence de trilliard, quadrilliard, quintilliard et autres sextilliard ?
Si tu utilises l'échelle courte (américaine), à ce moment là il n'y a pas de milliard ni de billiard qui s'appelent billion et quadrillon, avec le trillion qui s'intercale entre les 2.
Un billion=10^12 pour nous, mais =10^9 pour les américains.
Si tu utilises l'échelle longue il faut la respecter tout au long. Là les noms sont faux à partir de 10^21 il me semble.
Voir échelle longue continentale (Peletier) : https://fr.wikipedia.org/wiki/Échelles_longue_et_courte#Noms_des_grandes_puissances_de_10
eric
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…