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. #21
    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
    Oua les gars !
    J'arrive ce matin sur le forum et je vois mon poste remonter, vous êtes parti dans un sacré truc !!

    Je ne savais même pas qu'il était possible de faire cohabiter du VBA avec du VBS !
    Ca rends le truc puissant du coup

  2. #22
    Invité
    Invité(e)
    Par défaut
    Oui mais ce sera une bonne nouvelle que quand le évènements comme Click seront pris en compte, la c'est encore de l'utopie!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    scr.AddObject "This", Me, True 'permet d'associer tout ton UserForm au code Vbs.
    'This étant le nom virtuel de ton UserForm côté Vbs
    'Note que je pouvais écrire Toto plutôt que This!
    'Me étant to UserForm côté Vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Ici on défini ton module de classe un peut cemme Vba mais c'est dans le même scripte
    code = "class MyserForm" & vbCrLf
    code = code & "end class" & vbCrLf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'et on rentre dans un phase classique comme dans le code que Patrick ta sen doute remis!
    code = code & "set a=new MyserForm" & vbCrLf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Ici nous sommes côté Vbs, mais si tu place un point d'arrêt dans la sub test de ton userform
    'tu verra qu'il y a bien interactions!
    code = code & "This.test(This.Label1.name) " & vbCrLf

  3. #23
    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 tout les deux

    cerede2000: nous on s'amuse très souvent avec ca vba/vbs ca permet de faire du multitâche en cas de gros ou nombreux traitement


    rdurupt :oui mais l'évènement walouh walouh
    j'ai beau chercher je ne trouve pas

    question:
    1° et il possible de coder en vba dans le script control
    2 le src étant un Object instancié par vba comme dans ton exemple finalement il boucle en réinitialisant la classe
    ne bloque t il pas tourne dans le vide

    3 a tu essayer d'envoyer me dans un fichier vbs
    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

  4. #24
    Invité
    Invité(e)
    Par défaut
    Oui il est possible d'envoyer ME dans un fichier VBS mas il faut que je regarde comment on le passe en paramètre car je ne me souviens pas!

  5. #25
    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
    bon en attendant je suis parti de mon idée de régions mais les apis etant un peut difficile a a manipuler gdi je touche moins
    et utiliser une image transparente comme tapis de curseur

    mais j'ai créé mes régions dans 2 dico même pas 25 lignes de code ca fonctionne du tonnere
    et tout ca sans api ni classe

    y a qu'un toulonnais pour inventer ca hein !!!
    Nom : demoingto64 in-out.gif
Affichages : 474
Taille : 1,73 Mo
    Fichiers attachés Fichiers attachés
    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

  6. #26
    Invité
    Invité(e)
    Par défaut
    Bonjour Patrick!
    ce vachement bien le résultat est là et c'est suffisant!

    je n'es pas trouvé, mais maintenant je peux le faire en délitant!

    on peux affecté le onclick d'un contrôle HTML mais un contrôle d'un UF c'est une autre père de manche!

  7. #27
    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
    Oua !!!!!!!!!!!

    Tu est trop fort !

    C'est super mortel ton truc

    Merci

  8. #28
    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
    e bonjour a tous

    attend cerece2000 je l'ai amélioré depuis hier
    je suis en train de le parfaire

    Nom : demoingto64 in-out.gif
Affichages : 514
Taille : 1,35 Mo
    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

  9. #29
    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
    Coool, je suis pressé de voir les améliorations

  10. #30
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il y a une autre solution à laquelle je lavais pas pensé!

    Chaque contrôle dispose d'événements intrinsèque (prise de focus, perte de focus, click,...)

    A l'ouverture le userform donne le focus au premier contrôles de la collection.
    Si je j'applique cet objet a un variable je peux intercepté ses évènements losefocus par exemple et lui appliqué le nouveau contrôle actif et donc intercepté l'événement click.

    Je trouve la solution de Patrick des plus parfaite, mais vu que notre ami a trouvé sa solution,soit par des modules de classe soit par la dernière proposition de Patrick, alors pourquoi pas raisonner sur les différentes formes de solution!

    Vu ce que Patrick a déjà proposé, moi aussi j'ai hâte de voir!

  11. #31
    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
    Ah oui pas mal aussi

    Tu peux illustrer ?

  12. #32
    Invité
    Invité(e)
    Par défaut
    Actuellement, taches ménagère oblige, là je fais ma pose impériale, donc je surf.

    Nom : trone-dore-fauteuil-royal.jpeg
Affichages : 767
Taille : 113,3 Ko

    Mais dès que je retrouve ma prothèse 64bits pas de problème!
    Dernière modification par Invité ; 19/03/2016 à 13h24.

  13. #33
    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 allez version 1.2
    re et voila la neWversion 1.2

    maintenant que la mécanique et bien comprise en tout ca pour moi j'ai un peu modifié
    c'est maintenant adaptable a n'importe quel userform
    il suffit de mettre "classe" dans le tag du control pour les contrôles existants
    ma vraie fausse classe gère le mouse over, mouse out, mouse click
    elle st beaucoup plus précise avec les interstices(espace entre chaque controls) j'ai mis des commentaire en pagaille
    démo en image et pièce jointe
    Nom : demoingto64 in-out.gif
Affichages : 612
Taille : 1,29 Mo

    alors c'est pas la classe ca!!!???? et allez encore un jeu de mot ramoutcho
    Fichiers attachés Fichiers attachés
    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. #34
    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
    et pour éviter l'affichage d'une boite vide quand on clique entre 4 contrôles,
    il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        If Not IsEmpty(dicobouton(col & "*" & lig)) Then
            sub_comune dicobouton(col & "*" & lig)
        End If

  15. #35
    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
    re
    bonsoir philippe pons

    je te remercie mais j'avais déjà corrigé autrement l'intercession centrale entre 4 contrôles

    ma méthode annihile aussi l'effet vibrateur l'ors du déplacement de la souris


    tiens en pièces jointe
    je cherche d'autre amélioration avant de le déposer dans les contribs
    Fichiers attachés Fichiers attachés
    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. #36
    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
    Super !!!!!!!



    @patricktoulon excellent boulot

    Après étude du code, j'ai modifié un peu le fonctionnement pour le rendre plus réactif et complètement éliminer les effet de vibration.

    L'idée, créé un tableau de coord X/Y de la taille de calque.
    Parcourir les controls LBL de la matrice et dans le tableau coord mettre le nom du LBL aux coord du LBL.

    Ensuite MouseHover et MouseClic n'ont plus qu'as accéder à X/Y du tableau pour connaitre le LBL qui s'y trouve (s'il y en a un ).
    Du coup plus de boucle dans les mousehover et mouseclic.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Dim tabCoord() As String
     
    Private Sub UserForm_Activate()
        Dim i, j As Integer, n As Long
        Dim curLbl As MSForms.Label
     
        For i = 0 To 9
            For j = 1 To 10
                n = n + 1
                'Debug.Print n
                Set curLbl = Me.Controls.Add("Forms.Label.1", "LB" & (3 * i + j), True)
                With curLbl
                    .Caption = "LB" & n
                    .Width = 20
                    .Height = 20
                    .Top = 10 + (20 * i) + 8 * i
                    .Left = 10 + (20 * (j - 1)) + 8 * j
                    .BorderStyle = 1
                    .Font.Size = 6
                    .Name = "LB" & n
                    .BackColor = ThisWorkbook.Colors(3 + (Rnd * 30))
                    .Tag = "classe"    'on tag le control pour le prendre en compte dans ma vraie fause classe mort de rire
                    .ZOrder 0
                End With
            Next j
        Next i
     
        classing    'ON INITIALYSE LA  FAUSSE CLASSE apres avoir construit les controls en appelant la sub "classing"
     
        Dim maxX, maxY As Integer
     
        maxX = ActiveWindow.PointsToScreenPixelsX(calque.Width)
        maxY = ActiveWindow.PointsToScreenPixelsY(calque.Height)
     
        ReDim tabCoord(maxX, maxY)
     
        Dim ctrl As Object
        Dim xDebut, xFin, yDebut, yFin
     
        For Each ctrl In Me.Controls
            If InStr(ctrl.Tag, "|") > 0 Then
                xDebut = ActiveWindow.PointsToScreenPixelsX(ctrl.Left)
                xFin = ActiveWindow.PointsToScreenPixelsX(ctrl.Left + ctrl.Width)
     
                yDebut = ActiveWindow.PointsToScreenPixelsY(ctrl.Top)
                yFin = ActiveWindow.PointsToScreenPixelsY(ctrl.Top + ctrl.Height)
     
                For i = xDebut To xFin
                    For j = yDebut To yFin
                        tabCoord(i, j) = ctrl.Name
                    Next
                Next
            End If
        Next
    End Sub
     
    Private Sub calque_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'l 'evenement de la vraie fausse classe est géré par le control image
    ' ici on va créer le mouse over et mouse out
     
        If Not oldcontrol Is Nothing Then
            oldcontrol.BackColor = Split(oldcontrol.Tag, "|")(0)
        End If
     
        Dim ctrlName As String
        ctrlName = tabCoord(ActiveWindow.PointsToScreenPixelsX(X), ActiveWindow.PointsToScreenPixelsY(Y))
        If ctrlName <> vbNullString Then
            Set oldcontrol = Me.Controls(ctrlName)
            Set newcontrol = Me.Controls(ctrlName)
     
            Label1.Caption = tabCoord(ActiveWindow.PointsToScreenPixelsX(X), ActiveWindow.PointsToScreenPixelsY(Y))
     
            newcontrol.BackColor = vbWhite
        End If
    End Sub
    Qu'en pensez vous ?

  17. #37
    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 cerede2000

    ca marche pas ton truc y a plein d'erreur et de manque noamaent le premier oldcontrol qui n'est pas determiné
    ensuite après avoir gérer toutes ces erreurs ca ne marche pas du tout ca fait rien

    j'ai pas analysé a fond mais si je comprends bien ton raisonnement
    tu met les point topleft dans tabcoord

    et après tu espère sans boucle tomber avec les x y du claque sur les item correspondant
    ca peut marcher que si la souris se trouve en haut a gauche du control et encore j'en suis pas sur !!!

    je regarderais ce soir en rentrant
    sinon l'idée est intéressante un+1 rien que pour la tentative
    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. #38
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    ca peut marcher que si la souris se trouve en haut a gauche du control et encore j'en suis pas sur !!!
    En effet mais ils faut tenir compte de la surface occupé par le contrôle et en déduire la position en haut a gauche en imaginant qu'il ne puisse pas y avoir de confusion entre les calque!

  19. #39
    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 le fichier en 1.4 pour preuve que ça fonctionne bien

    fausse classe controls V 1.4.xls

    Beaucoup plus léger, tout est géré à l'initialisation.
    Me reste un truc à régler, à ce niveau là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve tabCoord(500, 500)
    Vu qu'on peux pas Redim Preserve sur 2D alors qu'il faudrait dynamiquement agrandir en même temps que le calque.

    Edit : Pour vous représentez le fonctionnement imaginez une matrice qui contient l'emplacement des labels en fonction des coordonnées de la souris.

    Edit 2 : Petit soucis aussi en fonction de la position de la fenêtre (coordonnées négative), il faut régler ça

  20. #40
    Invité
    Invité(e)
    Par défaut
    Tu ne peux pas redimensionner en 2D mais tu peux surdimensionné ton tableau et en déduire un autre de la bonne dimension!
    em même temps un table de 14 valeur donnera 0 sur modulo 7 donc 15 modulo 7 donnera1!

    ((15 - (15 modulo 7))/7) + iif((15 modulo 7)>0,1,0) donnera la ligne 3
    Et 15 modulo 7 donnera la colonne 1!

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

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