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 :

[E-97] Comment récupérer les coordonnées du curseur ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 17
    Points
    17
    Par défaut [E-97] Comment récupérer les coordonnées du curseur ?
    Bonjour à tous,

    Je voudrais récupérer les cordonnées X et Y du curseur, après avoir fait un clic gauche de la souris.
    J'ai recherché dans les commandes du VBA mais il n'existe pas de commandes spécifiques à ce problème.
    Quelqu'un pourrait-il me mettre sur la voie ou me donner une méthode ?
    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Bonsoir,

    il va falloir , t'intéresser aux APIs.... mais je serai curieux de savoir ce que tu veux en faire de ces coordonnées X,Y ..? ensuite tu vois le 0,0 où au bord de ton écran, de ta feuille de calcul, de la fenêtre windows active ?
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    Les coordonnées en quelle unité (Pixels ? Twips ? Points ? Himetrics ? autres ?...) et par rapport à quoi (Ecran ? Fenêtre de ta UserForm ? Feuille Excel ?...)
    Ta question est fort imprécise !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Merci d'avoir répondu si rapidement.
    Je vais essayer d'être un peu plus clair.

    Dans une feuille de calcul, je trace une polyligne brisée ayant plusieurs sommets, en incrémentant l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With feuilleRelevage.Shapes.AddLine(X1, Y1, X2, Y2)
    Tous les sommets de cette polyligne sont définis en points écran et l'origine du repère (0,0) est définie en haut à gauche de la feuille.
    A partir de là, je voudrais obtenir les coordonnées d'un sommet situé sur la polyligne, en cliquant près de ce sommet.
    Dès lors où j'obtiendrai les coordonnées X et Y du pointage, je pourrai rechercher le sommet le plus proche.
    ça parait simple.

    Suis-je plus précis ?


  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    "en cliquant près de ce sommet"
    me parait très.... subjectivement imprécis ...
    Bref...(coupons court) :
    Tu cherches à savoir en quelles abscisse et ordonnée (exprimées en points) de ta feuille tu as cliqué ? (réponse par oui ou par non).

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    OUI

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bon...

    Plusieurs aspects :
    Aspect 1 (que nous traitons déjà) : code pour relever la position du curseur...
    Tout en haut de ta page de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Puis, dans l'évènement de ton choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GetCursorPos Pt
        MsgBox "abscisse : " & Pt.X & " pixels" & vbCrLf & "ordonnée : " & Pt.Y & " pixels"
    Aspect 2 : comme tu le remarques (message affiché par la msgbox), les coordonnées sont exprimées en pixels, alors que Excel travaille avec une échelle de points. Il te faut donc convertir ces valeurs en échelle de points.
    Tu trouveras deux ou trois discussions où j'ai traité de ces aspects. En voilà une, qui me parait suffire à ce niveau :
    http://www.developpez.net/forums/d57...-feuille-exel/
    Lis-là entièrement et attentivement, surtout si tu dois distribuer ton application (en raison de ce que le nombre de twips par pixel peut varier d'une machine à l'autre, bien qu'il soit dans 99% des cas de 15, tant horizontalement que verticalement)

    Aspect 3 : Interception du click sur ta feuille. Je n'ai pas Excel à portée de main et serait assez enclin, de mémoire, à penser que l'évènement selectionchanged serait adéquat... mais ... il ne se déclenchera pas au 2ème click sur une cellule déjà cliquée ... A toi de voir comment régler ce problème-là...

    Aspect 4 : les coordonnées obtenues sont relatives à l'écran. Il faudra donc corriger en fonction de la position de ta feuille (et, peut-être, de la hauteur des barres de Excel). Nous traiterons cet aspect là lorsque tu en auras terminé avec les 3 aspects précédents, si tu veux bien.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Aspect 3 : Interception du click sur ta feuille. Je n'ai pas Excel à portée de main et serait assez enclin, de mémoire, à penser que l'évènement selectionchanged serait adéquat... mais ... il ne se déclenchera pas au 2ème click sur une cellule déjà cliquée ... A toi de voir comment régler ce problème-là...
    L'API ne peut-il pas lui aussi gérer ceci? Je suis pas spécialiste en API (je m'en suis jamais servi), mais bon vu qu'il gère déjà les coordonnées, pourquoi pas le clic.

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    On peut tout faire, decondelite, tout...
    Mais à quel prix ? Celui de transformer l'appli en une véritable usine à gaz ????
    Excel est Excel et c'est avant tout un tableur...
    Le détourner de son propos à je ne sais quelles fins curieuses ? Oui, c'est possible (comme il serait possible, pourquoi pas, de se mettre à plusieurs dizaunes de membres-développeurs avancés pour ... fabriquer un autre ... Excel !!!

    Alors, un peu usine à gaz : oui, d'accord ! Totalement usine à gaz : sans moi !

    Notre ami demandeur a une solution évidente dans son cas de figure : au click (en réalité lors de l'évènement selectionChanged) : relevé de ses coordonnées (à quelles fins ? c'est son affaire). Une fois les coordonnées relevées ===>>> on change de cellule active à son gré, ce qui fait que le prochain click provoquera de nouveau l'évènement SelectionChanged.

    Aller plus loin, une autre fois, est certes possible, mais je ne partiiciperai pas à la construction de ce type d'usine à gaz (même si je n'aime pas Excel ...)

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Je disais ça juste pour ne pas avoir le problème des cellules.

    Il est évident pour moi aussi que Excel n'est pas fait pour qu'on y émule des fonctions de dessin. Il me paraît tout aussi évident que programmer en VBA un truc qui n'aura finalement pas grand-chose à voir avec l'application support du code VBA est un choix on va dire "assez étrange" ou inapproprié.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Je ne voudrais pas que mon probléme crée des discordes entre ucfoutu et decondelite.
    C'est déjà bien d'essayer de m'expliquer, moi qui plane à 15 miles.
    Je veux tout simplement utiliser des coordonnées stockées dans une feuille Excel et les afficher sous forme graphique personnalisée.

    Quoiqu'il en soit, UCFOUTU, j'ai essayé en vain de coller tes lignes de code, et je n'obtiens aucun résultat.

    J'ai bien l'impression , comme dit JackOuYA, qu'il va falloir que je m'interesse aux APIs (est-ce une maladie ?) choses dont j'ignorais l'existence jusqu'à présent.
    D'ailleurs le mot "POINTAPI" est un mot clé introuvable dans mon Excel !
    As-tu essayé l'Aspect 1 ? Moi je n'y arrive pas, ou je ne copie pas au bon endroit.


  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Citation Envoyé par CAFOUIN Voir le message
    Quoiqu'il en soit, UCFOUTU, j'ai essayé en vain de coller tes lignes de code, et je n'obtiens aucun résultat.

    .
    D'ailleurs le mot "POINTAPI" est un mot clé introuvable dans mon Excel !
    As-tu essayé l'Aspect 1 ? Moi je n'y arrive pas, ou je ne copie pas au bon endroit.
    1) parce qu'il te faut bien évidemment typer pt comme Pointapi !!
    ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim pt As POINTAPI 
        GetCursorPos pt
        MsgBox "abscisse : " & pt.X & " pixels" & vbCrLf & "ordonnée : " & pt.Y & " pixels"
    2) on ne s'intéresse pas "aux API" mais aux fonctions contenues dans les librairies de l'Api de Windows ...

    3) bien évidemment que le mot POINTAPI ne risque pas de se trouver dans ton aide VBA !!!... puiqu'il s'agit d'une structure (donc d'une variable d'un type défini par l'utilisateur) utilisée par une fonction de l'Api de Windows ! On l'aurait appelée BACHIBOUZOUK ou TRUCMUCH (pourquoi pas ?) ===>> celà n'aurait absolument rien changé !
    (ce n'est que par respect d'une convention de nommage qu'on a ici donné à cette structure le nom POINTAPI... pas parce que POINTAPI signifie quelquechose de particulier !)

    Tu en veux la preuve ? (je renomme tout autrement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Type CAFOUIN
        CARAMBAX As Long
        CARAMBAY As Long
    End Type
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As CAFOUIN) As Long
     
    Private Sub Command1_Click()
       Dim monpoint As CAFOUIN
       GetCursorPos monpoint
        MsgBox "abscisse : " & monpoint.CARAMBAX & " pixels" & vbCrLf & "ordonnée : " & monpoint.CARAMBAY & " pixels"
    End Sub
    CAFOUIN non plus, ne figure dans aucune aide (sauf chez ucfoutu )

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    personnellement je traçerais des courbes dans un graphique et récupèrerais les valeurs du points à partir de l'évènement MouseMove :

    http://silkyroad.developpez.com/VBA/...iques/#LII-A-6


    bon week end
    michel

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Merci du cours, ucfoutu, mais j'en suis toujours à essayer de récupérer ces foutues coordonnées malgré tes conseils.
    J'ai bien essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Type CAFOUIN
        CARAMBAX As Long
        CARAMBAY As Long
    End Type
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As CAFOUIN) As Long
     
    Private Sub Command1_Click()
       Dim monpoint As CAFOUIN
       GetCursorPos monpoint
        MsgBox "abscisse : " & monpoint.CARAMBAX & " pixels" & vbCrLf & "ordonnée : " & monpoint.CARAMBAY & " pixels"
    End Sub
    mais je n'obtiens aucune coordonnées.
    J'en viens à me demander si mon Windows XP SP3 reconnait cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As CAFOUIN) As Long
    car à part cela tout me parait correct.

    ????????????????????????????????????????????????????????????


  15. #15
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Bonsoir,

    Tu devrai revoir le nom de tes variables, et de tes objets, ton bouton par exemple il s'appelle comment ? le message box il s'affiche ?


    Habituellement sous excel tu devrai avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub CommandButton1_Click()
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

  16. #16
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonsoir,

    1) La fonction GetCursorPos existe sur toutes les versions de Windows.
    2) les noms utilisés pour tes variables (si le copier-coller est bien ce que tu as écrit) n'ont rien à voir là-dedans

    Il est par contre clair que ton bouton de commande (sur lequel tu cliques) doit s'appeler Command1. Si tu l'appelles autrement, par exemple coucou, il faut également modifier la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Command1_Click()
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub coucou_Click()

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonjour,

    dans une feuille xl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
     
    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Dim pt As POINTAPI
    GetCursorPos pt
    MsgBox "pos x = " & pt.X & "   pos y = " & pt.Y
     
    End Sub

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Patbou,

    la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheet_BeforeRightClick
    n'est pas reconnue par Excel 97.

  19. #19
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonsoir à tous

    Si je peux me permettre, la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheet_BeforeRightClick
    existe sur excel 97 et cela fonctionne avec XP, mais apparemment pas sous win98

    Eric

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    ça y est, ça marche, voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
     
    Private Sub CommandButton1_Click()
    Dim pt As POINTAPI
    GetCursorPos pt
    MsgBox "pos x = " & pt.X & "   pos y = " & pt.Y
    End Sub
    tu as raison ucfoutu c'était le nom du bouton de commande qui était différent.
    Merci.
    Maintenant que j'ai passé l'étape 1, je vais me pencher sur la suivante ... mais un peu plus tard.

    Merci encore à tous.

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

Discussions similaires

  1. graphics -ocaml- comment récupérer les coordonnées de la souris ?
    Par étudiante6 dans le forum Langages fonctionnels
    Réponses: 0
    Dernier message: 20/12/2012, 23h42
  2. Réponses: 2
    Dernier message: 17/12/2012, 11h49
  3. Récupérer les coordonnées du curseur
    Par djtsou dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 03/05/2008, 11h51
  4. Comment récupérer les coordonnées d’un clique sur une image ?
    Par da_sys dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/11/2006, 12h34
  5. Comment récupérer les coordonnées sur le bureau d'une form ?
    Par fma2112 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 22/02/2006, 23h43

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