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))...
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)) > 20 Then KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
    End With
End Sub
patrick
 
Bonjour,

Histoire de poster un truc, un code sur l'évènement _Exit() de la TextBox si c'est dans un UserForm et qu'il y a d'autres contrôles à suivre.
VB:
Private Sub TxtNote_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim FormatNote As String
   
    'Bloque la saisie sur la TextBox
    Cancel = True
   
    With TxtNote        
        .Value = Replace(.Value, " ", "")
        .Value = Replace(.Value, ".", ",")
       
        If Not IsNumeric(.Value) Then
            MsgBox "Note non numérique !"
            Exit Sub
        End If
       
        If CDbl(.Value) < 0 Or CDbl(.Value) > 20 Then
            MsgBox "Note hors limites [0-20] !"
            Exit Sub
        End If
       
        Select Case True
            Case InStr(.Value, ",") = 0
                FormatNote = "#0"
               
            Case Len(Mid(.Value, InStr(.Value, ",") + 1)) = 1
                FormatNote = "#0.0"
           
            Case Else
                FormatNote = "#0.00"
        End Select
       
        .Value = Format(.Value, FormatNote)
    End With
   
    'Débloque la saisie de la TextBox
    Cancel = False
End Sub
 
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)) > 20 Then KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
    End With
End Sub
patrick
Bonjour @patricktoulon 😉

👏 👏 👏 👏 👍 👍 Merci infiniment. Tu me sors de la mélasse encore une fois.

Tu es véritable champion. Tu me permets de poursuivre mon petit projet.

Encore merci. bon week-end.
 
Bonjour @Dudu2
ça en fait un ramdamme pour une note de 0 à 20
microsoft nous a fait la grâce d'avoir des events avec des return integer pouvant être interceptés autrement dit des callback pour les textboxs
attendre le exit qui implique plusieurs events si on veux revenir pour corriger est absurde
autant utiliser ce qui est à notre disposition
d'autant plus que l'exit est declenché par la perte de focus soit par enter soi par selection d'un autre control pas très ergonomique tout ça
d'autant plus que la correction après exit autrement dit peut être un retour sur le textbox et un effacement ou modif declenche les events change et autre
tandis que l'annulation du keyascii ou keycode pour l'event keydown annule la touche donc pas taper donc pas de change etc....
aucun event déclenché a part le keyup qui a un keycode 0 puisque qu'il a été annulé au down
pour une fois que microsouuuuft fait quelque chose de bien on va pas s'en priver
 
Dernière édition:
Bonjour,

Histoire de poster un truc, un code sur l'évènement _Exit() de la TextBox si c'est dans un UserForm et qu'il y a d'autres contrôles à suivre.
VB:
Private Sub TxtNote_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim FormatNote As String
  
    'Bloque la saisie sur la TextBox
    Cancel = True
  
    With TxtNote       
        .Value = Replace(.Value, " ", "")
        .Value = Replace(.Value, ".", ",")
      
        If Not IsNumeric(.Value) Then
            MsgBox "Note non numérique !"
            Exit Sub
        End If
      
        If CDbl(.Value) < 0 Or CDbl(.Value) > 20 Then
            MsgBox "Note hors limites [0-20] !"
            Exit Sub
        End If
      
        Select Case True
            Case InStr(.Value, ",") = 0
                FormatNote = "#0"
              
            Case Len(Mid(.Value, InStr(.Value, ",") + 1)) = 1
                FormatNote = "#0.0"
          
            Case Else
                FormatNote = "#0.00"
        End Select
      
        .Value = Format(.Value, FormatNote)
    End With
  
    'Débloque la saisie de la TextBox
    Cancel = False
End Sub
Bonjour,

en fait, c'est le dernier contrôle. Mais j'ajoute ton code à ma bibliothèque. On ne sait jamais.

Merci beaucoup.

Bon week-end
 
ben c'est 5 je le dit dans les commentaires
Note.gif

Il y a bien 3 chiffres après la virgule. je veux éviter ce genre d'erreur lorsqu' on tapote le clavier.
 
ha je crois comprendre ton problème
en effet
8.20 ca ne marche pas
08,20 ca marche
alors on ajoute un tout petit correctif qui fonctionnera avec les entier de 1 ou chiffres avec decimale
VB:
Private Sub TxtNote_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'que numéric et 1 seule virgule
    With TxtNote
        v = .Text
        If Len(v) >= IIf(Mid(v, 2, 1) = ",", 4, 5) Then KeyAscii = 0 ' 5 = pas plus de 2 décimales (4 pour une seule décimales )
        If Val(v) = 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("012345K6789", Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' les touches autre que le pavé de 0 à 9  sont bloquées
        If CDbl(v & Chr(KeyAscii)) > 20 Then KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
     End With
End Sub

autrement dit
tu va de 0,1 à 19,99 ou 20
patrick
 
et on empêche même la possibilité de commencer par le separateur
VB:
Private Sub TxtNote_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'que numéric et 1 seule virgule
    With TxtNote
        v = .Text
        If v = "" Then If KeyAscii = 46 Then KeyAscii = 0: Exit Sub' on commence pas par le separateur
        If KeyAscii = 46 And Not .Value Like "*,*" Then KeyAscii = 44: Exit Sub 'remplace le "." par ","
        If Len(v) >= IIf(Mid(v, 2, 1) = ",", 4, 5) Then KeyAscii = 0 ' 5 = pas plus de 2 décimales switch 4/5 caractères  selon ou se trouve le séparateur
        If Val(v) = 20 Then KeyAscii = 0 'si il y a 20 dans le textbox bye bye!!!
        If InStr("012345K6789", Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' les touches autre que le pavé de 0 à 9  sont bloquées
        If CDbl(v & Chr(KeyAscii)) > 20 Then KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
    End With
End Sub
voila aucun autre event declenché
cette fois ci on est bons on a tout
patrick
 
2 formes d’écriture
VB:
Private Sub TxtNote_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'que numéric et 1 seule virgule
    Dim V$
    With TxtNote
        V = .Text
        If V = "" Then If KeyAscii = 46 Then KeyAscii = 0: Exit Sub
        If KeyAscii = 46 And Not .Value Like "*,*" Then KeyAscii = 44: Exit Sub 'remplace le "." par ","
        If Len(V) >= IIf(Mid(V, 2, 1) = ",", 4, 5) Then KeyAscii = 0 ' 5 = pas plus de 2 décimales (4 pour une seule décimales )
        If Val(V) = 20 Then KeyAscii = 0 'si il y a 20 dans le textbox bye bye!!!
        If InStr("012345K6789", Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' les touches autre que le pavé de 0 à 9  sont bloquées
        If CDbl(V & Chr(KeyAscii)) > 20 Then KeyAscii = 0 'si la valeur + touche simulée >20 alors touche annulée
    End With
End Sub

avec un select case true
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
 
@patricktoulon,
J'aime assez utiliser l'Exit() plutôt que le Change() ou autre évènement car on a à ce moment là la valeur finalement saisie.
Il ne s'agit pas de "revenir" (de loin ?) sur la TextBox. On est dessus, on essaie de la quitter (ici bouton <Enregistrer>) et si c'est pas correct on peut afficher un message d'erreur exact reflétant le problème ce qui ne peut pas être fait au fil de l'eau en Change() ou KeyPress() ou KeyDown() qui n'adresse que des corrections ponctuelles sans visibilité globale.
 
- 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