XL 2010 Déplacer le curseur avec un objet

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Sur ma feuille j'ai un objet, en l'occurrence une icône. Quand je clique sur celle-ci, cela active une macro et l'icône change de position sur la feuille.
Peut-on faire en sorte que le pointeur de la souris se déplace automatiquement avec l'icône pour que l'on n'ait pas à aller la chercher si l'on veut immédiatement après recliquer dessus ?
 
Solution
Comme tu as utilisé un split, tu as créé 2 panneaux dont les références de positionnement diffèrent de la fenêtre. Donc c'est plus compliqué.

Maintenant il faut ajouter le Module_ObjectPane que j'ai fait pour déterminer le panneau auquel appartient la Shape Image. Le code est corrigé pour que les coordonnées de l'image tiennent compte du panneau d'appartenance de sa cellule haut gauche (Shape.TopLeftCell).

Edit: J'ai aussi modifié le fichier du Post #7 pour tenir compte de la possibilité de splits.

job75

XLDnaute Barbatruc
Il existe les APIs Windows GetCursorPos et SetCursor Pos.

Mais la position du curseur est déterminée par rapport à la fenêtre Excel alors que celle de l'icône est déterminée par rapport aux bords de la feuille de calcul.

Utiliser GetCursorPos au début pour déterminer la position du curseur par rapport à l'icône.

Et SetCursorPos pour restituer cette position après déplacement de l'icône.
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour job75, le forum,

Il serait quand même plus simple de faire en sorte que l'icône ne se déplace pas.
Pas possible. L'icône sert à déclencher une macro qui gère une présentation "Vue Normale" / "Pein Écran", et donc forcément elle se déplace.
Je me doutais bien qu'il fallait passer par des APIs Windows. Le problème des APIs, c'est que quand on les utilise dans une application, il faut alors envisager de rédiger 2 applications : une pour Excel 32 bytes, l'autre pour Excel 64 bytes.
 

job75

XLDnaute Barbatruc
L'icône sert à déclencher une macro qui gère une présentation "Vue Normale" / "Pein Écran", et donc forcément elle se déplace.
Non, par rapport à la feuille de calcul l'icône ne se déplace pas, ses coordonnées ne changent pas

Il suffira d'estimer la hauteur de la barre de titre et de l'ajouter à la position Top de l'icône.

Seule l'API SetCursorPos sera nécessaire.
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Il faut aussi tenir compte du fait que sa position est exprimée en points.
Voici un code qui positionne le curseur au milieu de l'image et à titre d'exemple puisque le mouse_event fait partie de mon Module_PositionCurseur, la sélectionne et lance un .OnAction.

Edit: Ajout du Module_ObjectPane qui permet de gérer le panneau d'appartenance de l'image dont les coordonnées dépendent et adaptation du code pour en tenir compte.
 

Pièces jointes

  • CurseurSurImage.xlsm
    42 KB · Affichages: 4
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonjour Dudu2,

