Empêcher d'entrer 2 fois le caractère virugule dans une TextBox [Résolu]

SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 17 nov. 2011 à 11:40 - Dernière réponse : ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention
- 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é
Afficher la suite 

15 réponses

Répondre au sujet
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 17 nov. 2011 à 12:34
+3
Utile
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é
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SERIEUXETCOOL
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 nov. 2011 à 11:55
0
Utile
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 17 nov. 2011 à 12:02
0
Utile
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
Commenter la réponse de ucfoutu
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 17 nov. 2011 à 13:22
0
Utile
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.
Commenter la réponse de ehjoe
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 17 nov. 2011 à 14:23
0
Utile
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
Commenter la réponse de jmfmarques
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 17 nov. 2011 à 14:39
0
Utile
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.
Commenter la réponse de ehjoe
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 17 nov. 2011 à 14:42
0
Utile
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
Commenter la réponse de ehjoe
4u4me4us 781 Messages postés lundi 22 janvier 2007Date d'inscription 30 octobre 2013 Dernière intervention - 17 nov. 2011 à 14:43
0
Utile
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
  
Commenter la réponse de 4u4me4us
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 18 nov. 2011 à 09:57
0
Utile
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é
Commenter la réponse de SERIEUXETCOOL
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 nov. 2011 à 11:37
0
Utile
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
Commenter la réponse de ucfoutu
4u4me4us 781 Messages postés lundi 22 janvier 2007Date d'inscription 30 octobre 2013 Dernière intervention - 18 nov. 2011 à 13:28
0
Utile
"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 !
Commenter la réponse de 4u4me4us
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 19 nov. 2011 à 00:10
0
Utile
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é
Commenter la réponse de SERIEUXETCOOL
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 19 nov. 2011 à 07:40
0
Utile
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.
Commenter la réponse de ehjoe
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 nov. 2011 à 07:44
0
Utile
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
Commenter la réponse de ucfoutu
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 19 nov. 2011 à 07:46
0
Utile
Bonjour UCfoutu,

Ah c'est sous VBA...

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

Désolé, cordialement, Joe.
Commenter la réponse de ehjoe

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.