Empêcher d'entrer 2 fois le caractère virugule dans une TextBox

Résolu
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 - 17 nov. 2011 à 11:40
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 - 19 nov. 2011 à 07:46
Bonjour le Forum,

Je développe une Macro et je rencontre actuellement un petit désagrément. J'ai une TextBox ou je filtre les caractères entrés uniquement aux valeurs suivantes "0123456789,"

J'y suis parvenu, mais je ne parviens pas à empêcher de saisir 2 fois le caractère virgule. En effet on peut utiliser la virgule lorsque l'on tape un chiffre, mais on ne peut l'utiliser qu'une seule fois !!!

Si quelqu'un peut me conseiller.

Voici le code utilisé :


Private Sub TbxValeurLibre_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii <> 44 And KeyAscii <> 48 And KeyAscii <> 49 And KeyAscii <> 50 And KeyAscii <> 51 And KeyAscii <> 52 And KeyAscii <> 53 And KeyAscii <> 54 And KeyAscii <> 55 And KeyAscii <> 56 And KeyAscii <> 57 Then 'Filtre les valeurs
KeyAscii = 127
End If

End Sub



Cordialement,

André

15 réponses

SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
17 nov. 2011 à 12:34
Le code que tu propose Ucfoutu rempli très bien sa fonction. Merci.

En fait j'utilise le keyAscii = 127 pour simuler la suppression de la dernière valeur entrée. Comme ça si on entre un caractère erroné, alors il s'efface directement.

Le KeyAscii = 0 ne me parle pas trop si je regarde sa définition. Du coup j'ai suivis ton conseil et remplacé le 127 par 0. Ça marche aussi bien et je pense que c'est plus correct.

Voici le code qui fonctionne pour filter les caractères suivants "0123456789," et interdire l'utilisation multiple du caractère ","

Private Sub TbxValeurLibre_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
  Case 44
    If InStr(TbxValeurLibre.Text, ",") Then KeyAscii = 0
  Case 48 To 57
  Case Else
    KeyAscii = 0
  End Select
End Sub



Merci Ucfoutu.

André
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2011 à 11:55
Bonjour,

Je ne sais pas trop le résultat que tu cherches réellement à obtenir, mais si je m'en tiens à tes explications et à la lecture de ton code, ce serait :
Private Sub TbxValeurLibre_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
  Case 44
    If InStr(TbxValeurLibre.Text, ",") Then KeyAscii = 0
  Case 48 To 57
  Case Else
    KeyAscii = 127
  End Select
End Sub

sans préjudice de la raison du but recherché (que tu es seul à connaître)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2011 à 12:02
c'est à vrai dire ton :
KeyAscii = 127
que j'ai respecté, mais ndont je ne comprends nullement la motivation.
Je verrais plutôt
Keyascii = 0
dans mon code.
Mais tu es seul à savoir pourquoi tu choisis 127 !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
17 nov. 2011 à 13:22
SERIEUXETCOOL et cher ucFoutu,

Il manque la valeur ascii 8, eh oui

case 8


Sub TbxValeurLibre_KeyPress(ByVal KeyAscii As USForms.ReturnInteger)
Select Case KeyAscii
case 8
Case 44
If InStr(TbxValeurLibre.Text, ",") Then KeyAscii = 0
Case 48 To 57
Case Else : KeyAscii = 0
End Select
End Sub


Cordialement, Joe.
0

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

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 nov. 2011 à 14:23
Bonjour, EhJoe,
Si tu veux vraiment tout gérer, c'est alors vers mon frère jumeau, qu'il va falloir aller faire un petit tour
C'est Là, qu'il a déposé un source à ce propos. Et là : tout y est paramétré (y compris le séparateur à choisir) et "ya plus qu'à"
Ici : j'ai voulu répondre le plus simplement du monde à SERIEUXETCOOL, en r(estant avec ce qu'il avait fait et ce qu'il demandait.
Mais toi, maintenant : pourquoi "séparer" ton case 8 ? ! il va avec le reste ===>>
Case 8, 48 To 57 

tout simplement


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
17 nov. 2011 à 14:39
Oui, dans ce cas faut mettre :

case 8, 48 to 57

C'était pour respcter la hiérarchie

Ô noble ami, point ne t'offusque, c'était juste pour préciser, car si jamais il fait il va avoir des problèmes, par contre le <del> et le <tab> passent, ils ne sont pas gérés par cette procédure, ça marche bien comme tu le sais...

Cependant, pour ma part, je rajoute l'ascii 46 que je transforme en ascii 44, et j'accepte l'ascii 45 si besoin, avec une suppression des ascii 32 et un TRIM() ...

Mais bon, comme disent les chats : chat ira pour cette fois

Cordialement, Joe.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
17 nov. 2011 à 14:42
UC... ah, on ne peut pas modifier ses messages (modif à demander)... j'allais oublier, donc je rajoute : Y a plus court, tu balance ça dans une variable numérique du type prévu et tu gères lerreur par TRY, renvoyant si besoin par "saisie invalide" machin.focus()... Eh eh
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
17 nov. 2011 à 14:43
Si on compile le tout !

On option

  If KeyAscii <>8 and KeyAscii < 44 and KeyAscii  > 57 Then 
    KeyAscii = 127
  End If
  If KeyAscii 44 or KeyAscii 8 then 
    If InStr(TbxValeurLibre.Text, ",") Then   KeyAscii = 0
  end if
  
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
18 nov. 2011 à 09:57
Je viens de repasser par hasard sur la discussion...J'ai vus vos différents commentaires. Comme l'a très bien souligné Ucfoutu, il a proposé un code simple et très en accord avec ma demande initiale.

Les solutions qui ont été proposées par la suite sont censées faire la même chose mais en mieux. Or je suis débutant et n'ai pas besoin du code le plus parfait. D'autant plus que le code proposé par Ucfoutu fonctionne parfaitement.

J'ajouterais une dernière petite chose pour conclure cette discussion : J'ai eu la curiosité de tester le code proposé par 4u4me4us. J'ai trouvé des erreurs de compilation dans le code (à cause du "=="). Et même après correction, le code ne répond pas à mon besoin.

C'est ballot. Personnellement, j'apprécie tout particulièrement les codes que me propose Ucfoutu. Par voie de conséquence, je ne changerais pas ma version.

Mais ça peut être utile pour d'autres donc libre à vous de perfectionner le code.

Merci pour votre intérêt porté sur la discussion en tout cas.

Bien cordialement,

André
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 nov. 2011 à 11:37
Bon, André,
Mais aucun des codes figurant dans la présente discussion (ni le tien, ni le mien, ni les autres) n'est réellement à conseiller car le Keypress ne te met absolument pas à l'abri d'un utilisateur qui s'amuserait à saisir par copier/coller (CTRL C - CTRL V)

Je n'ai pas voulu trop m'écarter de ton test, mais je te conseillerais personnellement d'abandonner ce code (à éliminer du Keypress) et à la remplacer par celui-ci, qui :
- force à saisir avec la virgule comme séparateur décimal
- empêche toute saisie du genre (également numérique) 10E4
- empêche les copier/coller non non conformes
Private Sub TextBox1_Change()
  Static anc As String
  If Not IsNumeric(TextBox1.Text) Or UCase(TextBox1) Like "*[A-Z]*" Then
   TextBox1.Text = anc: beep
  Else
    anc = TextBox1
  End If
End Sub


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
18 nov. 2011 à 13:28
"J'ai eu la curiosité de tester le code proposé par 4u4me4us. J'ai trouvé des erreurs de compilation dans le code (à cause du "=="). Et même après correction, le code ne répond pas à mon besoin. "

Pu*/2 ça fait mal!!!! Que dire !? "l'enfer est pavé de bonnes intentions"

Bon code! Bonne suite !
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
19 nov. 2011 à 00:10
4u4me4us je suis vraiment dsl si je t'ai véxé. Ce n'était pas l'intention. Je m'exprime parfois mal.

Il n'y a aucun souci je te rassure. Tiens je vais te le prouver, je vais faire le même genre de commentaire à Ucfoutu maintenant. Encore une fois ça part simplement d'une constatation et pas d'une critique.

Ucfoutu, j'ai également eu la curiosité d'aller tester le dernier code que tu propose et pas de chance pour toi mais ça fonctionne moins bien que la première version que tu proposais^^. En fait une fois que j'entre une valeur, et bien impossible de supprimer le "0" de la TextBox. Du coup pour écrire "100" on doit tapper "0100". Et moi ça ne me conviens pas trop.

Donc je vais quand même redire ce que je disais la dernière fois, pour mon besoin et pour mon niveau l'ancienne solution de Ucfoutu fonctionne très bien et me satisfait pleinement. Les autres codes sont peut êtres plus corrects mais ne me conviennent pas.

Donc encore une fois je vais rester avec la version que j'avais. Ucfoutu tu m'as appris que les codes les plus simples ont souvent le merrite de fonctionner mieux parfois. Pour cette demande tout particulièrement, inutile d'aller chercher la grosse bête je pense. Le post concerne la virgule pour rappel...

Mais merci pour tous les compléments d'infos. Ça fait plaisir de voir plusieurs points de vus. 4u4me4us, excuse moi encore

André
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
19 nov. 2011 à 07:40
Bonjour André,

Tu fais ça :

Dim d As Double
    Try
      d = CDbl(TextBox1.Text)
    Catch ex As Exception
      MsgBox("Saisie unvalide")
      TextBox1.Focus()
    End Try


Cordialement, Joe.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2011 à 07:44
Bonjour, EhJoe,

Tu crois que ça va "marcher" sous VBA/Excel ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
19 nov. 2011 à 07:46
Bonjour UCfoutu,

Ah c'est sous VBA...

Je n'avais même pas vu, alors retirons...

Désolé, cordialement, Joe.
0
Rejoignez-nous