Contrôles de saisie sur TextBox impossible >_<'

lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016 - 20 août 2010 à 14:59
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016 - 24 août 2010 à 13:11
Bonjour,

J'essaye à partir d'un tutorial d'effectuer un contrôle de saisie permanent sur une textbox dès qu'une touche est pressée.
Le petit challenge, c'est que la modification de cette textbox affecte la valeur d'une AUTRE textbox, qui elle affiche le prix total.

Mes conditions sont les suivantes :

- caractères autorisés : 0123456789 et "."
- mis à jour même quand l'utilisateur corrige avec backspace
- la virgule remplace le point

Voilà le code initial :

Private Sub Text1_keypress(ByVal Keyascii As MSForms.ReturnInteger)

Dim Prix As Single
Dim prixtot As Single
   
   If Text1.Value = "" Then Exit Sub
   If InStr("1234567890.", Chr(Keyascii)) = 0 _
   Or InStr(Text1.Value, ".") <> 0 And Chr(Keyascii) = "." Then
       Keyascii = 0: Beep
   ElseIf Chr(Keyascii) = 8 Then
        Prix = Text1.Value
        prixtot = prixtotal.Value
        prixtot = prixtot + Prix
        prixtotal.Value = prixtot
    End If

Prix = Text1.Value
prixtot = prixtotal.Value
prixtot = prixtot + Prix
prixtotal.Value = prixtot

End Sub


Bien entendu, ça m'affiche n'importe quoi ...

Quelqu'un peut m'aider ? Merci beaucoup !!!

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 août 2010 à 15:28
Salut
Commence par mettre des niveaux de parenthèses dans le premier If : Des Or qui coutoient des And sans discernement n'est jamais bon.

D'autre part, cette Sub s'exécutera à chaque frappe de touche.
Donc si tu fais une addition à chaque fois et que tu restockes le résultat, ça va pas le faire !
Exemple :
prixtotal.Value = 100
je veux taper 85
Le 8 est tapé
prixtotal.Value passe à 100 + 8 = 108
Le 5 est tapé
prixtotal.Value passe à 108 + 85 = 193

Ou alors, tu as le sens des affaires ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
20 août 2010 à 16:34
Ok, pour ça j'ai trouvé la solution au moins pour ça :

prixtot = prix_save
Prix = Text1.Value
prixtot2 = prixtot + Prix
prixtotal.Value = prixtot2


prix_save = prixtotal.value à l'ouverture de la textbox

Cependant, mes contrôles de saisi ne fonctionnent pas, et en plus la deuxième textbox se met à jour avec une touche de retard.

Exemple :
prixtotal.Value = 100
je veux taper 550
Le 5 est tapé
prixtotal.Value reste à 100
Le 5 est tapé
prixtotal.Value passe à 100 + 5 = 105
Le 0 est tapé
prixtotal.Value passe à 100 + 55 = 155
...

une idée ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 août 2010 à 17:49
Oui, c'est normal.
Quand tu passes dans Text1_keypress, la TextBox n'a pas encore reçue le code de la touche.
Mieux vaudrait séparer tes tâches :
Tu gères :
- le filtrage de touche dans Text1_keypress
- le calcul dans TextBox1_Change.
0
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
23 août 2010 à 14:00
Ok, en séparant les deux tout fonctionne, il me reste plus qu'un problème :

- Quand j'écris 4.5 dans la textbox elle se met à jour correctement,
- Quand j'éfface a 4 elle se met à jour correctement,
- Quand j'efface le 4 et qu'il n'y a plus rien, le total ne se met pas à jour et reste avec la valeur 4.

Comment je peux corriger cela ?

Le code :

Private Sub Text1_change()

Dim Prix As Single
Dim prixtot As Single

If Text1.Value = "" Then
Exit Sub
Else
Prix = Text1.Value
End If
prixtot = prix_save
prixtot2 = prixtot + Prix
prixtotal.Value = prixtot2

End Sub

Private Sub Text1_keypress(ByVal Keyascii As MSForms.ReturnInteger)

Dim Prix As Single
Dim prixtot As Single
   
   If InStr("1234567890.", Chr(Keyascii)) = 0 _
   Or InStr(Text1.Value, ".") <> 0 And Chr(Keyascii) = "." Then
       Keyascii = 0: Beep
   ElseIf Chr(Keyascii) = 8 Then
        If Text1.Value = "" Then
            Exit Sub
        Else
            Prix = Text1.Value
        End If
        prixtot = prix_save
        prixtot2 = prixtot + Prix
        prixtotal.Value = prixtot2
    End If

End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
24 août 2010 à 13:11
Aucune idée ?
0
Rejoignez-nous