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 :

probleme avec "keypress"


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut probleme avec "keypress"
    Bonjour je voudrais avoir le fonctionnement suivant:
    execusion de la macro (manuellement)
    quand j'appuis sur "espace" le programme commence
    il fait "clique gauche" puis un "entrer" a 1 sec d'intervalle
    quand j'appuis sur "Echap" le programme s'arrete.
    j'ai le code suivant et seul la dectection des touches "espace" et "echap" ne sont pas dectectées: les variables de changeent pas d'état.
    De plus, et cela je ne comprend pas, en faisant un debogage en pas a pas le programme ouvre un menu contextuel comme si il faisait un clique droit au lieu d'un clique gauche quand il arrive a la fin de la procedure "leftdown". et il y a une ambigueté avec "Form_keypress" mais ca ne marche pas non plus si j'enleve une des deux procedure.
    Encore une chose, je voudrais savoir si "keypress" marche si on est sur un autre programme (le "clique gauche" suivit de "entrer" marchent si c'est une autre fenetre au premier plan, est ce la meme chose pour "keypress"?
    Je travail sous Exel 2000 et j'ai vista.
    voici le code:
    dans un premier 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
    41
    42
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Const MOUSEEVENTF_LEFTDOWN = &H8
    Const MOUSEEVENTF_LEFTUP = &H10
     
    Public Sub LeftDown()
    mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
    mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
     
    End Sub
     
    Public Sub mamacro()
    Dim arrêt As Boolean
    Dim début As Boolean
    Dim PauseTime, Start
    arrêt = False
    début = True
    While début = False
    Wend
        While arrêt = False
            LeftDown
            PauseTime = 1
            Start = Timer
            Do While Timer < Start + PauseTime
            Loop
     
            appui_touche (vbKeyReturn)
            PauseTime = 1
            Start = Timer
            Do While Timer < Start + PauseTime
            Loop
        Wend
        End
    End Sub
     
    Private Sub Form_KeyPress(KeyAscii1 As Integer)
    If KeyAscii1 = vbKeySpace Then début = True
    End Sub
     
     
    Private Sub Form_KeyPress(KeyAscii2 As Integer)
    If KeyAscii2 = vbKeyScape Then arrêt = True
    End Sub
    et dans un deuxieme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Declare Sub keybd Lib "user32" Alias "keybd_event" _
      (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
      ByVal dwExtraInfo As Long)
     
    Public Sub appui_touche(T As Long)
    'appuie sur la touche
    keybd T, 0, 0, 0
    'relache la touche
    keybd T, 0, 2, 0
    End Sub
    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour,

    j ai vu passé une discussion sur l utlisation du click gauche avec vista il y a qq
    jours (1/2sem) environ
    je recherche.

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut
    ca devais etre moi mais la cest surtout le probleme du keypress.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    pour la detection d un evenement keypress avec space et echap
    dans un userform place ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = 32 Then MsgBox "detection appui sur espace"
    If KeyAscii = 27 Then MsgBox "detection appui sur echap"
    End Sub

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut
    je n'utilise pas de userform je suis dans un module et je voudrais que le programme detecte l'appuis ded la touche espace ou echap quelque soit la fenetre en premier plan.

    si je mets "UserForm_keypress" est ce que cela marche si j'ai pas ma fenetre "UserForm" au premier plan? sinon mercide me donner une solution car je bloque et je n'arrive pas a trouver une autre solution sur le net vu que mon niv en programmation est bas.
    Merci

    Et avec le code que tu me donnes patbou j'ai une erreur qui s'affiche:
    Erreur de compilation:
    type defini par l'utilisateur non defini

    l'erreur est sur la ligne: "Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)"

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Je répondrait comme d'habitude (je devrais faire un texte pour le copier/Coller)
    Avec Vista il est souvent nécessaire d'ouvrir une appli en tant qu'administrateur.
    A la place de double clic sur l'appli ou sont raccourci..
    Clic droit, dans le menu choisir 'Exécuter en tant qu'administrateur'.
    Les erreurs incompréhensibles sont résolues à 90%.
    A+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut
    le message d'erreur est le meme pour la meme ligne alors que j'ai executé Excel en tant qu'administrateur.
    Et je voudrai savoir si la fonction "keypress" marche quelque soit la fenetre au premier plan?
    merci

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    bonjour,
    pour que le mouse_event ai lieu sur la forme souhaitée il faut d'abord définir l'hwnd de la forme.
    A+
    EDIT:
    le code ajouté..
    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
    Public Type POINTAPI
            X As Long
            Y As Long
    End Type
    Public m_CursorPos As POINTAPI
    Public CursorPos As POINTAPI
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Public Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Public Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
     
    Public Const MOUSEEVENTF_LEFTDOWN = &H2
    Public Const MOUSEEVENTF_LEFTUP = &H4
    Declare Sub mouse_event Lib "user32" ( _
                     ByVal dwFlags As Long, _
                     ByVal dx As Long, _
                     ByVal dy As Long, _
                     ByVal cButtons As Long, _
                     ByVal dwExtraInfo As Long)
     
    Sub ClicForme()
        'Merci à Chatbour sur DVP
        'On sauvegarde la position actuelle de la souris
        GetCursorPos m_CursorPos
        'On déplace la souris
        ClientToScreen TaForme.hWnd, currentPos
        SetCursorPos currentPos.X + 100, currentPos.Y + 100
        'On simule un click de souris
        mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
        'Retour à la position précédente
        SetCursorPos m_CursorPos.X, m_CursorPos.Y
     
    End Sub
    Je n'ai pas d'exemple avec Key mais c'est la même chose

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut
    je ne sais pas ce qu'est l'"hwnd" mais en fait j'ai enlever le keypress que j'ai remplacer pas des temporisations. mais le probleme et c'etait le meme qu'avec le code precedent, la macro fait un clique droit au lieu d'un clque gauche. merci de me dire d'ou cela vient parce que je ne vois pas du tout.
    Et je voudrais bien aussi l'explication de "hwnd".
    merci

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    l'hwnd est l'identifiant en Windows de tout objet, contrôle.. form
    Mais c'est vrai que nous somme en VBA et qu'il n'y a pas de hwnd sur un UF.
    Je recherche ma macro pour connaître l'hwnd d' un UF.

    Je met le code pour un UF en VBA
    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
    41
    Public Type POINTAPI
            X As Long
            Y As Long
    End Type
    Public m_CursorPos As POINTAPI
    Public CursorPos As POINTAPI
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Public Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Public Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
     
    Public Const MOUSEEVENTF_LEFTDOWN = &H2
    Public Const MOUSEEVENTF_LEFTUP = &H4
    Public Declare Sub mouse_event Lib "user32" ( _
                     ByVal dwFlags As Long, _
                     ByVal dx As Long, _
                     ByVal dy As Long, _
                     ByVal cButtons As Long, _
                     ByVal dwExtraInfo As Long)
    Public Declare Function GetForegroundWindow Lib "user32" () As Long
    Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
     
     
    Sub ClicForme()
    Dim monhdc As Long
        'Merci à Chatbour sur DVP
        'On sauvegarde la position actuelle de la souris
        GetCursorPos m_CursorPos
        'On recherche le Hdc de l'UF
        Do While monhdc = 0
            monhdc = GetForegroundWindow()
            monhdc = GetDC(monhdc)
        Loop
        'On déplace la souris
        ClientToScreen monhdc, currentPos
        SetCursorPos currentPos.X + 100, currentPos.Y + 100
        'On simule un click de souris
        mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
        'Retour à la position précédente
        SetCursorPos m_CursorPos.X, m_CursorPos.Y
     
    End Sub

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut
    bonjour j'ai un pb avec le keypress, le programme ne reconnait pas l'appuis de la touche "echap ou "espace je ne me rappelles plus. je pense k cela vien de "Form" devant "keypress".
    je veux que la touche echap soit reconnu quelque soit la fenetre (dossier logiciel ...) qui est active.
    merci de m'aider

    voici le code:
    dans un premier module:

    Code :
    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
    41
     
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Const MOUSEEVENTF_LEFTDOWN = &H8
    Const MOUSEEVENTF_LEFTUP = &H10
     
    Public Sub LeftDown()
    mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
    mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
     
    End Sub
     
    Public Sub mamacro()
    Dim arrêt As Boolean
    Dim début As Boolean
    Dim PauseTime, Start
    arrêt = False
     
    PauseTime1 = 5
            Start1 = Timer
            Do While Timer < Start1 + PauseTime1
            Loop
     
        While arrêt = False
            LeftDown
            PauseTime = 1
            Start = Timer
            Do While Timer < Start + PauseTime
            Loop
     
            appui_touche (vbKeyReturn)
            PauseTime = 1
            Start = Timer
            Do While Timer < Start + PauseTime
            Loop
        Wend
        End
    End Sub
     
    Private Sub Form_KeyPress(KeyAscii1 As Integer)
    If KeyAscii1 = 32 Then arrêt = True
    End Sub
    End Subet dans un deuxieme:

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Declare Sub keybd Lib "user32" Alias "keybd_event" _
      (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
      ByVal dwExtraInfo As Long)
     
    Public Sub appui_touche(T As Long)
    'appuie sur la touche
    keybd T, 0, 0, 0
    'relache la touche
    keybd T, 0, 2, 0
    End Sub
    en fait je pense que "form_keypress" signifit que le touche presser sera reconnu si elle est tapée avec une form active. c'est ça??
    et pas besoin de relire toute la converse seulement les 2 dernier suiffise pour resoudre mon probleme.
    erci

  12. #12
    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
    Par défaut
    Tes différentes boucles
    Do While Timer < Start + PauseTime
    Loop
    ne servent à ruien si tu ne places pas un DoEvents à l'intérieur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Do While Timer < Start + PauseTime
                  DoEvents
            Loop
    Sinon, tu aurais pu avantageusement les remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Wait(Now + TimeValue("0:00:05"))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Wait(Now + TimeValue("0:00:01"))

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut
    ok merci je les changerais.

    et est ce que quelqu'un peu me donner la syntaxe du "keypress" pour qu'il reconnaisse l'appuis sur la touche "echap" kelk soit la fenetre active.
    merci

  14. #14
    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
    Par défaut
    J'ai quelque chose ici. Ça date un peu, je crois avoir croisé une réponse pour VBA-E 2003 par SilkyRoad, plus simple, mais faute de l'avoir retrouvée, le code de l'URL fonctionne sur 97 et 2003 mais je ne suis pas certain que tu puisses l'adapter à l'espace. Pour Echap, il faut ajouter le code 27 au tableau et tester
    Tu devras valider le else
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        If Val(Application.Version) < 9 Then
                uId = SetTimer(ghwnd, 0, 1, AddressOf97("GetPressedKey"))
            Else
                'SetTimer ghwnd, 0, 1, AddressOf GetPressedKey
        End If
    Sans garantie pour Echap mais tu auras au moins quelque chose pour t'occuper
    Je regarde s'il existe autre chose mais sans garantie non plus...
    Bon courage

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 90
    Par défaut
    je ne vois pas comment ecrire le code de la reconnaissance de l'appuis sur "echap" ds mon programme.

    et est ce que le code que tu ma donné pour remplacer les boucles "while" fonctionne avec un temps inférieur a 1 seconde?

  16. #16
    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
    Par défaut
    Autant pour moi, je viens de tout relire et entre autres
    "je n'utilise pas de userform je suis dans un module"
    L'URL que je t'ai passée concerne un userform. Donc, oublie ça.
    Dans l'immédiat, je n'ai pas la solution
    Bonne chance dans tes recherches mais si tu trouves, il serait intéressant que tu mettes la solution sur le forum...

  17. #17
    Expert confirmé

    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 : 56
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Si c'est depuis un module, c'est que tu as un classeur
    Si tu as un classeur tu as des évènements du classeur
    Parmi les évènements du classeur, tu as l'Open


    Su Open de ton classeur, tu peux configurer ton Application à réagir à des actions du clavier
    Avec

  18. #18
    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
    Par défaut
    je suis très confused Merci Maxence, tu es mon vrai pense-bête
    Pour associer une macro à des touches tu as effectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Open()
         Application.OnKey "{ESC}", "LaMacro"
    End Sub
    à placer dans Thisworkbook.
    Je sais que je n'ajoute rien mais je l'ai tellement utilisé que là, sûr, Alzheimer me guette

  19. #19
    Expert confirmé

    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 : 56
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Eu égard
    • à la qualité de tes participation,
    • à ton grand âge
    • à ta maladie maintenant (hélas) déclarée (alzheimer)
    Je pense qu'on se permettra d'excuser un simple oubli...









  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
    Par défaut
    Citation Envoyé par Maxence HUBICHE Voir le message
    blabla..
    Blabla...
    [*]à ton grand âge[*]à ta maladie maintenant (hélas) déclarée (alzheimer)[/LIST]Je pense qu'on se permettra d'excuser un simple oubli...



    Ça y est ! Me v'là discriminé ! Je trouverai plus de boulot, alors ?

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