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 :

Détecter l'entrée et surtout la sortie d'un formulaire de la souris ?


Sujet :

Macros et VBA Excel

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Détecter l'entrée et surtout la sortie d'un formulaire de la souris ?
    Bonjour à toutes et à tous et merci de votre temps et de votre aide.

    J'ai un formulaire ouvert en mode Non Modal (vbModeless).
    Je suis capable avec Mous-Move de savoir qu'actuellement je suis dans le formulaire mais pas de détecter le moment où j'entre et surtout celui où j'en sort.

    Mon but est de réagir en affichant l'adresse de la sélection actuelle (plus d'autres infos) dés que l'utilisateur survol mon formulaire puis s'il quitte le formulaire faire disparaître ces informations.

    Quelqu'un a-t'il déjà programmé cela ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Je n'ai peut-être pas bien compris ce que vous vouliez faire.
    Vous pouvez lancer un code à partir de la détection de mouvement.
    Par exemple, j'ai un USF sur lequel j'ai des boutons. Lorsque je passe la souris sur les boutons, un explicatif de la fonction s'affiche dans une zone de texte (Label1) et les caractères du bouton passent en italique. Tout redevient normal (le texte s'efface et les caractères redeviennent normaux) lorsque je sort du bouton (en fait quand je passe dans le frame de l'USF), et ainsi de suite.

    Pour le frame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
    ByVal x As Single, ByVal y As Single)
    RAZItaliqueGras
    End Sub
    Pour un bouton (j'en ai 8 dans l'USF) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
    ByVal x As Single, ByVal y As Single)
    With Me
        With .CommandButton1.Font
            .Bold = True
            .Italic = True
        End With
        With .Label1
            .Caption = "Mon texte explicatif à afficher !"
        End With
    End With
     
    End Sub
    Et pour la remise à zéro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub RAZItaliqueGras()
    'Remise à zéro des textes des boutons en italique et gras
    'et effacement du Label1
    For Numbout = 1 To 8
        With Me("CommandButton" & Numbout).Font
            .Bold = False
            .Italic = False
        End With
    Next
    Me.Label1.Caption = ""
     
    End Sub

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour

    le soucis c'est que quand tu sors du formulaire tu n'a plus rien (aucun evenement a associer ) pour tester ta position souris
    si ce n'est que par une boucle infini interruptible

    la seulle possibilité que je connaisse et qui n'alourdirait pas l'app c'est la position X/Y dans l'evenement mosemove de l'usf

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '5 peut etre une marge insufisante selon la vitesse du deplacement de la souris  l'augmenter le cas echeant
    'apres voir si il n'y a pas des controls a ces enplacements scela complique un peu la chose mais en gros
    ' faire pareil dans les evenement mousemove de ces controls
    ok = ""
    If Y > 5 And Y < Me.InsideHeight - 5 Then
    If X > 5 And X < Me.InsideWidth - 5 Then ok = [A1] Else ok = ""
    End If
     TextBox1 = ok
    End Sub
    Nom : demo.gif
Affichages : 535
Taille : 201,7 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

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Merci :a vous.

    @Mic13710 , c'est au niveau du formulaire lui-même que je souhaite travailler, pas pour un contrôle en particulier.

    @patricktoulon , je pense que c'est ce dont j'ai besoin. Je n'avais pas pensé à une idée de marge.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Une solution parfaite existe bel et bien, mais passe par un hooking et donc l'utilisation de fonctions de l'Api de Windows.
    Et quand on dit "hooking", on dit nécessité d'une parfaite maîtrise de ce que l'on fait (notamment en mode création et tests) --->> sinon --->> plantage assuré, voire dégâts assurés.

    Es-tu certain de ce la vocation d'un tableur est ce que tu cherches à en tirer ? (la réponse est bien évidemment NON).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Le code fonctionne mais si on déplace la souris vraiment vite (ex : du milieu du formulaire à une cellule) l'événement sur move n'attrape pas la marge et les données restent là.

    Je pense que je vais faire un bouton finalement.

    Merci à tous.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    oui je l'ai préciser pour la marge
    après oui comme dis jacques :Hooker ,mais c'est costaud beaucoup de ramdam pour au final pas grand chose
    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

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    tiens regarde celle la elle devrait faire ton affaire
    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
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer
    Private Type POINTAPI: X As Long: Y As Long: End Type
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '5 peut etre une marge insufisante selon la vitesse du déplacement de la souris  l'augmenter le cas echeant
    'après voir si il n'y a pas des controls a ces emplacements cela complique un peu la chose mais en gros
    ' faire pareil dans les évènement mousemove de ces controls
        Dim pos As POINTAPI
        GetCursorPos pos
        Handle = WindowFromPoint(pos.X, pos.Y)
        ok = ""
        If Y > 5 And Y < Me.InsideHeight - 5 Then
            If X > 5 And X < Me.InsideWidth - 5 Then ok = [A1] Else ok = ""
        End If
        TextBox1 = ok
        t = Timer
        Do: DoEvents: X = Timer - t: Loop While X < 0.1
        GetCursorPos pos
        If WindowFromPoint(pos.X, pos.Y) <> Handle Then TextBox1 = ""
    End Sub
    ya pas photo ca patch
    Nom : demo.gif
