XL 2010 Rentrer un nombre formaté dans un TextBox

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Je rentre un chiffre, quel qu'il soit, dans un TextBox situé sur la feuille.
Une fois la valeur validée par la touche clavier "Enter", je veux que ce chiffre ait pour suffixe "%" (il s'agit, en effet, de pourcentages).
Par ex : 12,75 --> 12,75%

J'y suis parvenu ainsi :
1/ Dans le module de feuille :
VB:
Private Sub TextBoxPP1_Change()
    If TextBoxPP1 = vbNullString Then Exit Sub
    TextBoxPP1.Text = Replace(TextBoxPP1.Text, ".", ",")  'pour remplacer le "." par une "," quand on rentre un nombre décimal
End Sub

Private Sub TextBoxPP1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then  'touche clavier "Enter"
        If IsNumeric(TextBoxPP1) Then
            TextBoxPP1.Value = Format(TextBoxPP1.Value / 100, "##,##0.00%")  'obligé de diviser par 100...
        Else
            TextBoxPP1.Value = vbNullString
        End If
        [f2] = ExtractNumber(TextBoxPP1.Value)
        [A1].Select
    End If
End Sub
2/ La fonction :
VB:
Function ExtractNumber(Txt As String, Optional n As Byte = 1)
'*************************************************************
'Renvoie un nombre contenu dans une chaîne
'job75
'*************************************************************
'- txt : une chaîne contenant un ou plusieurs nombres
'- n   : numéro d'ordre du nombre recherché. Si omis, le 1er
'Ex : Combo208  -33,15 romina4 | n = 1 --> 208
'                                n = 2 --> -33,15
'                                n = 3 --> 4
Dim i%, T As String, u As String, s
    Txt = Replace(Txt, ",", ".")
    For i = 1 To Len(Txt)
        T = Mid(Txt, i, 1): u = Mid(Txt, i, 2)
        If T <> "." And Not (T Like "#" Or u Like "-#") Then Txt = Application.Replace(Txt, i, 1, " ")
    Next
    s = Split(Application.Trim(Txt))
    If n - 1 > UBound(s) Then ExtractNumber = "" Else ExtractNumber = Val(s(n - 1))
End Function
Ça marche bien, mais ne pourrait-on pas faire plus simple ?
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

On ne voit pas trop quelle partie vous voulez simplifier mais si je m'en tiens au titre de votre discussion, testez ceci :

VB:
Private Sub TextBoxPP1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 And Val(Replace(TextBoxPP1.Text, ",", ".")) > 0 Then
        KeyCode = 0
        TextBoxPP1.Text = Format(CDbl(Replace(TextBoxPP1.Text, ".", ",")) / 100, "##,##0.00%")
    End If
End Sub
Val(TextBoxPP1.Text) impliquant que le textbox commence obligatoirement par un chiffre ou signe + ou - ou . (point)
cordialement
 
C

Compte Supprimé 979

Guest
Bonjour Magic_Doctor, bonjour à tous,

Pourquoi pas tout simplement
VB:
Private Sub TextBoxPP1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  Me.TextBoxPP1.Value = Format(CSng(Me.TextBoxPP1) / 100, "0.00%")
End Sub

Je ne vois pas l'intérêt d'une telle usine à gaz 😱

@+
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, le forum,

Si l'on veut rester simple et non coercitif ceci suffit :
VB:
Private Sub TextBoxPP1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then TextBoxPP1 = Format(Val(Replace(TextBoxPP1, ",", ".")), "#,##0.00") & "%" 'touche clavier "Enter"
End Sub
A+
 

patricktoulon

XLDnaute Barbatruc
Bonjour Magic_doctor
je ne sais pas trop par ou commencer
donc je vais aller droit au but
la valeur du textbox n'est pas formaté avant la touche 13(ENTER)
donc dans le keydown si tu envoyais la valeur dans la cellule avant de la formater
je dis ça moi j'dis rien ;)
conclusion
  1. vire moi cette fonction extractnumber
  2. vire moi cet event change
  3. et dans le keydown met seulement ceci
VB:
Private Sub TextBoxPP1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then  'touche clavier "Enter"
        With TextBoxPP1
            .Value = Replace(.Value, ",", ".")
            If Not IsNumeric(.Value) Then .Value = vbNullString: Exit Sub
            If Val(.Value) > 0 Then
                [F2] = Val(TextBoxPP1.Value)
                .Value = Format(Val(TextBoxPP1.Value), "##,##0.00""%""")
            Else
                .Value = vbNullString
            End If
        End With
    End If
End Sub
si tu te demande pourquoi je divise pas regarde la chaîne de formatage
et apprend comment on ajoute un caractère dans un formatage sans que celui ci remplace un autre
Bon j'avoue que le besoins d'un nombre plus grand que 100% interroge ma curiosité mais bon voila tu a ce que tu veux

demo7.gif
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour à tous,

Merci pour vos réponses.
D’abord, mettons-nous bien d’accord, j’ai fait comme j’ai pu.

Chris me dit que « Des pourcentages en texte ne vont pas te servir à grand chose si ce n'est pas juste un affichage ». C’est bien pour ça que je récupère l’entrée au moyen de la fonction de job75 qui extrait uniquement le chiffre de la chaîne, pour ensuite être traité ailleurs.

La solution de Hasco ne renvoie pas une valeur numérique. Subsiste un autre problème : quand on rentre un nombre décimal (uniquement lors de la saisie), la virgule est remplacée, à l’anglo-saxonne, par un point. Ce que je veux éviter à tout prix. Désolé, trop latin pour changer mes habitudes…

La solution de BrunoM45 ne marche pas du tout, en tout cas chez moi. Et c’est bien pour ça que j’ai soumis mon usine à gaz (qui marche) pour voir si on ne pourrait pas faire plus simple.

La solution de job ne renvoie pas une valeur numérique. Toujours ce problème de point au lieu de virgule lors de la saisie. En revanche, si je rajoute :
VB:
Private Sub TextBoxPP1_Change()
    If TextBoxPP4 = vbNullString Then Exit Sub
    TextBoxPP4.Text = Replace(TextBoxPP4.Text, ".", ",")  'pour remplacer le "." par une "," quand on rentre un nombre décimal
End Sub
le problème est alors réglé.

La solution de patricktoulon renvoie, elle, une valeur numérique. Néanmoins, elle présente le même problème lors de la saisie concernant le point au lieu de la virgule pour les nombres décimaux. Si on veut corriger ce détail avec, comme précédemment :
VB:
Private Sub TextBoxPP1_Change()
    If TextBoxPP5 = vbNullString Then Exit Sub
    TextBoxPP5.Text = Replace(TextBoxPP5.Text, ".", ",")  'pour remplacer le "." par une "," quand on rentre un nombre décimal
End Sub
curieusement, les chiffres après la virgule sont systématiquement remplacés par des "0".
 

Pièces jointes

  • TextBox.xlsm
    34.1 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
tu es sérieux là
avec tout tes textbox password et compagnie que tu a bricolé
tu sais toujours pas faire le changement d'une touche dans l'event keydown depuis le temps ???
et ben mon amis
et bien soit on reste envirgule même avec la touche du point et le replace inversé
et c'est plus val mais Cdbl

et voila
VB:
Private Sub TextBoxPP1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
With TextBoxPP1
If KeyCode = 110 Then .Value = .Value & ",": KeyCode = 0: Exit Sub
If KeyCode = 13 Then  'touche clavier "Enter"
        With TextBoxPP1
            If Not IsNumeric(.Value) Then .Value = vbNullString: Exit Sub
           .Value = Replace(.Value, ".", ",")
             If CDbl(.Value) > 0 Then
                [F2] = CDbl(TextBoxPP1.Value)
                .Value = Format(CDbl(TextBoxPP1.Value), "##,##0.00""%""")
            Else
                .Value = vbNullString
            End If
        End With
    End If
End With
End Sub
 

Magic_Doctor

XLDnaute Barbatruc
Re,

Et oui je suis sérieux, depuis le début de ce fil 🥸 .
Et bien voilà, maintenant ça marche ! C'est tout ce que je recherchais : dégraisser l'usine à gaz.
Enfin, si c'était si évident, tout le monde aurait dû alors apporter la bonne réponse.
¡Si estoy acá es únicamente para la joda! 😂 :cool: 😂 En d'autres termes, n'essaie pas de voir systématiquement des apprentis futurs grands programmeurs. On vient en général sur ce type de forum pour résoudre des problèmes ponctuels ; sinon on n'y viendrait pas...

Une question subsidiaire, si on a une vingtaine de TextBox qui fonctionnent tous de la même manière, comment les gérer au moyen d'un module de classe (que je ne manie pas très bien) ? Avec un TextBoxPP1_Change je pense y arriver, mais avec TextBoxPP1_KeyDown, je ne vois pas trop comment.

Muchas gracias amigo por la ayuda.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
entre parenthèse je n'ai pas dégraissé je t'ai donné une autre (la seule )solution viable et pérenne qu'on est en droit d'attendre d'une programmation d'un event

et ben dis donc si tu pose la question sur la multiplication
c'est que tu n'a rien compris aux event keypress et keydown
keycode est un returninteger en (callback)
il peut donc être modifier n'importe ou ailleurs que dans l'event lui même
il me semblait te l'avoir expliquer pour ton usf password non !!??


je ne vois pas en toi un apprenti futur programmeur mais combien de fois devra t on prendre le temps de te répéter les chose avant que tu les retienne

allez (comme on dit chez nous )on prend les mêmes et on recommence

VB:
Sub Globalkeydown(TXTB As MSForms.TextBox, KeyCode, Rng As Range)
    With TXTB
        If KeyCode = 110 Then .Value = .Value & ",": KeyCode = 0: Exit Sub
        If KeyCode = 13 Then  'touche clavier "Enter"
            If Not IsNumeric(.Value) Then .Value = vbNullString: Exit Sub
            .Value = Replace(.Value, ".", ",")
            If CDbl(.Value) > 0 Then
                Rng = CDbl(TXTB.Value)
                .Value = Format(CDbl(TXTB.Value), "##,##0.00""%""")
            Else
                .Value = vbNullString
            End If
        End If
    End With
End Sub


Private Sub TextBoxPP1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Globalkeydown TextBoxPP1, KeyCode, [F2]
End Sub

Private Sub TextBoxPP2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Globalkeydown TextBoxPP2, KeyCode, [F4]
End Sub

Private Sub TextBoxPP3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Globalkeydown TextBoxPP3, KeyCode, [F6]
End Sub
demo7.gif



et tu es sur un forum français, la moindre des chose et par politesse ,c'est de s'exprimer dans cette langue

cet exemple te montre bien qu'en modifiant le keycode dans une sub externe à l'event ,le textbox réagit comme si le code était exécuté dans l'event
MAIS!!! tu peux aussi faire avec un module classe
c'est du niveau moyen
PS: comme a mon habitude j'ai laissé une coquille(4 caractères en trop) dans le code
histoire de voir si tu n'es pas de ceux qui attendent la becquée
je te laisse chercher un peu ;)
 

Pièces jointes

  • format percent For Magic_D ein one event keydown 13.xlsm
    21.7 KB · Affichages: 2
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re,

Ce soir, je vais regarder ça de plus près.
Mais, cela dit en passant, je n'ai jamais eu personnellement l'occasion d'utiliser les Keycode. J'avais vu, mais sans trop y prêter attention. En fait, je découvre.

PS : un p'tit cours de rioplatense, c'est toujours bon pour la Kulture. Et de temps en temps glisser une expression cervantesque à la sauce australe, c'est plutôt sympa. Non !
Ton commentaire est à la limite de la xénophobie, et c'est dangereux par les temps qui courent ! :eek:
J'déconne ! 😂 😂 😂
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
keypress et keydown fonctionnent de la même manière

keypress avec keyascii concerne toute les touches sauf !!!! les touches fonction (enter tab,fleches etc)
keydown avec keycode concerne toute les touches

keyascii c'est le code asc de la lettre tapée
keycode c'est le code la touche

on peu néanmoins travailler le code asc de la lettre tapée en opérant un calcul sur keycode (voir ressource collection formater un textbox)
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, le forum,
La solution de job ne renvoie pas une valeur numérique. Toujours ce problème de point au lieu de virgule lors de la saisie.
Sur mon post #5 ce n'est pas le point ou la virgule qui posent problème mais le signe "%".

En effet il y a bug si l'on valide le texte avec ce signe à la fin.

Il faut donc l'effacer et dans la foulée effacer le séparateur de milliers (espace ou caractère de code 160) :
VB:
Private Sub TextBoxPP1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then TextBoxPP1 = Format(Val(Replace(Replace(Replace(Replace(TextBoxPP1, ",", "."), "%", ""), " ", ""), Chr(160), "")), "#,##0.00") & "%" 'touche clavier "Entrer"
End Sub
A+
 

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof