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 :

[VBA]xl*-Utiliser F1...F12 dans un form [Trucs & Astuces]


Sujet :

Macros et VBA Excel

  1. #1
    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 546
    Points
    15 546
    Par défaut [VBA]xl*-Utiliser F1...F12 dans un form
    Hello,

    Le post que j'ai mis avant le mois d'août ayant disparu sans laisser de trace, je repose la question :

    Comment utiliser les touches F1...F12 depuis un form sans avoir à mettre du code dans chaque contrôle (office 97)

    Ces touches devant me servir à d'autres fonctions qu'une aide contextuelle (déjà réalisée), elles seraient necessaires à ce que je veux réaliser. Connaissant le principe (je n'y arrive pas ), du code m'arrangerait

    Par avance, merci ++

    A+

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    En VB 6, la méthode est la suivante :

    1- Code l'interception des touches dans l'événement KeyDown de ta feuille :
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        If KeyCode = vbKeyF1 Then
            Debug.Print "F1"
        End If
    End Sub
    2- Modifie la propriété KeyPreview de ta Form à True afin qu'elle intercepte la saisie clavier avant les contrôles.

    Malheureusement, je ne sais pas si ça s'applique à VBA / Office 97 ...

  3. #3
    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 546
    Points
    15 546
    Par défaut
    Hélas, pas de Propriété KeyPreview dans les userforms

    Mais merci quand même, je me prépare à changer de version... à terme

    A+

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    A défaut de trouver une soluce propre, il reste toujours l'utilisation d'un hook clavier grâce aux api

  5. #5
    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 546
    Points
    15 546
    Par défaut
    Bonjour, Tofalu,

    Je reprends tes conseils :
    "l'utilisation d'un hook"
    nécessite la création d'une dll
    selon l'API que j'ai trouvé. Je n'ai jamais fait ça avec VBA... C'est possible ?

    "Grâce aux "API" Jai effectivement trouvé un source de 240 lignes pour faire ça... en C -> http://nono40.developpez.com/sources/source0007/ pour ceux que ça intéressent

    Mais une solution m'a été proposée avant l'été, en passant par un module de classe mais, comme j'ai précisé, je comprends le principe qui devrait me permettre d'y parvenir - parfaitement, je comprends le principe ! C'est à partir de là que je bloque...

    Pour démarrer, j'aurais besoin d'un exemple concret et complet pour la syntaxe. Je ne suis arrivé à rien avec la mienne ( )

    Mais merci de ta réponse

    A+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    Il y a une astuce en VBA pour utiliser les appuis de touche... Essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.OnKey "VALEUR_TOUCHE", "MacroAUtiliser"
    Alors pour ce qui est des différentes valeurs possibles pour les touches (je ne cite pas tout) :
    AIDE {HELP}
    ATTN {BREAK}
    BAS {DOWN}
    DEBUT {HOME}
    DEFILEMENT {SCROLLLOCK}
    DROITE {RIGHT}
    ECHAP {ESCAPE} ou {ESC}
    EFFACER {CLEAR}
    ENTREE {ENTER}
    F1 à F15 {F1} à {F15}
    FIN {END}
    GAUCHE {LEFT}
    HAUT {UP}
    INSERTION {INSERT}
    RETOUR {RETURN}
    SUPPR {DEL} ou {DELETE}
    TABULATION {TAB}

    touche CTRL = ^
    touche ALT = %
    touche SHIFT = +

    Donc pour faire une combinaison de touche rien de plus simple : ^{F1} correspond à CTRL+F1 ; ^%{F2} correspond à CTRL+ALT+F2 ...
    J'espère que sa t'aidera !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 103
    Points : 97
    Points
    97
    Par défaut
    D'accord je comprend.. Sinon pour dépanner tu peux utiliser la méthode que je t'es mentionné et dans ta macro tu vérifie quelle form a le focus et après tu gères l'action à associer..

    Bon c'est sur que la gestion avec de long select case c'est pas très cool pour s'y retrouver mais bon...

    Si j'ai du temps libre j'irai voir ton source pour le retranscrire en vba mais je ne te promet rien.. en ce moment c'est chaud-time!

    A plus!

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Hello ouskel'n'or

    Je t'ai pas oublié et me revoilà avec ma solution de Hook (enfin un

    début de solution)

    Dans un 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
     
    Public Const WH_KEYBOARD = 2
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, 
     
    ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As 
     
    Integer
    Declare Function SetWindowsHookEx Lib "user32" Alias 
     
    "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal 
     
    hmod As Long, ByVal dwThreadId As Long) As Long
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) 
     
    As Long
    Public hHook As Long
    Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As 
     
    Long, ByVal lParam As Long) As Long
        'if idHook is less than zero, no further processing is required
        If idHook < 0 Then
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal 
     
    lParam)
        Else
            'check if SHIFT-S is pressed
            If GetKeyState(vbKeyF1) Then
                'show the result
                MsgBox "press F1"
            End If
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal 
     
    lParam)
        End If
    End Function
    Dans une form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub UserForm_Initialize()
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 
     
    Application.Hinstance, 0)
    End Sub
     
    Private Sub UserForm_Terminate()
        UnhookWindowsHookEx hHook
    End Sub
    Bon alors, je n'ai que excel 2003 donc ... il se peut que sous 97, il

    faille remplacer addressof par addrof. ensuite tu verras que si tu

    appuie longtemps sur F1, il y a un effet de répétition A voir

    comment le stopper. Et enfin pour que ce soit opérationnel il faudrait

    plutot que ce soit actrif quand la form est à l'écran ... donc les

    évenements Activate et desactivate sont peut être plus approprié.

    En tout cas, je pense que la fin est proche

    EDIT : Pour les répitions, on peut utiliser une variable booléenne genre :

    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
    'In a module
    Dim stopping As Boolean
    Public Const WH_KEYBOARD = 2
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public hHook As Long
    Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        'if idHook is less than zero, no further processing is required
        If Not stopping Then
        stopping = True
        If idHook < 0 Then
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        Else
            'check if SHIFT-S is pressed
            If GetKeyState(vbKeyF1) Then
                'show the result
                MsgBox "press F1"
            End If
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        End If
        stopping = False
        End If
    End Function

  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 546
    Points
    15 546
    Par défaut
    Hello Tofalu,

    Merci de ta réponse. J'arrive juste et j'essaie ça tout de suite.

    Je te dis.



    NB - Je suis encore sur Office 97... Hélas.

  10. #10
    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 546
    Points
    15 546
    Par défaut
    Hello Tofalu,

    J'ai un problème avec la ligne

    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, Application.Hinstance, 0)
    KeyboardProc n'attend-elle pas des paramètres ?

    Ensuite, tu me fais déclarer deux fonctions KeyboardProc.
    J'en ai rebaptisé une KeyboardProcb mais je ne sais pas d'où l'appeler et si je dois l'ajouter à la ligne ci-dessus)

    Un autre hic, Hinstance est inconnu dans vba et je n'ai rien trouvé pour instance (à part dans les déclarations..)

    Enfin dans cette ligne,
    KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    le paramètre idHook n'existe pas dans la déclaration de la fonction, non plus que dans l'une des deux fonctions KeyboardProc

    Bref, je crains que tu idéalises ma compréhension des choses de la vie...

    Re-bref : Tes m'éclaireraient.

    Par avance, merci

    A+

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Pour les deux keyboard proc, c'est justement que la dernière empeche les répétitions, c'est une améliroation de la première.

    Pour le HInstance ... arf, je ne sais pas par quoi remplacer. Tu peux essayer par 0 peut être

  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 546
    Points
    15 546
    Par défaut
    Hello,

    Merci de ta réponse... mais...
    ... reste toujours la question des paramètres attendus par KeyboardProc

    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc(????), Application.Hinstance, 0)
    Ensuite, Application.0... ça me semble bizarre... tu es sûr ?

    En parallèle, j'essaie avec un module de classe. Tu n'as pas d'idée ?

    A+

  13. #13
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Non 0 tout cours, pas application.0, ça c'est sûr

  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 546
    Points
    15 546
    Par défaut
    Hello,

    Donc, j'ai mis AddressOf KeyboardProc... pas accepté
    donc, j'ai mis AddressOf:=KeyboardProc,0,0)
    ,0,0)... Pas accepté

    donc j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf:=KeyboardProc)
    et j'ai tenté d'ouvrir mon form...
    Nom embigu sur WH_KEYBOARD (déclaré deux fois... cémafaute)

    puis j'ai retenté... Nom embigu sur KeyboardProc, et là je t'avoue, je m'y attendais un peu...

    Mais comme dit l'autre "qui ne recule pas avance..."

    N'empêche que je t'embête mais...

    Merci du mal que tu te donnes pour orienter un type qui sait même pas où est le nord...

    A+

  15. #15
    Membre éprouvé
    Avatar de ridan
    Inscrit en
    Avril 2003
    Messages
    710
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2003
    Messages : 710
    Points : 1 126
    Points
    1 126
    Par défaut
    Salut,

    une autre piste avec l'API GetAsyncKeyState, j'ai trouvé ce lien sur MSDN :

    http://support.microsoft.com/default...d=kb;fr;465098

    ça peut être utile : :


    Bon courage

  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 546
    Points
    15 546
    Par défaut
    Merci Ridan,

    Exactement ce que je cherchais... (c'est ce qui est écrit dans l'url !)
    Demain à la première heure, je teste.
    Mais je vais encore passer une mauvaise soirée en pensant à ce qui m'attend...

    A+

  17. #17
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Ce que tu n'as pas compris, c'est que les deux codes donnés sont le même module. Tu utilise soit l'un soit l'autre

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Ok, Tofalu, j'avais mis ça dans deux modules séparés (en prévision de l'ambiguïté prévisible...) mais bien sûr ça n'a rien changé (!)

    Ridan, Je n'ai pas encore regardé la solution de l'url que tu m'as donnée mais elle était écrite pour Office 95... Je suis dubitatif mais vue la simplicité, je vais tout de même essayé. Là, tout de suite, j'ai d'autres problèmes mais je vous tiens au courant.

    Encore merci tous les deux... et tous les autres... :o etc...

    A+

  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 546
    Points
    15 546
    Par défaut
    Hello,

    je peux déjà dire des choses... C'est pas gagné !

    Ridan, je pense qu'effectivement, l'Url que tu m'a passée concernait Office 95, VB5 et antérieurs. En tout état de cause, je n'ai pas réussi à le faire marcher.

    Tout de suite, j'en suis à récupérer et analyser les différentes combinaisons de touches disponibles afin, plus tard, quand ça marchera, faire ce que je veux dans tous les cas possibles...

    Je vous tiens au courant...

  20. #20
    Membre éprouvé
    Avatar de ridan
    Inscrit en
    Avril 2003
    Messages
    710
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2003
    Messages : 710
    Points : 1 126
    Points
    1 126
    Par défaut
    Salut,

    Je vais aussi voir s'il est possible de trouver une solution ce soir ... Enfin une occasion pour voir à quoi ressemble le Visual Basic Editor

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

Discussions similaires

  1. Comprendre l'utilisation de VB dans un form Access.
    Par nomade333 dans le forum IHM
    Réponses: 9
    Dernier message: 11/03/2007, 12h22
  2. [VBA-E]Utiliser un indice dans un nom d'objet
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/06/2006, 16h42
  3. [VBA-E]Utiliser une variable dans une formule
    Par bossu dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 04/06/2006, 15h25
  4. Réponses: 1
    Dernier message: 19/05/2006, 18h25
  5. [VBA-E] Utiliser le range dans un tab croisé dynamique
    Par GoLDoZ dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/03/2006, 16h12

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