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 :

Comment détecter deux évènements click dans une combo sans changement de sélection ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 66
    Points : 67
    Points
    67
    Par défaut Comment détecter deux évènements click dans une combo sans changement de sélection ?
    Bonjour,

    J'utilise une sélection dans une combobox pour remplir des champs text box. Ceci est fait avec l'évènement click de la combo. Les text box sont modifiables manuellement et je peux vouloir recharger les valeurs initiales. Comment les recharger à nouveau à partir de la combo sans changer la valeur sélectionnée de la combo ? L'évènement click n'est pas déclenché tant que je n'ai pas changé de selection dans la combo.

    Merci.

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    et en utilisant l'evenement DblClick?
    Jérôme

  3. #3
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    Bien
    Laurent Longre explique comment recourir au api de window sur ce sujet
    un click et un double click sont interceptés par deux évènements distincts le simple clic est automatiquement intercepté avant le double-click les api permette d'intercepter le nombre de millisecondes écoulées entre deux appuis .
    La procédure à un niveau qui n'est pas sans danger
    voici une partie des explications de Laurent :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Exemple d'utilisation de  fonctions API
     
    Le clic simple et le double-clic sur un contrôle (par exemple un objet Image) sont interceptés respectivement par les événements VBA Click et DblClick :
     
    Private Sub Image1_Click()
       MsgBox "Clic simple sur l'image"
    End Sub 
     
    Private Sub Image1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        MsgBox "Double-clic sur l'image"
    End Sub
     
    Si on veut gérer à la fois le clic et le double-clic sur l'image, avec VBA on se retrouve coincé : quand on double-clique, la procédure Image1_Click est appelée en premier et empêche Image1_DblClick de se déclencher.
     
    Les fonctions API (plus quelques petites astuces de programmation!) permettent de résoudre ce problème :
     
    Private Declare Function GetTickCount Lib "Kernel32" () As Long
     
    Private Declare Function GetDoubleClickTime Lib "User32" () As Integer
     
    Dim bDblClick As Boolean
     
    Private Sub Image1_Click()
     
       Dim T As Long
       T = GetTickCount
       Do: DoEvents
       Loop While GetTickCount - T < GetDoubleClickTime
       If Not bDblClick Then MsgBox "Simple clic sur l'image" _
          Else bDblClick = False
     
    End Sub
     
    Private Sub Image1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     
       MsgBox "Double-clic sur l'image"
       bDblClick = True
     
    End Sub
     
    La fonction API GetTickCount permet de connaître le nombre de millisecondes écoulées depuis le démarrage du système. Cette fonction est plus précise que la fonction analogue Timer de VBA, qui serait inappropriée ici.
     
    La fonction GetDoubleClickTime permet de connaître le laps de temps définissant un double-clic (nombre de millisecondes maximal entre le 1er et le 2ème clic).
     
    Les instuctions Private Declare Function... indiquent à VBA que ces deux fonctions peuvent être utilisées, en définissant leur nom, la librairie dans laquelle elles se trouvent (respectivement Kernel32 et User32), les arguments, ici () car ces deux fonctions n'en ont pas, et le type de valeur renvoyée (respectivement le type Long et le type Integer).
     
    L'astuce est la suivante :
     
        * S'il se produit un clic sur l'image, la procédure Image1_Click est déclenchée
        * Cette procédure "attend" qu'un 2ème clic se déclenche éventuellement (boucle Do... Loop). Cette attente continue jusqu'à ce que l'intervalle de temps maximale du 2ème clic (GetDoubleClickTime) soit écoulé.
        * Dans cette intervalle, la boucle Do... Loop appelle "en rafale" la fonction DoEvents. Cette fonction rend temporairement la main au système d'exploitation jusqu'à ce que ce dernier ait terminé de traiter les événements de sa file d'attente.
        * Si dans l'intervalle un deuxième clic se produit, le système d'exploitation va alors provoquer l'appel (grâce à DoEvents) de la procédure Image1_DblClick. Celle-ci va gérer le double-clic, mettre la valeur True dans la variable bDblClick et rendre le contrôle à Image1_Click.
        * A la fin de la boucle, on peut donc savoir s'il y a eu double-clic (bDblClicj = True) ou non (bDblClick = False) et agir en conséquence.
     
    Sans fonctions API, VBA rendrait difficile ce genre d'opération car il ne permet pas, entre autres, de connaître des informations du système comme l'intervalle du double-clic.
    a noter : je viens de me faire taper sur les doigts pour avoir donné le lien d'un site non assuré de pérennité donc une recherche internet sur "Laurent longres" devrait t'amener aux explications complètes
    Daranc

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 66
    Points : 67
    Points
    67
    Par défaut
    Bonjour,
    Merci pour ces deux réponses, mais celà ne correspond pas à mon cas. Il ne s'agit pas de distinction Clic / Double clic, mais de 2 simples clic, par exemple séparés de 30 secondes. Si j'associe dans la procédure Click une msgbox, au premier Click, j'ai bien le message, au deuxième click sur le même élément de la liste, je n'ai pas de message, j'en déduis que je ne déclenche pas l'évènement Click. Par contre, si je change d'élément dans la combo, le Click est bien détecté.
    Mon besoin est de charger des zones éditables (à partir de sélection dans la combo) et éventuellement, après modification manuelle des zones éditables, de recharger les valeurs initiales de la combo.

    Cordialement.

  5. #5
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Citation Envoyé par JYL74 Voir le message
    je peux vouloir recharger les valeurs initiales.
    La réponse découle de ce je peux vouloir : S’il s’agit d’une possibilité, il ne faut pas mettre en place d’automatisme lié à un événement.

    Le plus simple semble donc de rajouter un contrôle, un CommandButton par exemple, sur lequel cliquer pour rétablir les valeurs avant modifs manuelles.

    Sinon 2 clics successifs dans le Combo : l’un sur un autre choix, l’autre sur le choix initial.
    Michel Gaboly
    Développeur Excel et VBA


    Pas de question technique par MP, je n’y répondrai pas, utilisez le forum - Merci
    Pensez à ajouter le tag

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 66
    Points : 67
    Points
    67
    Par défaut
    Merci pour ces réponses.

    Je vais m'orienter vers la réponse pleine de pragmatisme de Bigalo :
    Sinon 2 clics successifs dans le Combo : l’un sur un autre choix, l’autre sur le choix initial.

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

Discussions similaires

  1. [Débutant] Comment détecter un lien hypertexte dans une textbox ?
    Par jyves47 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/02/2014, 17h31
  2. Réponses: 7
    Dernier message: 27/06/2011, 15h56
  3. Réponses: 1
    Dernier message: 19/02/2010, 18h41
  4. Réponses: 5
    Dernier message: 04/08/2008, 22h20
  5. [VB6] Bloquer la modification dans une combo sans être en lecture seule..
    Par malhivertman1 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 10/05/2006, 16h55

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