Texte NombreEnTxt

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
Supporter XLD
2 fonctions de job75 que j'ai fusionnées.
Transforme un nombre en chaîne de caractères. Tout est normalement bien expliqué dans l'intro de la fonction.
VB:
Function NombreEnTxt$(num As Variant, x As Byte, Optional sep As Boolean = True, Optional TypeSep$, Optional mas As Boolean = False)
'************************************************************************************************************************************
'Retranscrit un nombre en chaîne.
'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 séparateurs de milliers
'job75 / Magic_Doctor
'************************************************************************************************************************************
'- num     : un nombre
'- x       : le nombre de chiffres voulu après la virgule
'- sep     : si False --> pas de séparateur(s) de milliers
'            si True  --> séparateur(s) de milliers
'- TypeSep : si " " --> espace (25145785 --> 25 145 785)
'            si "." --> point  (25145785 --> 25.145.785)
'- mas     : si True : si le nombre est positif, alors il sera précédé du signe "+"
'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 x = 5 | sep = True | TypeSep = " " | mas = True => num = 125365875,25 --> +125 365 875,25000

    Dim signe$, Txt$, i%, t$, n$, nb$, 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), IIf(mas, "+", ""), "-")
    
    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)
    pos = InStr(1, nb, ",")
    gauche = Left(nb, pos - 1)
    droite = Mid(nb, pos + 1)
    
    If x = 0 Then
        millier = IIf(TypeSep = " ", Replace(Format(Int(Abs(num)), "#,##0"), ".", Chr(160)), Replace(Format(Int(Abs(num)), "#,##0"), Chr(160), "."))
        NombreEnTxt = IIf(sep, signe & millier, signe & n)
    Else
        millier = IIf(TypeSep = " ", Replace(Format(CDec(gauche), "#,##0"), ".", Chr(160)), Replace(Format(CDec(gauche), "#,##0"), Chr(160), "."))
        If InStr(gauche, Application.DecimalSeparator) Then millier = millier & Mid(gauche, InStr(gauche, Application.DecimalSeparator))
        NombreEnTxt = IIf(sep, signe & millier & IIf(x = 0, "", ",") & droite, signe & n)
    End If
End Function
 
Quelques améliorations + simplification du paramétrage.
VB:
Function NombreEnTxt$(num As Variant, x As Byte, TypeSep$, Optional mas As Boolean = False)
'************************************************************************************************************************************
'Retranscrit un nombre en chaîne.
'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 séparateurs de milliers
'job75 / Magic_Doctor
'************************************************************************************************************************************
'- num     : un nombre
'- x       : le nombre de chiffres voulu après la virgule
'- TypeSep : si ""  --> pas de séparateurs de milliers (25145785 --> 25145785)
'            si " " --> espace (25145785 --> 25 145 785)
'            si "." --> point  (25145785 --> 25.145.785)
'- mas     : si True : si le nombre est positif, alors il sera précédé du signe "+"
'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 x = 5 | sep = True | TypeSep = " " | mas = True => num = 125365875,25 --> +125 365 875,25000

    Dim signe$, Txt$, i%, t$, n$, nb$, 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), IIf(mas, "+", ""), "-")
    
    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)
    pos = InStr(1, nb, ",")
    gauche = Left(nb, pos - 1)
    droite = Mid(nb, pos + 1)
    
    If TypeSep = "" Then  'pas de séparateurs de milliers
        NombreEnTxt = signe & n
    Else  'séparateurs de milliers (" " ou ".")
        If x = 0 Then  'nombre entier
            millier = IIf(TypeSep = " ", Replace(Format(Int(Abs(num)), "#,##0"), ".", Chr(160)), Replace(Format(Int(Abs(num)), "#,##0"), Chr(160), "."))
            NombreEnTxt = signe & millier
        Else  'nombre décimal
            millier = IIf(TypeSep = " ", Replace(Format(CDec(gauche), "#,##0"), ".", Chr(160)), Replace(Format(CDec(gauche), "#,##0"), Chr(160), "."))
            If InStr(gauche, Application.DecimalSeparator) Then millier = millier & Mid(gauche, InStr(gauche, Application.DecimalSeparator))
            NombreEnTxt = signe & millier & "," & droite
        End If
    End If
End Function
 
Quelques améliorations.


