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
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
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
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
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
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
Ô 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
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
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
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.
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
"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"
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
____________________
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