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 :

lancer action avec ctrl + entrée


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 90
    Par défaut lancer action avec ctrl + entrée
    Bonjour,

    je souhaite lancer une action avec ctrl + entrée dans un userform, sans que l'appui sur entrée ne fasse aller à la ligne si je suis encore dans un textbox (car actuellement un simple appui sur entrée fait un retour à la ligne).
    Le code suivant ne se détecte pas le ctrl + entrée, il ne se passe rien : où est l'erreur svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserformBilan_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Chr(KeyAscii) = "^{ENTER}" Then
         Call BoutonValider_Click
    End If
    End Sub
    merci!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Jette un coup d’œil sur le code suivant ..
    code de module
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Option Explicit
    Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hMod As LongPtr, ByVal dwThreadId As Long) As LongPtr
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As LongPtr) As LongPtr
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As Long
    Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
     
    Private Const WH_KEYBOARD = 2
    Private Const VK_LCONTROL = 162 ' Ctrl gauche
     
    Private fHook As LongPtr
     
    Private Function KeyboardProc(ByVal nCode As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
      KeyboardProc = 0
      If (nCode = 0) And ((lParam And &HC0000000) = 0) Then
      On Error Resume Next
        If wParam = 13 Then ' touche entrée
           If GetKeyState(VK_LCONTROL) < 0 Then ' controle gauche appuyé
               KeyboardProc = 1 ' intercepter la touche
     
     
               MsgBox "Ctrl + entrée intercepté"
     
           End If
        End If
      End If
    If (nCode < 0) Or (KeyboardProc = 0) Then: KeyboardProc = CallNextHookEx(fHook, nCode, wParam, lParam)
    End Function
     
    Public Sub EndHook()
      If fHook <> 0 Then
         UnhookWindowsHookEx fHook
         fHook = 0
      End If
    End Sub
     
    Public Sub StartHook()
      EndHook
      fHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0, GetCurrentThreadId)
    End Sub
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 90
    Par défaut
    Bonjour,

    Merci de la proposition avec un code assez complexe que je ne comprends pas bien. Force est de constater qu'il fonctionne bien sur le fichier que tu partages, mais sur mon projet qui est très long et que je ne peux envoyer, il fait buguer visual basic editor !
    C'est assez incompréhensible, l'ordi semble ramer et se bloquer dès que je déverrouille le mdp de mon projet sur vbe, je dois le couper avec le gestionnaire des taches. Puis en revenant dessus dès que je lancer le moindre clic sur vbe rebug ! Et en supprimant le module idem. Puis en supprimant les quelques lignes sur le usf ça redevient normal.

    Alors que ce n'est pas le cas sur ton fichier. Ca me fait un peu penser au bug du débugueur vbe avec le mouse scroll de Cristian Buse...
    Je n'ai pas d'explication et ne sais que conclure...
    D'autant que ce n'est pas intermittent, c'est systématique il y a vraiment quelque chose qui coince, j'imagine une incompatibilité un peu étonnante avec autre chose dans mon code.

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 239
    Par défaut
    Hello mosar3,
    tu utilises quelle version d'Excel sous quel O.S ?
    Si tu crée un classeur avec le formulaire qui utilise le code de gestion du clavier as-tu le problème ?

    [EDIT] j'avais écrit dans un autre forum où il y avait aussi un problème avec plantage d'Excel :
    avec l'emploi d'un adressof si la procédure est exécutée au mauvais moment, ça peut faire planter Excel
    Ami calmant, J.P

  5. #5
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 201
    Par défaut re
    Bonjour
    a partir du moment ou le userform a au minimum un control activX le userform je peut plus gérer le keycode ar il n'a plus jamais le focus a lui tout seul car quand le userform prend le focus c'est son controls(1) qui prend le focus

    cela dit on peut tricher
    il te suffit de mettre un textbox de taille 0 ou caché(Attention pas invisible)
    tu peux le mettre a un left plus grand que la taille du userform par exemple

    et dans l'event mousedown du userform tu donne le focus a ce textbox
    et dans l'events keydown de ce testbox
    si shift=2 and keycode= tilde alors tu apelle ta procedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Shift = 2 And KeyCode = 13 Then procedure
    End Sub
     
    Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    TextBox1.SetFocus
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est assez incompréhensible, l'ordi semble ramer et se bloquer dès que je déverrouille le mdp de mon projet sur vbe, je dois le couper avec le gestionnaire des taches. Puis en revenant dessus dès que je lancer le moindre clic sur vbe rebug ! Et en supprimant le module idem. Puis en supprimant les quelques lignes sur le usf ça redevient normal.
    Le code fonctionne si la forme est lancée en Showmodal.. travailler en mode non modal est trop risqué car le projet peut à tout moment être stoppé ou recompilé sans désinstaller le hook, l'utilisation de WH_KEYBOARD au lieu de WH_KEYBOARD_LL permet l’installation du hook uniquement sur le processus en cours, WH_KEYBOARD_LL ne bloque pas mais intercepte toutes frappes mêmes celles d'autres applications, ce qui n'a pas de sens ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Shift = 2 And KeyCode = 13 Then procedure
    End Sub
    Il manque l'interception du caractère pour empêcher la propagation dans le gestionnaire d’événement KeyDown
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      If Shift = 2 And KeyCode = 13 Then
         KeyCode.Value = 0
         ..
      End If

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 239
    Par défaut
    Hello,
    Citation Envoyé par patmeziere Voir le message
    Bonjour
    a partir du moment ou le userform a au minimum un control activX le userform je peut plus gérer le keycode ar il n'a plus jamais le focus a lui tout seul car quand le userform prend le focus c'est son controls(1) qui prend le focus
    Ce n'est pas tout à fait vrai car si les contrôles ont la propriété TabStop à False, le Userform a le focus tant qu'on a pas mis le focus sur un contrôle (par exemple en entrant du texte dans un TextBox)
    On peut très bien intercepter le ctrl Entrée si dans les KeyDown des contrôles qui possèdent un événement KeyDown (dont le formulaire) on appelle une sous-routine qui teste le ctrl+entrée
    Exemple avec un formulaire qui possède deux textbox et un bouton de commande :
    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_KeyDown(ByVal Keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
       CtrlEnter Keycode, Shift
    End Sub
    Private Sub TextBox2_KeyDown(ByVal Keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
       CtrlEnter Keycode, Shift
    End Sub
    Private Sub UserForm_KeyDown(ByVal Keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
       CtrlEnter Keycode, Shift
    End Sub
    Sub CtrlEnter(Keycode, Shift)
      If Shift = 2 And Keycode = 13 Then
         MsgBox "CTRL + Entrée"
         Keycode.Value = 0
      End If
    End Sub
    Private Sub CommandButton1_Click()
       MsgBox "CommandButton1  cliqué"
    End Sub
    Nom : ShortcutInterceptJP.gif
Affichages : 210
Taille : 211,4 Ko


    Classeur en pièce jointe.

    Ami calmant, J.P
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/11/2019, 20h37
  2. Ouvrir un pdf et lancer une action avec acrobat pro X
    Par acbdev dans le forum VBScript
    Réponses: 5
    Dernier message: 20/12/2014, 09h14
  3. Lancer appli avec un utilisateur particulier
    Par [DreaMs] dans le forum Langage
    Réponses: 6
    Dernier message: 14/09/2005, 09h20
  4. Réponses: 4
    Dernier message: 27/04/2004, 14h45
  5. [VB6] Multiselection avec CTRL dans une msflexgrid
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/04/2003, 10h57

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