VB:
Function NombreEnTxt$(num As Variant, x As Byte, Optional TypeSep$ = "", Optional suf$ = "", Optional mas As Boolean = False)
'************************************************************************************************************************************
'Retranscrit un nombre en chaîne.
'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 séparateurs de milliers, un suffixe en fin de chaîne et un signe "+" (si le nombre est > 0) en début de chaîne
'job75 / Magic_Doctor
'************************************************************************************************************************************
'- num     : un nombre
'- x       : le nombre de chiffres voulu après la virgule
'- TypeSep : si "" ou omis --> pas de séparateurs de milliers (25145785 --> 25145785)
'            si " "        --> espace (25145785 --> 25 145 785)
'            si "."        --> point  (25145785 --> 25.145.785)
'- suf     : un éventuel suffixe en fin de chaîne
'- mas     : si True --> le nombre est positif, alors il sera précédé du signe "+"
'Exemple   : si x = 2 & TypeSep = "" ou omis => num = 2               --> 2,00
'                                               num = 125752,22       --> 125.752,22
'                                               num = -202454524565,5 --> -202.454.524.565,50
'            si x = 5 | TypeSep = " " | suf = "º C" | mas = True => num = 125365875,25 --> +125 365 875,25000º C
'************************************************************************************************************************************

    Dim signe$, txt$, i%, t$, n$, nb$, 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), IIf(mas, "+", ""), "-")
    
    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)
    pos = InStr(1, nb, ",")
    gauche = Left(nb, pos - 1)
    droite = Mid(nb, pos + 1)
    
    If TypeSep = "" Then  'pas de séparateurs de milliers
        NombreEnTxt = signe & n & suf
    Else  'séparateurs de milliers (" " ou ".")
        If x = 0 Then  'nombre entier
            millier = IIf(TypeSep = " ", Replace(Format(Int(Abs(num)), "#,##0"), ".", Chr(160)), Replace(Format(Int(Abs(num)), "#,##0"), Chr(160), "."))
            NombreEnTxt = signe & millier & suf
        Else  'nombre décimal
            millier = IIf(TypeSep = " ", Replace(Format(CDec(gauche), "#,##0"), ".", Chr(160)), Replace(Format(CDec(gauche), "#,##0"), Chr(160), "."))
            If InStr(gauche, Application.DecimalSeparator) Then millier = millier & Mid(gauche, InStr(gauche, Application.DecimalSeparator))
            NombreEnTxt = signe & millier & "," & droite & suf
        End If
    End If
End Function
 
Bonjour,

Je reviens sur cette fonction.
J'ai rajouté un paramètre permettant qu'un nombre entier apparaisse tel quel, même si l'on stipule qu'il y ait tant de chiffres après la virgule.
Je me suis rendu compte que pour le paramétrage des intervalles des milliers, ça marchait très bien pour " ", mais quand j'optais pour ".", ça me renvoyait toujours " ". Je ne parvenais pas à résoudre le problème et, pour ne pas me prendre la tête, je me tourne vers ChatGPT. Je lui envoie la fonction en lui expliquant le problème. 15'' de réflexion de sa part et, en s'inspirant de la fonction d'origine, il me pond ceci (j'ai laissé ses commentaires) :


VB:
Public Function NombreEnTxt$(num As Variant, x As Byte, _
                             Optional z As Boolean = True, _
                             Optional TypeSep As String = "", _
                             Optional suf As String = "", _
                             Optional mas As Boolean = False)
'************************************************************************************************************************************
' Retranscrit un nombre en chaîne
'- num     : un nombre
'- x       : le nombre de chiffres voulu après la virgule
'- z       : si True ou 1 ou omis --> quel que soit le nombre, celui-ci s'affichera avec x chiffres après la virgule
'            si False ou 0        --> si le nombre est entier, alors il apparaît tel quel, même si x > 0
'- TypeSep : si "" ou omis --> pas de séparateurs de milliers (25145785 --> 25145785)
'            si " "        --> espace (25145785 --> 25 145 785)
'            si "."        --> point  (25145785 --> 25.145.785)
'- suf     : un suffixe en fin de chaîne
'- mas     : si True ou 1 --> affiche le signe "+" pour les positifs
'
'Exemples  : si x = 2 & tous les autres paramètres sont omis    : num = 2                  --> 2,00
'               x = 2 & z = False ou 0 & autres paramètres omis : num = 2                  --> 2
'               x = 2 & TypeSep = "." & autres paramètres omis  : num = 125752,22          --> 125.752,22
'               x = 3 & TypeSep = "." & autres paramètres omis  : num = -202454524565,5    --> -202.454.524.565,500
'               x = 5 | TypeSep = " " | suf = "ºC" | mas = True ou 1 : num = 125365875,25  --> +125 365 875,25000ºC
'
' Cette version :
' - n’utilise plus les séparateurs de milliers automatiques de Format
' - insère elle-même les séparateurs de milliers
' - est indépendante des paramètres régionaux pour l’affichage
'job75 / Magic_Doctor / ChatGPT
'************************************************************************************************************************************

    Dim v As Double
    Dim absV As Double
    Dim signe As String
    Dim decCount As Long
    Dim fmt As String
    Dim brut As String
    Dim decSep As String
    Dim posDec As Long
    Dim gauche As String, droite As String
    Dim entierFormate As String

    ' Cas num vide ou non numérique : on renvoie chaîne vide
    If IsMissing(num) Then Exit Function
    If num = "" Then Exit Function
    If Not IsNumeric(num) Then Exit Function

    v = CDbl(num)

    ' Gestion du signe
    If v < 0 Then
        signe = "-"
    ElseIf v > 0 And mas Then
        signe = "+"
    Else
        signe = ""
    End If

    absV = Abs(v)

    ' Décider du nombre de décimales réellement affichées
    If (z = False) And (absV = Fix(absV)) Then
        ' Nombre entier et on n’impose pas x décimales
        decCount = 0
    Else
        decCount = x
    End If

    ' Format numérique de base (sans séparateurs de milliers)
    If decCount > 0 Then
        fmt = "0." & String(decCount, "0")  ' ex : "0.00", "0.000"
    Else
        fmt = "0"
    End If

    ' Formater selon la locale (juste pour récupérer les chiffres et le séparateur décimal système)
    brut = Format$(absV, fmt)
    decSep = Application.DecimalSeparator

    ' Séparer partie entière et partie décimale
    If decCount > 0 Then
        posDec = InStr(1, brut, decSep)
        If posDec > 0 Then
            gauche = Left$(brut, posDec - 1)
            droite = mid$(brut, posDec + Len(decSep))
        Else
            ' Par sécurité, si on ne trouve pas le séparateur (cas très improbable)
            gauche = brut
            droite = String(decCount, "0")
        End If
    Else
        gauche = brut
        droite = ""
    End If

    ' Appliquer éventuellement les séparateurs de milliers sur la partie entière
    entierFormate = AppliquerMilliers(gauche, TypeSep)

    ' Construire le résultat final
    If decCount > 0 Then
        ' On force la virgule comme séparateur décimal dans la chaîne retournée
        NombreEnTxt = signe & entierFormate & "," & droite & suf
    Else
        NombreEnTxt = signe & entierFormate & suf
    End If
End Function

Ma foi, ça marche très bien. J'ai passé en revue tous les cas de figure et ils sont maintenant corrects.
 
Bonjour,

Je me suis rendu compte que pour le paramétrage des intervalles des milliers, ça marchait très bien pour " ", mais quand j'optais pour ".", ça me renvoyait toujours " ".
C'est sûrement normal que ça ne fonctionne pas avec un point comme séparateur de milliers, puisqu'un nombre s'écrit, soit sans séparateur de milliers, soit avec une espace (de préférence insécable) comme séparateur de milliers.



Je ne parvenais pas à résoudre le problème et, pour ne pas me prendre la tête, je me tourne vers ChatGPT. Je lui envoie la fonction en lui expliquant le problème. 15'' de réflexion de sa part et, en s'inspirant de la fonction d'origine, il me pond ceci (j'ai laissé ses commentaires)
Ca ne m'étonne pas que ce truc ait réussi à t'inventer une solution qui en réalité n'existe pas... 😡

Mais rassure-toi, ce n'est pas la première fois, et hélas sûrement pas la dernière, que cette pseudo "intelligence" totalement artificielle sort une ânerie plus grosse que moi !
 
Dernière édition:
Bonjour,

C'est pas sorcier, reprends l'avant dernière version de la fonction et montre-moi exactement où j'ai bien pu me planter (c'est bien pour ça que je vais sur ce forum), car autant conserver une fonction humaine que celle d'un humanoïde.
En attendant, concernant un détail, la fonction plantait pour ce détail, alors que celle de l'humanoïde fonctionne pour ce détail.
Mais l'essentiel n'est-il pas que ça marche ?
 
C'est pas sorcier, reprends l'avant dernière version de la fonction et montre-moi exactement où j'ai bien pu me planter
Je ne parle que de #5, et non des messages précédents, donc je ne sais pas si tu t'es planté précédemment.


Mais l'essentiel n'est-il pas que ça marche ?
Non, je ne crois pas. Pour moi l'essentiel serait plutôt que ça n'affiche pas des conneries.
De toute façon, il manque une fonction donc pour l'instant et en l'état, ça n'affiche rien. 😉
 
Dernière édition:
re,

je ne sais pas si tu t'es planté planté précédemment.

Oui, je me suis planté quelque part, puisque pour un paramétrage ça ne fonctionnait pas correctement.

Pour moi l'essentiel serait plutôt que ça n'affiche pas des conneries.

De quelles conneries parles-tu exactement ?

De toute façon, il manque une fonction donc pour l'instant et en l'état, ça n'affiche rien.

Pas compris.
Quelle fonction manque-t-il ? Et qu'est-ce qui ne s'affiche pas ?
 
Dernière édition:
- 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

Réponses
2
Affichages
1 K
Réponses
2
Affichages
2 K
Réponses
9
Affichages
2 K
Réponses
0
Affichages
1 K
Retour