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 :

Keypress qui ne fonctionne pas [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Points : 39
    Points
    39
    Par défaut Keypress qui ne fonctionne pas
    Bonjour à tous,

    Je souhaite contrôler la saisie de caractères dans deux textbox. Aucun problème pour la 1ère (txtRessource). En revanche, la macro court-circuite la 2ème (txtRepertoireFichiers). J'ai pu m'en rendre compte en la faisant tourner pas à pas. Je tourne en rond et n'arrive pas à régler ce problème, sans comprendre pourquoi il existe Pouvez-vous m'aider ?

    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
    Private Sub txtRessource_KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    '   Forcer les majuscules lors de la saisie
        keyAscii = Asc(UCase(Chr(keyAscii)))
    '   Obliger la saisie de lettres
        If keyAscii < 65 _
            Or ((keyAscii > 90) And (keyAscii < 97)) _
            Or keyAscii > 122 Then
            keyAscii = 0
        End If
    End Sub
     
    Private Sub txtRepertoireFichiers__KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    '   Obliger la saisie de chiffres, de lettres ou de l'antislash
        If keyAscii < 48 _
            Or ((keyAscii > 57) And (keyAscii < 65)) _
            Or keyAscii = 91 _
            Or ((keyAscii > 92) And (keyAscii < 97)) _
            Or keyAscii > 122 Then
            keyAscii = 0
        End If
    End Sub

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut
    Bonsoir
    En gros tu veux que certains caractères ne soit pas possibles dans le textbox, est ce bien ça?

    Si c'est le cas donne moi les caractères interdits ou ceux qui sont autorisées?

    Au plaisir

    re
    dans un premier temps et par rapport a ce que je comprend de ta question
    voici un exemple utilisant la fonction native vba "instr"sur le chr(keyascii)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub txtRessource_KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    'autorise que les 26 lettres de l'alphabet
    constante_permise = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
    If InStr(constante_permise, Chr(keyAscii)) = 0 Then keyAscii = 0
    End Sub
     
    Private Sub txtRepertoireFichiers__KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    'autoriser que les chiffre ou l'antislash
    const_numeric_autorisée = "0,1,2,3,4,5,6,7,8,9,\"
    If InStr(const_numeric_autorisée, Chr(keyAscii)) <= 0 Then keyAscii = 0
    End Sub
    ou pour le 2 eme si tu veux autoriser tout sauf les symbole a part l'antislasch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const_non_autorisée = ",,;,:,/,!,.,&,~,#,',{,(,[,-,|,`,^,@,],),=,}"
    If InStr(const_non_autorisée, Chr(keyAscii)) > 0 Then keyAscii = 0
    comme tu vois rien de compliqué

    au plaisir

    re
    j'oubliais
    dans le premier tu veux aussi les majuscules tu a 2 solutions
    la 1 ere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constante_permise = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
    la 2 eme tu change pas la constante mais la comparaison avec la fonction "lcase"(minuscule):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    constante_permise = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
    If InStr(constante_permise, lcase(Chr(keyAscii))) <= 0 Then keyAscii = 0
    voila

    au plaisir

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Bonsoir brunop3165, patricktoulon
    que veut dire
    la macro court-circuite la 2ème (txtRepertoireFichiers
    Les deux procédures sont indépendantes d'après ce que je vois.

    Ca signifie que le 2eme Sub n'est jamais faite ? Il y a deux soulignés ("_").
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub txtRepertoireFichiers__KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    ESVBA

  4. #4
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re
    j'oubliais
    dans le premier tu veux aussi les majuscules tu a 2 solutions
    la 1 ere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constante_permise = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
    la 2 eme tu change pas la constante mais la comparaison avec la fonction "lcase"(minuscule):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    constante_permise = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
    If InStr(constante_permise, lcase(Chr(keyAscii))) <= 0 Then keyAscii = 0
    voila

    au plaisir
    Bonsoir Patrick,

    la fonction Instr cherchera constante_permise telle que tu l'as définie: c'est à dire: "a,bc,d...." dans Chr(KeyASCii) qui ne renvoi qu'un caractère.
    L'opérateur de comparaisons de chaînes Like permet de gérer avec beaucoup plus de souplesse.
    une plage de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Chr(KeyAscii) Like "[a-z]" Then
    ou plusieurs plages:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Chr(KeyAscii) Like "[a-zA-Z0-9]" Then

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci à tous pour vos réponses.
    C'est ESVBA qui a gagné ! Je n'avais affectivement pas vu que j'avais saisi 2 "_" Avec un seul, ça marche mieux, évidemment, et la procédure est exécutée Merci encore

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    Effectivement je n'avais pas vu l'erreur sur le grand tiret

    Cela dit le reste de ton code reste une mini usine a gaz pour ce que tu veux faire

    Tu a maintenant 3 méthodes
    la tienne
    la fonction "instr"
    et la fonction like de NVCfrm
    bien que je corrigerai la derniere comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Not Chr(keyAscii) Like "[a-z]" Then keyAscii = 0
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Not Chr(keyAscii) Like "[a-zA-Z0-9]" Then keyAscii = 0
    Un code avec une méthode bien choisi c'est 80% de l'efficacité du code

    Tu a de quoi méditer sur ce point

    au plaisir

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    En quoi ma méthode est-elle une usine à gaz ? Est-ce à la création ou bien lors de l'exécution ? N'étant pas un pro des macros (ce que tu as vu ), j'aime bien comprendre pour ne pas reproduire les mêmes erreurs plus tard

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re

    usine a gaz au niveau de l'écriture du code et le nombre de conditions

    car la il faut connaître les keycode des touches pour pouvoir choisir

    plutôt que d'utiliser le "< que" mais "> que" plusieurs fois en fonction des touches désirées

    avec la fonction "inst" on cherche une occurrence de la touche tapée dans une constante de type string beaucoup plus simple et rapide

    et avec la fonction like c'est un peu pareil


    je suis en train de réaliser une classe a ce sujet je la mettrais dans les contributions

    au plaisir

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    Merci pour tes explications complémentaires

  10. #10
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bonjour,

    Citation Envoyé par patricktoulon Voir le message
    car la il faut connaître les keycode des touches pour pouvoir choisir
    Il y a des constantes pour ça :
    vbKeyA = 65
    vbKeyZ = 90


    Sinon si fais un copier et coller dans la zone de texte de caractères '"interdit" ça ne bloque pas la modification...

    Il faut faire un test après mise à jour dans l'évenement AfterUpdate pour être sûr de ne pas pas laisser passer une valeur incorrecte.

  11. #11
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par brunop3165 Voir le message
    Bonjour,

    Merci à tous pour vos réponses.
    C'est ESVBA qui a gagné ! Je n'avais affectivement pas vu que j'avais saisi 2 "_" Avec un seul, ça marche mieux, évidemment, et la procédure est exécutée Merci encore
    Bonsoir,
    pour nous du moins pour moi en tout cas ta discussion n'est pas un sujet de compétition. Ma réponse n'a été motivée que par un constat.
    Comme te l'a suggéré Arkham46 l'évènement AfterUpdate est plus pratique et sûr pour le programme sans être contraignant pour l'utilisateur qui peut entrer des touches accidentelles qu'il corrigera peut-être avant validation.
    KeyPress peut être déroutée des fois.

    @Patrick
    ...Tu a maintenant 3 méthodes
    la tienne
    la fonction "instr"
    et la fonction like de NVCfrm
    bien que je corrigerai la derniere comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Chr(keyAscii) Like "[a-z]" Then keyAscii = 0
    La fonction Instr est très pratique pour repérer une chaîne dans une autre.
    pour une comparaison de chaînes dans le contexte j'aurais préféré LIKE.
    Dans l'argument Charlist [...] on peut remplacer l'opérateur not par le symbole "!" comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Chr(keyAscii) Like "[!a-z]" Then keyAscii = 0

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut
    Bonjour NVCFRM

    Je prend ta dernière remarque sur le "!" a la place de "not" en compte .
    Ta façon d'écrire tes codes me séduit favorablement en terme de raccourcissement de code,sachant que c'est le but que je veux atteindre
    Je t'invite d'ailleurs a me rejoindre dans les contribution a fin de faire evoluer ma derniere contribution a ce sujet

    Merci pour le retour

    au plaisir

    Re
    Arkham46
    Je reviens avec un souci j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TextBox1_AfterUpdate()
    MsgBox "coucou"
    End Sub
    Rien ne se fait !
    A quel moment se déclenche cette fonction ??

    Et pour eviter tout (copier coler) sur le textbox y compris avec les touches (ctrl V)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub nomdutextbox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Application.CutCopyMode = False
    Application.CutCopyMode = True
    End Sub
    ca semble faire l'affaire



    Merci pour le retour
    Au plaisir

  13. #13
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    A quel moment se déclenche cette fonction ??
    ben après la mise à jour

    mais je crois que c'est en sortant du contrôle que cela se déclenche

    ce n'est donc pas dynamique lors de la saisie

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Re
    arkham46
    Et bien oui c'est ce que je pensais moi aussi mais rien ne se fait
    Ni avec la touche "Enter" ce qui me donne le focus sur le textbox suivant
    Ni en sélectionnant un autre textbox avec la souris

    C'est pour cela que j'ai poser la question

    J'avoue que je ne comprends pas
    Merci pour le retour
    Au plaisir

  15. #15
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Et bien oui c'est ce que je pensais moi aussi mais rien ne se fait
    Ni avec la touche "Enter" ce qui me donne le focus sur le textbox suivant
    Ni en sélectionnant un autre textbox avec la souris
    bizarre, sur Excel 2007 l'événement TextBox1_AfterUpdate est bien déclenché

  16. #16
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Citation Envoyé par patricktoulon Voir le message
    Je reviens avec un souci j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TextBox1_AfterUpdate()
    MsgBox "coucou"
    End Sub
    Rien ne se fait !
    A quel moment se déclenche cette fonction ??
    Pour ce code nu : testé sous 2003, 2007, 2010, 2013 = OK, à noter qu'il ne se déclenche, fort logiquement, que s'il y a changement de la propriété Value et non pas lors d'une prise ou d'une perte de focus.
    D'autre part comme le dit Arkham46, il ne peut être à objectif dynamique car :

    Citation Envoyé par aide VBA
    Cet événement ne peut être annulé. Si vous souhaitez annuler la mise à jour (pour rétablir la valeur précédente du contrôle), utilisez l'événement BeforeUpdate et affectez la valeur True à l'argument Cancel.
    L'événement AfterUpdate se produit après l'événement BeforeUpdate et avant l'événement Exit pour le contrôle actif et avant l'événement Enter pour le contrôle suivant dans l'ordre de tabulation
    c'est pourquoi j'emploie BeforeUpdate dans ce Tuto qui n'est pas sans rapport dans l'analyse d'approche de la problématique avec ce fil :

    Approche d'une résolution de besoin en VBA niveau débutant :Obliger une saisie numérique dans une TextBox


    cordialement,

    Didier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08
  2. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. CREATEFILEMAPPING qui ne fonctionne pas???
    Par Jasmine dans le forum MFC
    Réponses: 2
    Dernier message: 06/01/2004, 19h33
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

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