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

VBA Discussion :

[VBA]Faire une pause jusqu'à pression d'1 touche clavier


Sujet :

VBA

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 110
    Points : 137
    Points
    137
    Par défaut [VBA]Faire une pause jusqu'à pression d'1 touche clavier
    Bonjour,

    Je voudrais faire une pause jusqu'à ce que l'on appuie sur le clavier, mais je ne sais pas comment récupérer les entrées du clavier.

    Ca serait qch comme ça :

    While ????=""
    Wend

    Tout simplement... mais je ne connais pas en VBA (attention pas en VB6 ou autre) la fonction ou propriété qui me donne la valeur d'une touche appuyée.

    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    en VBA, il y a OnKey qui marche bien

  3. #3
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Pour pouvoir "récupérer" les entrées au clavier :

    Tu as l'événement Keypress

    Si tu veux l'utiliser pour ta form (entrées n'importe où), penses à mettre à true la propriété Keypreview de ta form.

    Si tu veux également récupérer l'utilisation d'une touche spéciale, il te faudra utiliser utiliser l'événement Keydown ou Keyup


  4. #4
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 110
    Points : 137
    Points
    137
    Par défaut
    Rebonjour,

    Merci pour vos réponses,

    mais en fait, ce n'est pas par rapport à un événement dans un form

    mais juste dans un bout de procédure.

    Il y a bien une variable pour lire le buffer clavier, non ?

    J'ai oublié, et en parcourant l'aide, pas trouvé.

  5. #5
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Je ne connais personnellement aucune procédure qui ne soit liée à un événement....

    Parfais mes humbles connaissances, s'il te plait !



    ton code donc, s'il n'est pas lié à un événement de ta form, il est bien lié à un événement, non ?? Lequel ???

    PS : je ne connais pas non plus (suis très pauvre, vois-tu ?) de "variable pour lire le buffer du clavier".... Etablir un buffer et savoir ce qu'il y a dedans, oui, je sais faire.... mais pas avec VB tout seul .....

    Allons, allons ....


  6. #6
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    si tu ne vaux pas passer par OnKey, il faut y aller par les API (GetKeyState je pense)

  7. #7
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    si tu ne vaux pas passer par OnKey, il faut y aller par les API (GetKeyState je pense)
    Oui, par exemple, mais GetAsyncKeyState (pas GetKeyState), relèvera toutes les touches, quel que soit l'endroit, y compris hors application en cours...

    Il vaut peut-etre mieux lier à un événement d'un objet, il me semble...

    Je n'avais pas vu qu'on était en VBA : le Onkey y est bien l'équivalent du Keypress de VB et me paraît indiqué.


  8. #8
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    je pense qu'une simple boucle avec un doevents, une vérification d'une variable, et dans le keypress, un évenement qui met la variable à true si la touche est préssée devrais suffire.


    salut
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  9. #9
    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
    Essaie avec ça récupéré sur le forum, y'a fort longtemps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
    Sub essaiKeypress()
        Do
             Sleep 100
        Loop Until GetAsyncKeyState(121) <> 0
    End Sub
    121 correspond à la touche F10

    Tu dis

    A+

  10. #10
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Pour Mephisto :

    mais je ne connais pas en VBA (attention pas en VB6 ou autre)
    Tu fais la même erreur que moi : il n'a pas le Keypress sous VBA (il a par contre le Onkey)
    [/code]

  11. #11
    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
    J'ai une réponse plus complète :

    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
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
    Sub essai2Keypress()
    Dim ok(12) As Boolean
        Touche = Array("", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12")
        Do
            ok(1) = GetAsyncKeyState(112) <> 0
            ok(2) = GetAsyncKeyState(113) <> 0
            ok(3) = GetAsyncKeyState(114) <> 0
            ok(4) = GetAsyncKeyState(115) <> 0
            ok(5) = GetAsyncKeyState(116) <> 0
            ok(6) = GetAsyncKeyState(117) <> 0
            ok(7) = GetAsyncKeyState(118) <> 0
            ok(8) = GetAsyncKeyState(119) <> 0
            ok(9) = GetAsyncKeyState(120) <> 0
            ok(10) = GetAsyncKeyState(121) <> 0
            ok(11) = GetAsyncKeyState(122) <> 0
            ok(12) = GetAsyncKeyState(123) <> 0
            Sleep 100
        Loop Until ok(1) Or ok(2) Or ok(3) Or ok(4) Or ok(5) Or ok(6) Or ok(7) Or ok(8) Or ok(9) Or ok(10) Or ok(11) Or ok(12)
        For i = 1 To 12
            If ok(i) Then MsgBox "Tu as frappé la touche " & Touche(i)
        Next
    End Sub
    A+

  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
    Points : 15 543
    Points
    15 543
    Par défaut
    Comme on me l'a justement fait remarqué (DarkVader), les deux procédures que j'ai proposées occupaient inutilement le processeur. Je les ai donc corrigées sur ses conseils.
    Ainsi modifiées, le taux d'occupation du µp est voisin de zéro.

    A toutes fins utiles

  13. #13
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par ouskel'n'or
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Do
             Sleep 100
        Loop Until GetAsyncKeyState(121) <> 0

    c'est le sleep 100 qui permet de consomer moint de ressource?

    ça fonctionne comment?

    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  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
    Points : 15 543
    Points
    15 543
    Par défaut
    Satan demande :
    c'est le sleep 100 qui permet de consommer moins de ressource ?
    "Apparemment", c'est kernel32, auquel on envoie la valeur en ms, qui gère ça.
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    A part ça, il faudrait que quelqu'un de plus savant t'explique ça, je n'ai aucune info sur la façon d'utiliser les bibliothèques disponibles - dll ou autres. Si quelqu'un peut me dire où on trouve ça, je suis preneur.

    Et puis enfin, est-ce que je t'en pose des questions, moi ?

    A+ quand même...

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    sur vba il y a inputbox pour ça pas besoin d'inventer l'eau chaude
    Elle est pas belle la vie ?

  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
    Points : 15 543
    Points
    15 543
    Par défaut
    Oui, bien sûr, mais tu dois faire "Entrée" ensuite...
    En outre je donnais ça pour identifier les touches F1... F12, ayant galéré pas mal de temps fut un temps pour y parvenir, et j'ai mis ça pensant que ça pourrait servir à quelqu'un.
    Quant à ré-inventer l'eau chaude, vu comme ça, tu as sans doute raison, mais vu que les questions se suivent et se ressemblent, on réinvente tous l'eau chaude un jour ou l'autre... Tu vas pas nous enlever cette satisfaction...

    A+

  17. #17
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 110
    Points : 137
    Points
    137
    Par défaut
    Bonjour à tous,

    Je vous remercie pour vos réponses, et je vois que ça suscite quand même quelques messages pour une question si simple...

    En fait, l'autre jour, qn est venu me voir et m'a demandé comment faire pour faire une pause jusqu'à ce qu'une touche soit pressée en VBA.

    Sur le coup, je me suis dit : trop facile... Et bien non, j'y suis pas arrivé.. pas de variable buffer ou qch comme ça. Je sais faire avec un événement OnKey. Ou alors dans d'autres langages.

    Pour l'utilité, je ne sais pas trop ce que la personne voulait faire avec ça. Mais ce n'était pas lié à un événement.

    Bon, je vais essayer le bout de code que vous donnez !

    : Vous parlez des API et je ne suis pas du tout un pro là-dedans, et je me demande toujours où on peut trouver une Référence des APIS très bien documentées avec des exemples clairs. Ca existe ?

    Merci encore !

  18. #18
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 110
    Points : 137
    Points
    137
    Par défaut Ca marche !
    Je viens de tester le bout de code de ouskl'n'or et ça marche.
    Par contre, les ressources font la gueule !
    J'ai modifié le code en dégageant le sleep 100, et en le remplaçant par un DoEvents.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer 
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
     
    Sub essaiKeypress() 
        Do 
               DoEvents 
        Loop Until GetAsyncKeyState(121) <> 0 
        MsgBox "La touche F10 a été pressée !" 
    End Sub

    Allez, ça me va. Je déclare le fil résolu !

  19. #19
    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
    Helo mainecoon,
    C'est curieux, avec doevents, j'avais 10/11% des ressources occupées, et voisines de zéro avec la tempo...
    Tant mieux si DoEvents te va, évite de déclarer un truc de plus.

    A+

  20. #20
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 110
    Points : 137
    Points
    137
    Par défaut
    Salut ouskel'n'or !

    Ca me fait penser que dans le code j'ai laissé la déclaration pour le Sleep...

    Au fait, est-ce que tu sais où trouver la liste des fonctions/procédures des librairies user32, kernel32 et cie avec en plus des exemples bien documentés ?

    Mainecoon.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/12/2012, 21h26
  2. [VBA]Comment faire une pause
    Par Thierry'' dans le forum VBA Access
    Réponses: 14
    Dernier message: 14/04/2007, 14h42
  3. Faire une "Pause" en VBA
    Par Keuf95 dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2006, 15h31
  4. Faire une pause dans le programme
    Par shinobi dans le forum Access
    Réponses: 6
    Dernier message: 13/06/2005, 16h37
  5. [MFC] Faire une pause dans un thread
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 21/02/2005, 11h49

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