Merci pour votre aide. N'étant pas expert des APIs, ça va me prendre un certain temps pour définitivement régler mon problème.
En attendant, une question toute bête, que signifie exactement le dièse (#) qui précède certaines instances ? Ce n'est pas la première fois je vois ça.
VB:
#If VBA7 Then
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Private Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
#Else
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
#End If
Merci d'éclairer ma lanterne.
 

Dudu2

XLDnaute Barbatruc
Le # précèdent des directives pré-processeur qui permettent une compilation conditionnelle.

Ici de manière très classique pour la déclaration des fonctions API, grâce à la constante prédéfinie VBA7, ces directives permettent d'adapter automatiquement leur déclaration selon que l'application est 32 bits ou 64 bits.
 

Dudu2

XLDnaute Barbatruc
N'étant pas expert des APIs, ça va me prendre un certain temps pour définitivement régler mon problème.
Tu n'as pas à te soucier des fonctions APIs.
Dans le code elles sont déclarées dans une module spécifique (Module_PositionCurseur) avec les fonctions VBA qui les "encapsulent" à savoir:
Sub GetCursorPosition(ByRef X As Long, ByRef Y As Long)
Sub SetCursorPosition(ByVal X As Long, ByVal Y As Long)
Sub MouseLeftClick()
Sub MouseRightClick()


Il te suffit d'inclure ce module dans ton code puis depuis ton propre code d'appeler ces fonctions VBA classiquement car ce sont elles qui utilisent l'API et pas toi.
Il y a zéro , zéro zéro zéro difficulté.

En plus il y a le modèle des fonctions du Module_CurseurSurImage qu'il te suffit de suivre.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
D'ailleurs ce n'est pas l'utilisation ultra-simple de ces fonctions qui pose le principal problème.
Le principal problème est de trouver les coordonnées du centre de l'image en pixels, puisque les coordonnées de l'image sont en points par rapport à la feuille Excel hors tout (la feuille est le Parent de l'Image) et les coordonnées du curseur sont en pixels par rapport à l'écran physique.

Donc à priori rien à voir ni en unité de mesure ni en référence de positionnement !

La fonction Sub CurseurSurImage résoud ce problème. Il suffit de copier / coller.
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Le # précèdent des directives pré-processeur qui permettent une compilation conditionnelle.

Ici de manière très classique pour la déclaration des fonctions API, grâce à la constante prédéfinie VBA7, ces directives permettent d'adapter automatiquement leur déclaration selon que l'application est 32 bits ou 64 bits.
C'est donc bien ce dont je me doutais, puisque étant sur Excel 32 bytes :
VB:
#If VBA7 Then
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Private Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
est rouge.
Donc, grâce à cet artifice, un classeur peut être compatible avec les 2 versions d'Excel.
Merci pour l'info.
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, Dudu2,

Voyez le fichier joint et ce code :
VB:
#If VBA7 Then
    Private Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
#Else
    Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
#End If

Sub PleinEcran()
Dim z
Application.DisplayFullScreen = True
Application.DisplayFormulaBar = False
ActiveWindow.DisplayHeadings = False
With ActiveSheet.Shapes(1)
    z = SetCursorPos((.Left + .Width / 2) / 0.75, (12 + .Top + .Height / 2) / 0.75)
End With
End Sub

Sub RAZ()
'se lance par les touches Ctrl+R
Application.DisplayFullScreen = False
Application.DisplayFormulaBar = True
ActiveWindow.DisplayHeadings = True
End Sub
Le coefficient 0.75 est dû au fait que 1 pixel = 0,75 point pour un zoom de 100.

A+
 

Pièces jointes

  • Plein Ecran(1).xlsm
    28.8 KB · Affichages: 8

Dudu2

XLDnaute Barbatruc
Ha oui, @job75, lui, répond à la question
1650302311732.gif
.
Alors je réponds aussi à la question, mais peut-être plus complètement
1650302366021.gif
?

Si l'idée est de garder le curseur sur l'image pour n'avoir qu'à cliquer pour passer d'un mode d'affichage à l'autre, alors il faut dans tous les cas repositionner le curseur car sa position n'est pas relative à la feuille mais à l'écran. Et comme la position de l'image par rapport à l'écran bouge selon le mode d'affichage...
 

Pièces jointes

  • FullScreenSurImage.xlsm
    34.5 KB · Affichages: 8

Magic_Doctor

XLDnaute Barbatruc
Merci job75 & Dudu2,

J'ai essayé chacune des 2 versions. Celle de Dudu2 me paraît parfaite. J'ai essayé de l'adapter à mon classeur et, malheureusement, ça plante. Je dois reconnaître que je n'ai pas tout compris...
Dans mon classeur il y a en fait 2 icônes superposées (pour faire joli) qui appellent la procédure qui déclenche "Vue Normale / Plein Écran".
 

Pièces jointes

  • Curseur_Icônes2.xlsm
    119.2 KB · Affichages: 3

Discussions similaires

Réponses
21
Affichages
1 K

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG