IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

limiter un "-" dans un textbox et variations sur le thème ^^^


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut limiter un "-" dans un textbox et variations sur le thème ^^^
    bonsoir,

    dans un textbox j'entre une quantité de mon stock

    je peux rentrer un chiffre positif (incrémente mon stock)
    ou un chiffre négatif (décrémente mon stock)

    mais je ne veux pas que ça tape [-2-] ou tout autre composé qui serait pas logique

    seul les caractères suivant sont autorisé (les autres sont verrouillé) 1234567890-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
    'saisie uniquement de chiffre TEXTBOX2
     
    If InStr("-0123456789", Chr(KeyAscii)) = 0 Then
    KeyAscii = 0
    End If
     
    End Sub
    si on tape une "-", il est impossible d'en taper un autre
    si on tape un chiffre on ne peut plus taper de "-"


    Une idée pour traduire ça ???

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    Bien que je ne procèderais personnellement jamais ainsi pour contrôler une saisie !...

    Ton code actuel, déjà, est assez curieux car il permet de saisir un - en plein au milieu (exemple 123-12) !!!

    Si tu tiens à ce genre de code (qui t'expose à tous les risques du fait de manoeuvres possibles de l'utilisateur), fais au moins ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      If InStr("-0123456789", Chr(KeyAscii)) = 0 Or (Text1.SelStart > 1 And Chr(KeyAscii) = "-") Then
        KeyAscii = 0
      End If

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Ton code actuel, déjà, est assez curieux car il permet de saisir un - en plein au milieu (exemple 123-12) !!!
    je suis d'accord avec toi, c'est ce que je veux bloquer...

    si je tape un "-", il ne peut l'être qu'en première position, sinon pas possible...

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Et alors ?
    Tu as vu mon message précédent et tu as essayé ?

    Avertissement, toutefois : ta méthode, même ainsi corrigée, ne te met certes pas à l'abri de certaines manoeuvres de l'utilisateur, à commencer par les copier/coller ...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    oué oué j'ai bien essayé...

    mais quand je teste ton script ça plante et que je tape un caractère autorisé :
    Erreur d'éxécution '424':
    Objet requis

    je comprends pas...

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Citation Envoyé par petibonohm Voir le message
    oué oué j'ai bien essayé...

    mais quand je teste ton script ça plante et que je tape un caractère autorisé :
    Erreur d'éxécution '424':
    Objet requis

    je comprends pas...
    Moi non plus...
    ou tu as fait une erreur de copie, donc, ou tu utilise finalement un autre évènement que Keypress !!!!
    Car j'ai beau essayer, je ne parviens pas à cette erreur...

    Euh ....

    Rassure-moi donc : tu as bien pensé (j'espère ) à changer Text1 par le nom que toi, tu as donné à ta textbox ?????

  7. #7
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Je vais peut-être sortir une grosse anerie, mai...
    Pourquoi ne fais-tu pas un simple test du genre IsNumeric sur l'évènement Exit de ta textBox ?

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour, Maxence Hubiche,

    entre autres (je dis bien entre autres) parce que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Command1_Click()
      toto = "2E2"
      If IsNumeric(toto) Then MsgBox toto & " a été vu comme numérique"
    End Sub

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    voilà le code telque je l'ai insérée dans ma feuille...

    effectivement j'avais zappé ce truc la

    une fois rectifié, un autre problème se pose...

    Erreur de syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    sIf InStr("-0123456789", Chr(KeyAscii)) = 0 Or (TextBox1.SelStart > 1 And Chr(KeyAscii) = "-") Then
    KeyAscii = 0
    End If
    End Sub
    PS : je suis malaaaade, on me pardonnera certaine erreur

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Maxence HUBICHE Voir le message
    Je vais peut-être sortir une grosse anerie, mai...
    Pourquoi ne fais-tu pas un simple test du genre IsNumeric sur l'évènement Exit de ta textBox ?
    pas mieux que ucfoutu

    merci quand même, comme ça on écarte les mauvaise piste !

    si au passage, ucfoutu, tu sais comment se protéger d'un ctrl+V dans une textbox, je suis preneur

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Citation Envoyé par petibonohm Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    sIf InStr("-0123456789", Chr(KeyAscii)) = 0 Or (TextBox1.SelStart > 1 And Chr(KeyAscii) = "-") Then
    KeyAscii = 0
    End If
    End Sub
    PS : je suis malaaaade, on me pardonnera certaine erreur
    Tiens ! c'est quoi, sIf ?

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par petibonohm Voir le message
    PS : je suis malaaaade, on me pardonnera certaine erreur
    je suis désolé, j'avais pas vus

    franchement j'abuse... merci encore une fois ucfoutu

  13. #13
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    bon, ben... je persiste et signe, et je pense que sur l'exit, c'est pas mal ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        On Error GoTo GesErr
        Dim dblData As Double
        Dim intCptr As Integer
        For intCptr = 1 To Len(TextBox1.Value)
            If Not "-0123456789" Like "*" & Mid(TextBox1.Value, intCptr, 1) & "*" Then
                Err.Raise vbObjectError + 1, , "Le numériques ne peuvent contenir que des valeurs numériques (de 0 à 9) et le symbole -"
            Else
                'rien à faire... on poursuit le scan de la chaine
            End If
        Next
        dblData = CDbl(Replace(TextBox1.Value, ",", "."))
    FinProc:
        Exit Sub
    GesErr:
        MsgBox Err.Description & vbNewLine & "(" & Err.Number & ")", vbExclamation, "Nombre non valide !"
        Cancel = True
    End Sub
    Possibilité d'améliorer le gestionnaire d'erreur...

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    petite correction, ucfoutu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
      If InStr("-0123456789", Chr(KeyAscii)) = 0 Or (TextBox1.SelStart > 0 And Chr(KeyAscii) = "-") Then
        KeyAscii = 0
      End If
     
    End Sub
    avant je pouvais taper 8-8 ou --5

    maintenent c'est bon !

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Re,

    C'est avec l'évènement Change qu'il faut tout simplement jouer...

    Il permet à lui seul de se protéger contre tout et ce, quel que soit le format de saisie choisi... et le séparateur de décimales choisi ...

    J'en ai donné un exemple (sur ce forum) il n'y a pas si longtemps, pourtant...

    Je vais toutefois me contenter de le rappeler, pour éviter d'autres allusions à ce qui n'a rien à voir avec VB (la "mégalomanie", entre autres ...).

    Ceux qui voudront chercher trouveront.....

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Re,

    C'est avec l'évènement Change qu'il faut tout simplement jouer...

    Il permet à lui seul de se protéger contre tout et ce, quel que soit le format de saisie choisi... et le séparateur de décimales choisi ...

    J'en ai donné un exemple (sur ce forum) il n'y a pas si longtemps, pourtant...

    Je vais toutefois me contenter de le rappeler, pour éviter d'autres allusions à ce qui n'a rien à voir avec VB (la "mégalomanie", entre autres ...).

    Ceux qui voudront chercher trouveront.....
    heu je comprends pas très bien ce que tu veux dire... en fait je comprends rien...

    tu me dis qu'avec l'évenement Change gère tout, mais avec Key_press ça marche très bien... je suis un peu perdus, qu'est ce que tu veux dire ?


    de quel exemple parles-tu ?

  17. #17
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Fais donc un copier de ce que tu veux( qui ne soit pas un numérique) , va dans ta textbox et fais un coller (tu vas vite comprendre...)

    Bien sur : tu pourras toujours ajouter un contrôle à la sortie.... et renvoyer le focus à ta textbox si pas bon, etc... mais on s'écarte là de la philosophie de la saisie contrôlée ...

    En travaillant intelligemment avec l'évènement Change (et ce seul évènement) tu peux tout contrôler au moment même de la chaisie de chaque caractère, tout en permettant les signes négatifs, l'utilisation du backspace (que tu as en plus oublié de gérer...) etc etc..., et le tout en empêchant les copier-coller incohérent, tout en permettant ceux qui le sont....

    C'est de l'acrobatie, je sais, mais pas si dure que celà et en tout état de cause la plus ergonomique pour l'utilisateur final (c'est lui et lui seul qui importe... et pas le travail accru que cette acrobatie impose au développeur ... cela va tellement de soi !!!)

    Si tu cherches bien, tu finiras par trouver un code que j'ai proposé et qui gère tout, y compris les choffres avec décimales ... et qui gère également les formats ...

    Mais si tu te contentes finalement d'entiers positifs et négatifs, l'acrobatie est encore plus réduite et donc plus simple ... et je veux bien en faire une pour toi sur ces bases là, avec le seul évènement Change.

    Tu dis...

  18. #18
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bon...

    J'ai mis mon portable en route (j'y ai Excel ...) et ai fait ceci (un peu bâclé) à toute allure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub TextBox1_Change()
     Static couic As String
     Dim toto As Integer
     toto = Len(TextBox1.Text)
     If toto = 0 Then couic = TextBox1.Text: Exit Sub
     If TextBox1.Text = "-" Then
         If toto > Len(couic) Then
           TextBox1.Text = TextBox1.Text & "0"
           TextBox1.SelStart = toto
           TextBox1.SelLength = toto
         Else
           TextBox1.Text = ""
         End If
         couic = TextBox1.Text
         Exit Sub
     End If
     If Not TextBox1.Text Like "-" & String(toto - 1, "#") And Not TextBox1.Text Like String(toto, "#") Then
       Beep
       TextBox1.Text = couic
       TextBox1.SelStart = Len(couic)
       Exit Sub
     End If
     couic = TextBox1.Text
     TextBox1.SelStart = toto
    End Sub
    Il traite les entiers positifs et négatifs, permet les bacspaces, les copier-coller cohérents (et refuse les autres), contrôle à la saisie elle-même etc... etc...

    Tu remarqueras que j'ai fait en sorte, lorsque tu commences par un signe -, d'ajouter immédiatement un 0 prêt à être "écrasé" juste par la frappe suivante, sans s'en préoccuper. Ce mécanisme a sa raison d'être.

    Tu remarqueras également que si tu utilises le bacspace alors que ton nombre est négatif, il t'efface spontanément le signe - lorsque tu en es à l'effacement du 1er caractère numérique . Celà également a sa raison d'être....

    La seule chose qui pourrait arriver, c'est que l'utilisateur saisisse - (qui devient -0) et quitte... Ce qui est totalement inoffensif puisque -0 = 0 et qu'aucune opération ultérieure n'en serait donc affectée...

    Voilà, ami...
    Comme je viens de le faire à la méthode "pressons-nous", il est possible que quelque chose m'ait échappé....

    A toi de tenter de planter cet outil et de me faire part de ce que tu aurais trouvé d'erroné...

    Un dernier mot : si la chose te plait, il te faudra l'analyser dans le calme pour en comprendre le mécanisme (prends au besoin une feuille de papier et un crayon)...

  19. #19
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    C'est de l'acrobatie, je sais, mais pas si dure que celà et en tout état de cause la plus ergonomique pour l'utilisateur final (c'est lui et lui seul qui importe... et pas le travail accru que cette acrobatie impose au développeur ... cela va tellement de soi !!!)
    Avant, je procédais ainsi, puis je me suis rendu compte que le fait de ne pas permettre à l'utilisateur de voir l'erreur de sa saisie produisait une incompréhension de sa part.
    D'où l'idée de le laisser saisir tranquillement, sans contrôle, pour ne contrôler qu'à la fin que sa saisie était incorrecte, tout en lui indiquant quel genre d'erreur il avait faite.
    Bien sur : tu pourras toujours ajouter un contrôle à la sortie.... et renvoyer le focus à ta textbox si pas bon, etc...
    Comme tu le dis fort justement, sauf qu'au lieu de l'ajouter, personnellement, je le ferai à cet endroit là.
    Mais sur le point suivant, par contre, nous ne sommes plus d'accord :
    mais on s'écarte là de la philosophie de la saisie contrôlée ...
    Car la saisie est effectivement contrôlée. Elle ne l'est plus "en temps 'réel' (si tant est qu'on puisse parler de temps 'réel') mais la saisie est contrôlée. De plus, le traitement processeur est nettement moindre avec cette solution, puisqu'au lieu de le faire travailler à chaque modification dans la zone de texte, le travail ne se fait qu'une seule fois, à la demande de sortie du contrôle. Ceci est un avantage non négligeable lorsqu'on sait que le VBA utilise 100% du processeur, et que, par conséquent, on laisse le système s'occuper de ses petites affaires tranquillement tant que le VBA ne tourne pas...

    Donc, mon avis personnel (tout personnel et n'obligeant personne d'autre que moi) est que le meilleur évènement pour traiter de la saisie valide ou pas est le plus tard possible. D'ailleurs, souvent les sites web eux-même (malgré les récentes technos) font des validations multiples et variées au moment du submit... juste avant le submit. Cela apporte, en outre la possibilité d'une gestion centralisée des erreurs.

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par Maxence HUBICHE
    Cela apporte, en outre la possibilité d'une gestion centralisée des erreurs.
    +1 dont l'intérêt est en outre de pouvoir ajouter des traitements d'erreurs sans avoir à aller triturer le code là où elles se produisent lors de la saisie.
    Mais comme tu dis, ce n'est qu'un avis personnel... que je partage bien volontier

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2008, 07h18
  2. [MySQL] Pourquoi dois-je utiliser des "quotes penchées" dans mes requêtes?
    Par v4np13 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/02/2008, 23h23
  3. Afficher quote/guillemet dans un input
    Par EggY14 dans le forum Langage
    Réponses: 8
    Dernier message: 15/09/2006, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo