Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Je suis confronté à un problème que je n'arrive pas à résoudre.
J'utilise le bout de code ci-dessous pour saisir même des chiffres décimaux (une seule virgule admise)
VB:
Private Sub TxtNote_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'que numéric et 1 seule virgule
If KeyAscii = 46 And Not TxtNote Like "*,*" Then KeyAscii = 44: Exit Sub
If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Ce code fonctionne bien. Cependant, il ne répond exactement à mes attentes.
En effet, je dois alimenter une bd de notes scolaires sur 20.
Avec ce code, on peut aller au-delà de 20, ce qui ne doit pas être permis étant donné que la notation est sur 20.
Je voudrais un code qui permettent la saisie de chiffres décimaux ne dépassant pas 20.
le but est de permettre d'insérer une seule virgule si le chiffre ne dépasse pas 20.
et de ne pas permettre l'insertion de la virgule lorsque le chiffre saisie est 20.
une autre contrainte: permettre l'utilisation de la touche retour arrière.
Bonjour @cathodique
a ce patricktoulon avec ses code de formatage de textbox on sais plus quoi faire
voila un exemple qui gère toute les situations
VB:
Private Sub TxtNote_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'que numéric et 1 seule virgule
With TxtNote
If Len(.Value) >= 5 Then KeyAscii = 0 ' 5 = pas plus de 2 décimales (4 pour une seule décimales )
If Val(.Value) = 20 Then KeyAscii = 0 'si il y a 20 dans le textbox bye bye!!!
If KeyAscii = 46 And Not .Value Like "*,*" Then KeyAscii = 44: Exit Sub 'remplace le "." par ","
If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' les touches autre que le pavé de 0 à 9 sont bloquées
If CDbl(.Value & Chr(KeyAscii))...
@persol je me suis aperçu a 85% qu'avec les interfaces userform avec input(textbox) il y avait un bouton envoyer ,valider,enregistrer etc....
pour moi le contrôle final doit se faire là puis qu'avec mes méthodes contrainte et saisie +mask ou pas
on contrôle tout a la base
et je laisse les autres events tranquille ou faire autre chose
on économise du code saucisson
mais je te l'accorde juste pour une saisie complète
au quel cas ça réduit vachement ta proposition
dans l'exit
j'ai pas testé mais un truc du genre .text=cstr(cdbl(.text)) ' tout simplement comme ça on a un nombre à 2 décimales
au pire prévoir de shunter la décimale si le cdbl= le int mais bon
bref 2 lignes puisqu'on a tout contraint dans le keypress
ça devient plus clair d'un coup 😉
edit:
voila testé avec 2textbox et un bouton dans un userform
VB:
Private Sub TxtNote_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'que numéric et 1 seule virgule
Dim V$
With TxtNote
V = .Text
Select Case True
Case V = "" And (KeyAscii = 46 Or KeyAscii = 44): KeyAscii = 0: Exit Sub
Case KeyAscii = 46 And Not V Like "*,*": KeyAscii = 44: Exit Sub 'remplace le "." par ","
Case Len(V) >= IIf(Mid(V, 2, 1) = ",", 4, 5): KeyAscii = 0 ' 5 = pas plus de 2 décimales (4 pour une seule décimales )
Case Val(V) = 20: KeyAscii = 0 'si il y a 20 dans le textbox bye bye!!!
Case InStr("012345K6789", Chr(KeyAscii)) = 0: KeyAscii = 0 ' les touches autre que le pavé de 0 à 9 sont bloquées
Case CDbl(V & Chr(KeyAscii)) > 20: KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
End Select
End With
End Sub
Private Sub TxtNote_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With TxtNote
.Text = Replace(Format(CDbl("0" & .Text), "#0.00"), ",00", "")
End With
End Sub
Private Sub TxtNote2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'que numéric et 1 seule virgule
Dim V$
With TxtNote2
V = .Text
Select Case True
Case V = "" And (KeyAscii = 46 Or KeyAscii = 44): KeyAscii = 0: Exit Sub
Case KeyAscii = 46 And Not V Like "*,*": KeyAscii = 44: Exit Sub 'remplace le "." par ","
Case Len(V) >= IIf(Mid(V, 2, 1) = ",", 4, 5): KeyAscii = 0 ' 5 = pas plus de 2 décimales (4 pour une seule décimales )
Case Val(V) = 20: KeyAscii = 0 'si il y a 20 dans le textbox bye bye!!!
Case InStr("012345K6789", Chr(KeyAscii)) = 0: KeyAscii = 0 ' les touches autre que le pavé de 0 à 9 sont bloquées
Case CDbl(V & Chr(KeyAscii)) > 20: KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
End Select
End With
End Sub
Private Sub TxtNote2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With TxtNote2
.Text = Replace(Format(CDbl("0" & .Text), "#0.00"), ",00", "")
End With
End Sub
il sera facile de reprendre ma methode event commun pour avoir un seul code event pour 36 textbox
mais pour moi ne n'est pas ergonomique y a rien de plus énervant pour moi que l'auto saisie
si je perd le focus pour une raison ou une autre si je travaille sur 2 userforms par exemple et autres raisons possibles
obligé de sélectionner la partie ajouté par le exit c'est pour ca que je shunte le ",00"
mais bon ca fait 3/4 events pour un retour pour corriger (exit change, enter et un mouse down ou click )
pour peu que l'on ai utilisé les events click mouse down et autres pour d'autre raisons c'est le boxon
pas ergonomique du tout
le contrôle c'est dans le bouton enregistrer et c'est tout
pas de galère dans le teston
patrick
et voila pour le fun
un code event pour tous
testé
VB:
Private Sub TxtNote_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
textboxX_KeyPress TxtNote, KeyAscii
End Sub
Private Sub TxtNote2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
textboxX_KeyPress TxtNote2, KeyAscii
End Sub
Private Sub TxtNote_Exit(ByVal Cancel As MSForms.ReturnBoolean)
textboxX_Exit TxtNote, Cancel
End Sub
Private Sub TxtNote2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
textboxX_Exit TxtNote2, Cancel
End Sub
Public Sub textboxX_KeyPress(TxtB As MSForms.TextBox, ByVal KeyAscii As MSForms.ReturnInteger)
'que numéric et 1 seule virgule
Dim V$
With TxtB
V = .Text
Select Case True
Case V = "" And (KeyAscii = 46 Or KeyAscii = 44): KeyAscii = 0: Exit Sub
Case KeyAscii = 46 And Not V Like "*,*": KeyAscii = 44: Exit Sub 'remplace le "." par ","
Case Len(V) >= IIf(Mid(V, 2, 1) = ",", 4, 5): KeyAscii = 0 ' 5 = pas plus de 2 décimales (4 pour une seule décimales )
Case Val(V) = 20: KeyAscii = 0 'si il y a 20 dans le textbox bye bye!!!
Case InStr("012345K6789", Chr(KeyAscii)) = 0: KeyAscii = 0 ' les touches autre que le pavé de 0 à 9 sont bloquées
Case CDbl(V & Chr(KeyAscii)) > 20: KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
End Select
End With
End Sub
Private Sub textboxX_Exit(TxtB As MSForms.TextBox, ByVal Cancel As MSForms.ReturnBoolean)
With TxtB
.Text = Replace(Format(CDbl("0" & .Text), "#0.00"), ",00", "")
End With
End Sub
@cathodique ; je ne fourni pas le doliprane 🤣 🤣 🤣 🤪
Je suis étonné que vous utilisiez l'évènement KeyPress car avec Change c'est bien plus simple :
VB:
Private Sub TxtNote_Change()
Dim s, v, test As Boolean
s = Application.DecimalSeparator
v = Val(Replace(TxtNote, ",", "."))
If v > 20 Then v = 20
v = Left(v, IIf(Int(v) < 10, 4, 5))
test = Right(TxtNote, 1) = s And v < 20
TxtNote = v & IIf(test, s, "")
End Sub
Salut @job75,
Je ne vois pas bien la différence entre Change() et KeyPress() ou KeyDown().
Change() est déclenché à chaque modification et donc pratiquement à chaque caractère entré sauf en cas de coller ou de frappe hypersonique.
Il n'y a que l'Exit() qui permette de récupérer une valeur intégralement saisie, ou effectivement un bouton de validation ultérieurement cliqué. L'Exit() étant particulièrement adapté si une donnée associée a une valeur dépendante de la valeur saisie car sa valorisation peut être immédiate sans attendre une validation ultérieure.
Si on est agacé par le zéro qui apparaît quand on vide la TextBox on peut l'enlever avec un double-clic :
VB:
Dim flag As Boolean 'mémorise la variable
Private Sub TxtNote_Change()
If flag Then Exit Sub
Dim s, v, test As Boolean
s = Application.DecimalSeparator
v = Val(Replace(TxtNote, ",", "."))
If v > 20 Then v = 20
v = Left(v, IIf(Int(v) < 10, 4, 5))
test = Right(TxtNote, 1) = s And v < 20
TxtNote = v & IIf(test, s, "")
End Sub
Private Sub TxtNote_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
flag = True
TxtNote = ""
flag = False
End Sub
Bonjour
comptez les events déclenchés
tapez 19,99
revenez avec la touche back au 9 de 19
c'est marrant vous allez voir
avec le keypress ou keyDown si le keyascii ou keycode est validé il y aura event change sinon rien ne se passe
avec le change
chaque touche qui n'est pas numérique déclenche 2 event_Change
le retour déclenche 1 event par caractères
sauf quand on arrive a la virgule qui déclenche 4 event_Change
sans compter que l'event_Change est condamné a ne servir qu'a ça
le keypress et keydown personne ou presque ne s'en sert
alors qu'il sont équipés des callbacks et donc peuvent être interceptés sans bruit
et le zero qui persiste supprimer au double click
heu dites moi si il faut que j'ai la main sur le clavier et le pied sur la souris ou est l'ergonomie la dedans
parce que c'est quand même de ça qu'il s'agit non ?
certes de toute facon on y arrive toujours a contraindre un textbox a un format de valeur
si on réfléchi 1 seconde
on se dit que de toute manière la validation de la valeur va devoir être contrôlée lors d'un enregistrement ou transfert par un bouton
certains utilisent le exit
ok sauf quand dans le cas de valeur et format precis cela demande du code pour effacer , modifier , restructurer,voir tout effacer
la on peut penser que forcer retours sur le textbox implique encore du code y compris le code de correction
sauf que dans le cadre de l'ergonomie on peut penser que le retour ne se fera pas exactement comme on veux ou souhaiterais
et pour peux que l'input (textbox soit une donnée facultative ben on reviens dessus (comme la plus part des exemple que l'on vois partout)
tant que l'on a pas vider si tant est que l'on a maitriser cela dans le exit
donc pour moi wrong way
le event keypress et keydown
on intercepte la touche on la contrôle si ça convient pas on l'annule (aucun event déclenché)
donc pas d'event le contrôle de saisie est a l’instante pour chaque caractères tapé
les events change , exit, etc....sont libres
on fait un contrôle final de la saisie complète avec un bouton
car a ce niveau la la seule chose qui peut être c'est une saisie incomplète aucun caractères parasite un format bien contraint
je dis ça moi je dis rien
perso j'ai fait le tour de tout ça
et quand comme dans beaucoup de dommaine en vba si on peut economiser ben c'est pas plus mal
a bon entendeur 😉
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD