XL 2010 [RESOLU] Saisie Note via TextBox

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 !

cathodique

XLDnaute Barbatruc
Bonjour,

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.

En vous remerciant par avance.

Bon week-end.
 
Solution
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 🤣 🤣 🤣 🤪
 
Bonjour cathodique, Patrick, Dudu2,

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
A+
 
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.
 
Dernière édition:
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 😉
 
Bonjour à toute l'équipe intervenante,

Je vous remercie beaucoup. Maintenant, j'ai l’embarras du choix.
Je vous promets que je vais recueillir toutes vos propositions dans un fichier.

@patricktoulon : si je m'y mets de suite à étudier vos différentes propositions. C'est sûr que j'aurai besoin d'au moins 2 'Doliprane' .

Bonne fin de dimanche.

Très gentil de votre part.

Merci encore.
 
Bonjour le Fil,
Pour éviter le TxtNote_DblClick peut être en ajoutant un test à ce Niveau
VB:
TxtNote = IIf((Int(v)) = 0, Empty, v & IIf(test, s, ""))
Jean marie
Avec ce code on ne peut plus entrer une note 0 ou 0,5 !

En passant dans mes codes on peut remplacer :
VB:
v = Left(v, IIf(Int(v) < 10, 4, 5))
par :
VB:
v = Left(v, IIf(v < 10, 4, 5))
 
- 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

Discussions similaires

Réponses
20
Affichages
2 K
Retour