Remplissage textbox = autoriser uniquement chiffre et une virgule

Bonjour,

Modif :

Je voudrais remplir dans un textbox :

1-Uniquement chiffre de 0 à 9

2-Uniquement virgule

3-Remplacé le point par une virgule

4-Sur copier coller remplissage impossible si c'est pas ex : 2,2

5-Empecher le remplissage si c'est pas un chiffre de 0 à 9 et une virgule bien placée

6-Si possible : une fonction ou dans un module qui pourrait s’appliquer à tous les txtbox déclarés afin d'éviter d'avoir des pages de code infinies

7-Emettre un Beep ou msbox si c'est pas un chiffre de 0 à 9 et une virgule bien placée = Facultatif

Avec plusieurs bout de code, j'ai essayé mais avec beaucoup de difficultés.

""Les données sont renvoyées dans des cellules, et elle serviront à calculer une moyenne.""

S'il y'a des pro du code VBA pour trouver un solution ce sera un grand merçi.

Jean

Ps: Je joins mon fichier

Le txt box "txtPrixUF7" et txtPrixUF8 sont libre.

Bonsoir,

Tu as tout le matériel pour aboutir (à quoi au fait ? tu ne l'as pas vraiment précisé, on doit donc déduire que tu produis des nombres à affecter...). Et si tu n'aboutis pas, c'est que tu en as peut-être trop...

Pour ma part, je me contente de substituer une virgule au point et tester si j'ai un nombre. Si je ne l'ai pas je renvoie l'utilisateur à sa saisie, et si je l'ai je pourrai affecter.

Ceci dit je n'ai rien contre l'utilisation de KeyPress pour tester les caractères saisis et bloquer ceux qui ne conviennent pas... mais qu'est-ce qui te chagrine et t'empêche d'aboutir ?

Cordialement.

Bonsoir

cherche un peux

il faux faire un KeyPress

example

Private Sub TextBox6_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'TRANSFORMER LE POINT PAR UNE VIRGULE
 If KeyAscii = 46 Then KeyAscii = 44
'ACCEPTER UNIQUEMENT UNE SEULE VIRGULE ET LES CHIFFRES ENTRE 0 ET 9
 If InStr("1234567890,", Chr(KeyAscii)) = 0 Or (InStr(TextBox6.Value, ",") <> 0 And Chr(KeyAscii) = ",") _
    Or (TextBox6.SelStart = 0 And Chr(KeyAscii) = ",") Then KeyAscii = 0: Beep
End Sub

A+

Maurice

Bonsoir Jean, bonsoir le forum,

En effet pour faire ce que tu veux il te faut un peu plus de check mais dur quand tu ne comprends pas tout ce que tu fais oui ^^

Je te propose le fichier ci-joint, essaye de bien le comprendre pour pouvoir l'améliorer ou réutiliser la mécanique/architecture utilisée dans d'autre fichier.

Pour l'histoire du bip ou msgbox et de la virgule entourée de chiffres, je t'ai mis quelques conseils.

A noter aussi que la macro ici scan "à la volée", cela voudra dire que si tu mets un msgbox d'alerte quand le texte saisie se termine par "," cela se déclenchera pendant la saisie de nombre quel nombre, la macro ne fait pas la différence entre une saisie en cours et finie

Par exemple si on tape 2.4:

saisie du "2", textbox = "2", scan ok

Saisie du ".", textbox = "2.", scan alerte, on n'a pas de virgule entourée de deux chiffres bim msgbox intrusif pour la personne qui saisie même si au final elle ne fait aucune erreur

saisie du "4", textbox = "2.4", scan ok

Pour éviter cela et faire des msgbox il faudrait scanner chaque TextBox quand on appuie sur le bouton de validation qui ferait des alertes si en effet une ou plusieurs textbox ne remplissent pas cette condition mais ce n'est pas la solution je pense ici.

A ta place je ferais:

Directement sur l'useform un label qui décrit ce qui est autorisé ou pas et/ou des images d'exemple OK / Pas OK pour un effet visuel et je rendrais le bouton de validation enabled = false dans les tests du code que je te propose quand on finis sur une virgule ou qu'on a pas de virgule dans la textbox (c'est sur que tu n'auras jamais le cas? enfin au pire tu peux mettre une indication ou alors les gens trouveront la parade car pour l'instant la macro ne le check pas mais il suffit de rajouter un 0, du genre XX,0 et cela feras un entier mais toute les conditions de ton check seront remplis.... d'autre sécurité sont à prévoir peut être

Ci-dessous le code simplifié pour ceux qui n'aiment pas ouvrir les fichiers :

Private Sub TextBox1_Change()
Call CHECK_TEXTBOX(ActiveControl.Name)
End Sub

Public Sub CHECK_TEXTBOX(NOM_TEXTBOX_A_CHECKER As String)
Dim NOMBRE_VIRGULE As Integer
Dim STOCK_TEXT As String
Dim LONGUEUR_BASE As Integer

STOCK_TEXT = UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT
NOMBRE_VIRGULE = 0
LONGUEUR_BASE = Len(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT)

Do Until STOCK_TEXT = ""
    Select Case Left(STOCK_TEXT, 1)
        Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
        Case ","
            If LONGUEUR_BASE = 1 Then UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT = ""
            If NOMBRE_VIRGULE = 0 Then
                NOMBRE_VIRGULE = NOMBRE_VIRGULE + 1
            Else
                UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT = _
                Left(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT, Len(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT) - 1)
            End If
        Case "."
            If LONGUEUR_BASE = 1 Then UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT = ""
            If NOMBRE_VIRGULE = 0 Then
                UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT = Replace(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT, ".", ",")
                NOMBRE_VIRGULE = NOMBRE_VIRGULE + 1
            Else
                UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT = _
                Left(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT, Len(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT) - 1)
            End If
        Case Else
            UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT = _
            Left(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT, Len(UserForm1.Controls(NOM_TEXTBOX_A_CHECKER).TEXT) - 1)
    End Select
    If Len(STOCK_TEXT) = 1 Then
        Select Case STOCK_TEXT
            Case ","
                'la textbox se termine par une ",", a toi de voir ce que tu veux faire
            Case Else
                If NOMBRE_VIRGULE = 0 Then
                    'idem à toi de voir ce que tu veux faire, on n'a pas de virgule dans la textbox
                End If
        End Select
    End If
    STOCK_TEXT = Right(STOCK_TEXT, Len(STOCK_TEXT) - 1)
Loop
End Sub

Edit: Pardon oui a noter qu'il suffit d'appeler la fonction dans le Change n'importe quelle textbox, comme dans l'exemple ci-dessus pour TextrBox1.

Le ActiveControl.name ne posera pas de soucis ici, au pire il y a une solution moins sexy en passant manuellement chaque nom du genre

Private Sub TextBox1_Change()
Call CHECK_TEXTBOX("TextBox1")
End Sub

Mais cela implique de passer à la main dans le code chaque nom de textbox et de faire une update si celui ci change

ECG

174textbox.xlsm (16.95 Ko)

Je me crois en C# dans Unity en faisant référence au .TEXT et pas au .value d'une textbox en VBA

D'ailleurs je ne comprends pas comment cela fonctionne je regarde ça dans la soirée (ou demain) et je vérifie que ça fonctionne bien comme il faut avec la correction

Désolé

ECG

Bonsoir,

Je me crois en C# dans Unity en faisant référence au .TEXT et pas au .value d'une textbox en VBA

Pour une TextBox, les propriétés Text et Value renvoient le même contenu... alors !...

Après, chacun a ses préférences ou habitudes !

Cordialement.

Je n'avais jamais fait attention à la propriété Text

J'aurais appris quelque chose ce soir ! quelle différence entre text et value du coup? il y a des applications spécifiques?

Pour TextBox aucune. Pour les autres contrôles qui ont une propriété Text (et aussi Value) : ListBox et ComboBox, il n'intervient de différence que si les listes ont plusieurs colonnes et dans certaines utilisations, lorsqu'on distingue les colonnes sur lesquelles vont pointer les propriétés TextColumn et BoundColumn. Lorsqu'une ligne est sélectionnée, la première placera le contenu de sa colonne dans Text, la seconde dans Value.

Cordialement.

Bonjour,

Comme un grand j'ai trouvé tout seul et le premier qui me dit que je comprend rien gare à lui!

'verion Jean
'fonctionne OK
'txtPrixUF14 N'accepter qu'une seule virgule positionnable à l'endroit voulu.
Private Sub txtPrixUF14_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'limite le nombre apres la virgule
If Len(txtPrixUF14) = 0 Then txtPrixUF14.MaxLength = 15
If Right(txtPrixUF14, 1) = "," Then txtPrixUF14.MaxLength = Len(txtPrixUF14) + 4
'change le . en ,
If KeyAscii = 46 Then KeyAscii = 44
If InStr("1234567890,", Chr(KeyAscii)) = 0 Or txtPrixUF14.SelStart > 0 And Chr(KeyAscii) = "-" _
Or InStr(txtPrixUF14.Value, ",") <> 0 And Chr(KeyAscii) = "," Then KeyAscii = 0: Beep
End Sub
'fonctionne OK
'txtPrixUF14 Ne pas laisser un copier coller permettre une saisie non conforme
Private Sub txtPrixUF14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim strpass As String
strpass = txtPrixUF14.Value
'Message et Beep si chainepasOK
If ChainePasOK5(strpass) = True Then Cancel = True: txtPrixUF14.Value = "": Beep: MsgBox "      Tarif non valide !" & vbCrLf & "      Ex : 25,25"
End Sub
'fonction chainepassOK5
Public Function ChainePasOK5(strpass As String) As Boolean
  If strpass = "" Then Exit Function
   If Len(Replace(strpass, ".", "")) <> Len(strpass) Then ChainePasOK5 = True: Exit Function
   If Len(strpass) = 1 And InStr("1234567890", strpass) = 0 Then ChainePasOK5 = True: Exit Function
   strpass = Replace(strpass, ",", ".")
   If Len(CStr(Val(strpass))) <> Len(strpass) Then ChainePasOK5 = True
   End Function

Cordialement

bonjour

pourquoi faire simple mes bon a toi de voir

la même macro avec routine pour éviter les répétition

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   Call VirgulChiffre(KeyAscii, 1)
End Sub

Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   Call VirgulChiffre(KeyAscii, 2)
End Sub

Sub VirgulChiffre(KeyAscii, T As Long)
'TRANSFORMER LE POINT PAR UNE VIRGULE
 If KeyAscii = 46 Then KeyAscii = 44
'ACCEPTER UNIQUEMENT UNE SEULE VIRGULE ET LES CHIFFRES ENTRE 0 ET 9
 If InStr("1234567890,", Chr(KeyAscii)) = 0 Or (InStr(Controls("TextBox" & T).Value, ",") <> 0 And Chr(KeyAscii) = ",") _
    Or (Controls("TextBox" & T).SelStart = 0 And Chr(KeyAscii) = ",") Then KeyAscii = 0: Beep
End Sub

Merçi Archer

snif la macro ne fonctionne pas sur mon Excel, j'aurais bien voulu testé ce que ça donne tout ça

ECG

Bonjour

j'ais fait un userForm2 avec test Texbox

A+

Maurice

snif la macro ne fonctionne pas sur mon Excel, j'aurais bien voulu testé ce que ça donne tout ça

ECG

ExcelCoreGame , j'utilise Excel 2013 x 64, t'a un message d'erreur.

bonjour

ma macro fonction sur tous les excel 32 b

et jais pas de excel 64 desoler pour toi

A+ Maurice

bonjour

ma macro fonction sur tous les excel 32 b

et jais pas de excel 64 desoler pour toi

A+ Maurice

En effet Maurice, elle fonctionne ta macro mais pas sur un copier coller de texte.

Pour ExcelCoreGame dans le menu outil référence de visual basic il faut les élément cochés, voir dans le fichier joint.

Me suis deja fais avoir par ça.

Cordialement.

Jean

menu outil reference

je testerais ça merci

ECG

Rechercher des sujets similaires à "remplissage textbox autoriser uniquement chiffre virgule"