Affichages : 507
Taille : 109,2 Ko
    pour éliminer le raté par rapport a la vitesse de la souris
    on fait une pause de 10 millisecondes
    ps: j'aurais pu utiliser l'api sleep pour la pause c'est pareil
    et on test le handle avec windowfrompoint si c'est pas le me qu'au départ on vide le textbox


    ps: j'ai mémé essayé 0.03(30milisecondes) ca marche parfaitement bien

    et meme simplifié la chose
    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
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Type POINTAPI: X As Long: Y As Long: End Type
    '
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        TextBox1 = [A1]
        Dim pos As POINTAPI
        GetCursorPos pos
        Handle = WindowFromPoint(pos.X, pos.Y)
        t = Timer
        Do: DoEvents: X = Timer - t: Loop While X < 0.03
        GetCursorPos pos
        If WindowFromPoint(pos.X, pos.Y) <> Handle Then TextBox1 = ""
    End Sub
    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. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour patricktoulon et désolé du délais.

    J'ai revu mon interface et je ne pourrais pas utiliser ton code car mon utilisateur pourrait changer de page alors que je dois conserver les informations.

    Je te remercie grandement pour tes efforts qui me seront surement très utiles dans le future car c'est un problème que j'ai rencontré plusieurs et qui m'avait fait renoncer à utiliser les formulaires.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Citation Envoyé par marot_r Voir le message
    Bonjour patricktoulon et désolé du délais.

    J'ai revu mon interface et je ne pourrais pas utiliser ton code car mon utilisateur pourrait changer de page alors que je dois conserver les informations.

    Je te remercie grandement pour tes efforts qui me seront surement très utiles dans le future car c'est un problème que j'ai rencontré plusieurs et qui m'avait fait renoncer à utiliser les formulaires.

    A+
    bonjour
    j 'avoue ne pas comprendre ce que tu souhaite vraiment

    il faudrait en dire plus absolument rien ne peut être perdu ou être retrouvé même en changeant de page( userfom ou autre )
    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

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Pour accomplir son travail mon utilisateur peut sélectionner une plage dans une feuille puis aller consulter des données dans une ou plusieurs autres feuilles puis revenir sur sa page initiale.

    Si par hasard il passe sur le formulaire alors qu'il est sur une autre page, le programme réagirait en changeant les données que le formulaire affichait avant or il ne faut pas.

    De plus au départ je prévoyais d'avoir une seule cellule d'intérêt mais je me suis aperçu qu'il m'en fallait parfois 2.
    Je ne peux donc pas simplement récupérer la cellule active ce qui était mon idée lors de mon 1er post.

    Merci encore de ton aide.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Le plus simple n'est-il pas de subordonner l'exécution du code au caractère actif de la feuille en cause ?, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If activeSheet.name = "toto" the
     
    End if
    EDIT ou encore (si le code agit sur des cellules) de préciser tout simplement de quelles cellules DE QUELLE FEUILLE, voire de QUEL CLASSEUR , genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With workbooks("....").Worksheets(".....")
       .range(....).value = ...
    end with
    Plutôt (ce qui est probablement le cas) que de travailler avec des ActiveSheet, ThisWorkbook, etc ...
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour

    oui je rejoins jacques sur ce coup la

    ajouter le test sur activesheet il n'y a pas d'ambiguïté aussi bien pour le déclenchement que pour l'affichage ou pas

    tu peut ajouter pour cela par exemple un test avec rangefromproint si la fonction te donne "range" tester le parent


    si le parent ne te convient pas alors l'userform garde les données affichées sinon vide

    c'est tout

    je te fait un exemple si tu veux
    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
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour et merci de votre intérêt.

    je te fait un exemple si tu veux
    Non et merci encore.

    J'ai compris le principe et oui je pourrais tester la feuille active et ne réagir que dans ce cas mais comme mon utilisateur a besoin de me signaler les 2 zones : source et destination.

    La détection automatique ne présente plus l'Intérêt que je lui voyais au départ.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re

    les 2 zones : source et destination
    oui j'ai compris
    *mais je ne vois pa ou est ton soucis bref c'est comme tu veux il n' y a pas de soucis
    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

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/03/2016, 09h33
  2. Exécutable qui attend la touche entrée pour produire ses sorties
    Par meufeu dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 09/10/2015, 19h24
  3. Reboucher une entré audio sur une sortie audio
    Par rolfone dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 24/04/2010, 22h10
  4. REGEXP pour détecter chiffres entre parenthèses
    Par noyau dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/01/2010, 10h18
  5. Probleme audio: entrée relié a la sortie
    Par amine_en_france dans le forum Windows XP
    Réponses: 4
    Dernier message: 14/12/2007, 11h34

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