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 :

Detecter le control d'un Userform sur clic [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut Detecter le control d'un Userform sur clic
    Bonjour à tous,

    J'ai un UserForm avec des controls ajouté de manière dynamique.

    J'ai essayer la technique d'attribution d'events dynamique qui fonctionne correctement mais cela genère une latence à l'ouverture du UserForm.

    Comme j'ai une matrice de label j'aimerais, de manière "plus simple", arriver à détecter sur quel label le clic à été effectuer mais avec la position de la souris dans l'UserForm.

    Est-ce possible ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 417

  3. #3
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Mon problème n'est pas la récupération de la position mais la détection du clic...

    En effet, l'event MouseDown du UserForm n'est pas appelé lorsque le clic est fait sur un control (ce qui est normal me direz vous ).

    Mais du coup comment savoir qu'on à cliquer sur un control, si celui-ci n'est pas relié à un event, par détection de la position du clic dans l'UserForm ?

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    passe nous ton classeur, ça ira plus vite.
    Cordialement,

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Voici un classeur (XLSM forcément puisque UserForm !) de démo :
    Classeur1.xlsm

    Au lancement de l'USF une matrice de 3X3 label est générée.

    Le but, lorsqu'on clic sur un label que l'on puisse le récupérer pour avoir accès à ses propriétés.

    Bien sur sans utiliser le WithEvent qui génère une latence (plus il y a de controls plus c'est long....) à l'affichage de l'USF.
    Mais uniquement avec la position du clic dans l'USF.

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    détaille un peu comment tu as fait avec WithEvent
    Tu as créé une classe avec une variable de type Label, et WithEvent
    tu enregistre un label dans la classe
    et tu interceptes l'événement.
    C'est ça?

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Je veux tout regrouper dans la classe de l'USF afin qu'il puisse être facilement réutiliser.

    Donc le WithEvent est directement dans l'USF avec un tableau qui contient donc des objets du type de l'USF.

    C'est faisable autrement ?

  8. #8
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Oui, en créant une classe qui va intercepter l'événement.
    Une instance de la classe par objet Label.
    Voir le code ci joint dans le classeur
    Cordialement,
    Fichiers attachés Fichiers attachés

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Oui ça d'accord, mais ça ne réponds pas au besoin de départ qui est de pouvoir tout regrouper dans l'USF

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    Oui ça d'accord, mais ça ne réponds pas au besoin de départ qui est de pouvoir tout regrouper dans l'USF
    Bonsoir,
    Si tu veux connaitre le contrôle sur lequel tu click, la position de la souris et d'autres informations lié à ce contrôle, tu n'as pas d'autre choix que d'affecter ce contrôle à un objet.

    Tu le fais déjà via un tableau dans ton userform, mais ce n'est pas suffisant car dans ce cas tu ne peux pas intercepter les évènements de ton contrôle!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim MyTableaux() as new classe1
    For i= 1 to 10
    Redim preserve MyTableaux(ubound(MyTableaux)+1)
    Set MyTableaux(ubound(MyTableaux)).MyLabel=me.controles("label" & i)
    Next
    Bien sur MyLabel
    doit être défi en public dans ta classe!

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonsoir
    je te propose une chose tres simple

    voila ton activate modifié
    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
     
    Dim cl As New mesLabels
    Private Sub UserForm_Activate()
        Dim i, j As Integer
        Dim curLbl As Object
        For i = 0 To 2
            For j = 1 To 3
                Set curLbl = Me.Controls.Add("Forms.Label.1", "LB" & (3 * i + j), True)
                With curLbl
                    .Caption = "LB" & (3 * i + j)
                    .Width = 15
                    .Height = 15
                    .Top = 10 + (15 * i)
                    .Left = 10 + (15 * (j - 1))
                End With
            Next j
        Next i
        cl.init_lab Me 'on initialise une  classe 
    End Sub
    ensuite tu va ajouter ceci: dans ton userform ainsi tu va pouvoir continuer a coder dans ton userform pour les évènement click sur les label avec un select case pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub click_sur_label(lequel)
    MsgBox lequel & "  dans " & me.name
    End Sub
    Sub move_sur_label(lequel)
    ' faire ce que tu veux avec me.controls(lequel) 
    End Sub
    maintenant la classe
    comme tu peut le voir elle est yper simplifiée
    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
    Public WithEvents labelo As MSForms.Label
    Public WithEvents forme As UserForm
    Dim lab(100) As New mesLabels
    Sub init_lab(usf)
       Set lab(0).forme = usf
        Dim ctrl
        For Each ctrl In usf.Controls
             'MsgBox ctrl.Name
            If Left(ctrl.Name, 2) = "LB" Then
             i = i + 1
            Set lab(i - 1).labelo = usf.Controls(ctrl.Name)
             End If
        Next
    End Sub
     
    ' ici c'est l'événement de substitution 
    Private Sub labelo_Click()
    labelo.Parent.click_sur_label labelo.Name
    End Sub
    resultat
    Nom : demoingto64 in-out.jpg
Affichages : 1973
Taille : 218,2 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Merci à vous deux pour votre intervention.

    @patricktoulon : ce que j'aurais aimé c'est pouvoir tout intégrer dans l'USF sans avoir besoin d'une classe externe.
    Ce qui permettait d'exporter l'USF tout seul pour la réutilisabilité.

    Par contre il est clair qu'avec la classe externe comme l'as déjà mis @Philippe PONS l'affiche est instantané.
    La classe étant super légère par rapport à la classe de l'USF il n'y a pas photo

    Dommage quand même qu'on ne puisse pas récupérer un control via la position de la souris dans l'USF.

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    salut cerede2000
    je crois que j'ai une idée complètement farfelu pour ton soucis il faut que je mette ca au point
    puisque il est hors de question de faire une classe pour cause de transportabilité
    j'ai eu une idée je sais pas encore si c'est possible dans ce contexte mais je vais essayer de le faire
    en fait apres avoir mis tes labels dynamiquement ajouter de la même manière un control image avec le background style transparent de la même taille que le usf Inside

    parti de la on a plus la possibilité d'avoir le focus sur aucun control
    pas de panique !!!

    et si avec les api GDI on créait des régions correspondantes au contrôles et que dans le move de l'image avec x et y remanier en pixel on déterminait la position sur quelle région

    ensuite toujours avec le même click sur l'image on déclenche l'évènement du control correspondant a la région

    C'EST FARFELU JE TE L4ACCORDE MAIS INTERESSANT TOUT DE MEME


    A étudier
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour tout le monde et bonjour Patrick,

    Patrick puisque tues partie a délirer, je te rappelle que dans une discutions, passé au oubliettes du reste, il était question d'exécuter de vbscript dan un userform.

    Vbscript gérer sans problème les classe, il il est possible de lui passer des objets, me en l'occurrence .

    Il serait donc possible d'instancier dans un tableau tous nos label après les avoir créé dynamiquement dan me.

    Reste à a savoir si no sommes capable de renvoyer les évènements du vbs vers le usf.

    Je pense qu'il n'y aura pas de problème faire interagir les deux environnement mais ne tuons pas la peau de l'ours!

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour Rdurupt
    oui aussi mais ce serait dire de créer le vbs dynamiquement bon ca on connait et que dans ce vbs un boucle infinie jusqu'à message du contraire tourne sur tout les contrôles et récupère leur focus

    un peu lourd a mon gout même avec des sleep qui puis est les sleeps ralentirait la réponse
    tandis que des régions avec gdi sont instantanées il y a cela dans le module classe gdiplus d'harkam46 mais il est un peu lourd mais l'idée est la
    pourquoi cette option
    parce que elle serait appliqué que lorsque le move de l'image change les régions étant en mémoires c'est du rapido de chez rapido et pas de boucle infinie
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Invité
    Invité(e)
    Par défaut
    On déclare un variable public qui encapsule le vbs.

    Les instance de la classe peuvent disposer des Private MyControl_clik ca ça marche, enfin je pense!

    La on renvoie au Usf mais comment????

    Ca fait beaucoup de si et pourrais mettre paris en bouteille avec tous ça, mais délire pour délire....

    Édite:

    Renvoyer information au userform n'est pas un problème, il suffit de déclarer ue sub public dans le usf!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public sub Onclick(myLabel as Object)
    Msgbox  myLabel.name
    End sub
    Vue que nous passons le Uf en paramètre au vbs.
    Code Vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub myLabel_OnClick()
    This.Onclick myLabel
    End sub
    c'est maintenant sur l'événement que j'ai des doutes
    Dernière modification par Invité ; 17/03/2016 à 18h31.

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    je pense que tu confond un peu le .net a quoi certaines chose sont possible mais j'en suis pas sur
    au quel cas j'aurais tord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La on renvoie au Usf mais comment????
    je suppose que tout le tointoin du getobject entre en piste
    dans le vbs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set myapp=getobject("excel.application")
    set myclasseur=app.workbook("tartempion.xls")
    myclasseur.objecttrucchouette.controls (patincoufin).font.color=vbred ' la j'ai des doutes  je ne sais si on peut capter l'usf
    je pense qu'il faut essayer
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Invité
    Invité(e)
    Par défaut
    Non on peut envoyer le userform a vbs, je le fais depuis des années.

    En 2004 par exemple j'ai fait un min enregistreur de macros et j'ai. Lançais la macro de cette manière.

    Ja fait pendant 10 ans de l'asp 3.0 qui utilise le vbscript et j'interceptai le onclick.

    Mais la on parle de contrôle vba dans vbs! Set objVbs = objVba ça ça marche mais comment lier le onclick du contrôle???

    Je regarde ce soir, car pour l'instant je suis dans l'analyse .

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    je suis curieux de voir un exemple

    l'usf en argument ok mais l'événement en vbs j'ai des doutes
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Invité
    Invité(e)
    Par défaut
    A l'heure ou j'écris je t'avoue partager tes doutes!

    effectivement je me bas avec enlèvement Click, mas c'est possible

    http://www.vbforums.com/showthread.p...=1#post1651446

    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
    Private Sub UserForm_Initialize()
    Dim a As Integer
    Dim code As String
    code = "class MyserForm" & vbCrLf
    code = code & "Private Sub Class_Initialize()" & vbCrLf
    code = code & "This.test(This.Label1.name) " & vbCrLf
    code = code & "Set Lab = This.Label1" & vbCrLf
    code = code & "End Sub" & vbCrLf
    code = code & "dim  Lab" & vbCrLf
    code = code & "Sub Lab_Click()" & vbCrLf
    code = code & "MsgBox ""test"""
    code = code & "End Sub" & vbCrLf
    code = code & "end class" & vbCrLf
    code = code & "dim a" & vbCrLf
    code = code & "set a=new MyserForm" & vbCrLf
     
     
    Set scr = CreateObject("ScriptControl")
    scr.Language = "VbScript"
    scr.AddObject "This", Me, True
    Set m = scr.Modules.Add("Module1")
    m.AddCode code
    'm.Run "test"
    Set m = Nothing
    Set scr = Nothing
    End Sub
    Public Sub test(V As String)
    MsgBox V
    End Sub
    Dernière modification par AlainTech ; 28/03/2016 à 21h03. Motif: Fusion de 2 messages

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

Discussions similaires

  1. [AC-2010] Avoir le nom du controle où se trouve le curseur mais sur clic
    Par docjo dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2014, 14h39
  2. [AC-2010] Message sur clic de tous les controles d'un formulaire
    Par docjo dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/06/2011, 16h17
  3. Ouverture de userform par clic sur un bouton de formulaire
    Par karlgina dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/06/2011, 19h29
  4. Controles DTPicker déplacés sur clic
    Par Cirrus dans le forum VBA Access
    Réponses: 1
    Dernier message: 13/05/2008, 17h06
  5. Utiliser un "groupe" de labels sur clic souris dans un Userform
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/04/2008, 02h01

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