OVH Cloud OVH Cloud

Souris suiveuse

41 réponses
Avatar
milloche
Bonne fête les amoureux
J'utilise pour recopier sur Excel, au clavier, des données non copiables d'un
autre programme (Adobe par exemple) une méthode que je dirais géniale (;o))))
Par macro, je réduis ma fenêtre au 1/4 de l'écran et la place là ou elle ne gêne
pas : en haut à droite bien souvent. Mais parfois, c'est là que sont les
données.
Avec une variable physique (une case), j'ai donc prévu à chaque nouveau clic de
déplacer cette fenêtre et de lui faire faire le tour de l'écran en 4 clics.
Comment faire pour que le pointeur suive l'écran (et donc le bouton dessin) car
pour l'instant, il se retrouve à chaque clic dans le vide.
C'est du cours après moi que j't'attrappe.
J'ai tenté Application.mouse.top=x, Application.pointer.top=x ......
Il me manque le juste mot et l'aide n'aide pas, vu que je ne connais pas le mot.
Cordialement.

10 réponses

1 2 3 4 5
Avatar
milloche
Mais tu verras, encore plus marrant quand ça fonctionne !
<]:o))

"MichDenis" a écrit dans le message de news:

C'est marrant ton truc !
;-))



"milloche" a écrit dans le message de
groupe de discussion :
Voila, mais il ne fonctionne déjà plus !
http://www.cijoint.fr/cjlink.php?file=cj200905/cijpt79Qk5.xls
Amuse toi bien
JMM




"milloche" a écrit dans le message de news:
eZ$
Ecoute
Tu n'as pas l'air d'être bousculé aujourd'hui.
Laisse moi le temps de te préparer un petit cadeau.
Tu risque d'être surpris.
@+

"MichDenis" a écrit dans le message de news:

| Excel quand il n'a plus aucune barre à laquelle se référer
| décrèterait alors de mettre le pointeur dans la
| barre de titre

La procédure que je t'ai proposée devrait fonctionner peu importe
les objets (barre de menus, formulabar , Scrollbar...) masqués dans
la fenêtre excel.

| alors de mettre le pointeur dans la barre de titre, la seule
| existant encore et non cachable

Si tu désires masquer la barre de titre d'excel :

'Déclaration dans le haut du module standard des API requis
'--------------------------------------------------
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias
"GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias
"SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long
Const GWL_STYLE = (-16)
Public Const WS_CAPTION = &HC00000


'Cache la barre de titre de l'application Excel
'--------------------------------------------------
Sub CachéLaBarreDeTitreExcel()
Dim hWnd As Long, Style As Long
Nom = ActiveWindow.Application.Parent.Caption
hWnd = FindWindow(vbNullString, Nom)
Style = GetWindowLong(hWnd, GWL_STYLE) And Not WS_CAPTION
SetWindowLong hWnd, GWL_STYLE, Style
End Sub
'--------------------------------------------------

'Affiche la barre de titre de l'application Excel
'--------------------------------------------------
Sub AfficherLaBarreDeTitreExcel()
Dim hWnd As Long, Style As Long
Nom = ActiveWindow.Application.Parent.Caption
hWnd = FindWindow(vbNullString, Nom)
Style = GetWindowLong(hWnd, GWL_STYLE) Or WS_CAPTION
SetWindowLong hWnd, GWL_STYLE, Style
End Sub
'--------------------------------------------------




"milloche" a écrit dans le message de
groupe de discussion :
Il faut dire que dans mon vrai fichier, assez compliqué, quand je
réduis
la
fenêtre à 1/4 d'écran, je ne garde plus aucun accessoire et toute la
surface est réservée aux données
Plus de heading, scrollbar,formula bar, statusbar, menubar etc. Rien
que
les données et même certaines colonnes sont masquées. Reste seulement
la
barre de titre très difficile à enlever. J'avais d'ailleurs demandé là
dessus il y a x mois. Mais reculé devant l'usine à gaz que c'était.
Tu me parlais très justement de ce formatage à ne pas faire avant que
la
macro fonctionne. Mais c'est justement le but de cette macro ! Juste
mettre
en page.
La différence provient sans doute de ça. Excel quand il n'a plus aucune
barre à laquelle se référer décrèterait alors de mettre le pointeur
dans
la
barre de titre, la seule existant encore et non cachable. C'est au
moins
mon explication de candide.
Merci de ton aide car sans elle, j'y serais encore et pour un bout de
temps.
JMM

"MichDenis" a écrit dans le message de news:

| j'ai juste rajouté un petit 60 à X et Y
| Ne me demande pas pourquoi, mais la souris vient
| pile poil se caler là ou je la voulais.

Tant mieux si tu as trouvé quelque chose à la hauteur de tes attentes.

J'ai testé ta procédure sous Excel 2003 et Excel 2007, et à chaque
fois
je me retrouve en A5 et ce, dans une feuille vierge sans avoir
redimensionné quoi que ce soit.

OK, on ne va pas comparer les 2 approches ;-)


'Dans le haut du module, déclaration de l'API
Private Declare Function SetCursorPos Lib "user32" _
(ByVal x As Long, ByVal y As Long) As Long

'--------------------------------------------
Sub Positionnement()
Dim x As Double, y As Double
With ActiveSheet
With .Range("K25")
x = Application.ActiveWindow.PointsToScreenPixelsX((.Left +
(.Width / 2)) * 4 / 3)
y = Application.ActiveWindow.PointsToScreenPixelsY((.Top +
(.Height / 2)) * 4 / 3)
SetCursorPos x, y
End With
End With
End Sub
'--------------------------------------------










Avatar
milloche
Si tu n'as pas compris le pourquoi de la chose (et ça m'étonnerait) c'est
que je peux dans cette petite fenêtre, recopier facilement les cours se
trouvant dans une autre application qui se trouve derrière excel. Ces
données n'étant pas toujours au même endroit sur l'écran, j'ai inventé ce
truc qui me permet de les lire ou qu'elles soient.
Tu aurais du dire ingénieux mais pas marrant.
<]:o)

"milloche" a écrit dans le message de news:

Mais tu verras, encore plus marrant quand ça fonctionne !
<]:o))

"MichDenis" a écrit dans le message de news:

C'est marrant ton truc !
;-))



"milloche" a écrit dans le message de
groupe de discussion :
Voila, mais il ne fonctionne déjà plus !
http://www.cijoint.fr/cjlink.php?file=cj200905/cijpt79Qk5.xls
Amuse toi bien
JMM




"milloche" a écrit dans le message de
news:
eZ$
Ecoute
Tu n'as pas l'air d'être bousculé aujourd'hui.
Laisse moi le temps de te préparer un petit cadeau.
Tu risque d'être surpris.
@+

"MichDenis" a écrit dans le message de news:

| Excel quand il n'a plus aucune barre à laquelle se référer
| décrèterait alors de mettre le pointeur dans la
| barre de titre

La procédure que je t'ai proposée devrait fonctionner peu importe
les objets (barre de menus, formulabar , Scrollbar...) masqués dans
la fenêtre excel.

| alors de mettre le pointeur dans la barre de titre, la seule
| existant encore et non cachable

Si tu désires masquer la barre de titre d'excel :

'Déclaration dans le haut du module standard des API requis
'--------------------------------------------------
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias
"GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias
"SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long
Const GWL_STYLE = (-16)
Public Const WS_CAPTION = &HC00000


'Cache la barre de titre de l'application Excel
'--------------------------------------------------
Sub CachéLaBarreDeTitreExcel()
Dim hWnd As Long, Style As Long
Nom = ActiveWindow.Application.Parent.Caption
hWnd = FindWindow(vbNullString, Nom)
Style = GetWindowLong(hWnd, GWL_STYLE) And Not WS_CAPTION
SetWindowLong hWnd, GWL_STYLE, Style
End Sub
'--------------------------------------------------

'Affiche la barre de titre de l'application Excel
'--------------------------------------------------
Sub AfficherLaBarreDeTitreExcel()
Dim hWnd As Long, Style As Long
Nom = ActiveWindow.Application.Parent.Caption
hWnd = FindWindow(vbNullString, Nom)
Style = GetWindowLong(hWnd, GWL_STYLE) Or WS_CAPTION
SetWindowLong hWnd, GWL_STYLE, Style
End Sub
'--------------------------------------------------




"milloche" a écrit dans le message de
groupe de discussion :
Il faut dire que dans mon vrai fichier, assez compliqué, quand je
réduis
la
fenêtre à 1/4 d'écran, je ne garde plus aucun accessoire et toute la
surface est réservée aux données
Plus de heading, scrollbar,formula bar, statusbar, menubar etc. Rien
que
les données et même certaines colonnes sont masquées. Reste seulement
la
barre de titre très difficile à enlever. J'avais d'ailleurs demandé là
dessus il y a x mois. Mais reculé devant l'usine à gaz que c'était.
Tu me parlais très justement de ce formatage à ne pas faire avant que
la
macro fonctionne. Mais c'est justement le but de cette macro ! Juste
mettre
en page.
La différence provient sans doute de ça. Excel quand il n'a plus
aucune
barre à laquelle se référer décrèterait alors de mettre le pointeur
dans
la
barre de titre, la seule existant encore et non cachable. C'est au
moins
mon explication de candide.
Merci de ton aide car sans elle, j'y serais encore et pour un bout de
temps.
JMM

"MichDenis" a écrit dans le message de news:

| j'ai juste rajouté un petit 60 à X et Y
| Ne me demande pas pourquoi, mais la souris vient
| pile poil se caler là ou je la voulais.

Tant mieux si tu as trouvé quelque chose à la hauteur de tes
attentes.

J'ai testé ta procédure sous Excel 2003 et Excel 2007, et à chaque
fois
je me retrouve en A5 et ce, dans une feuille vierge sans avoir
redimensionné quoi que ce soit.

OK, on ne va pas comparer les 2 approches ;-)


'Dans le haut du module, déclaration de l'API
Private Declare Function SetCursorPos Lib "user32" _
(ByVal x As Long, ByVal y As Long) As Long

'--------------------------------------------
Sub Positionnement()
Dim x As Double, y As Double
With ActiveSheet
With .Range("K25")
x = Application.ActiveWindow.PointsToScreenPixelsX((.Left +
(.Width / 2)) * 4 / 3)
y = Application.ActiveWindow.PointsToScreenPixelsY((.Top +
(.Height / 2)) * 4 / 3)
SetCursorPos x, y
End With
End With
End Sub
'--------------------------------------------














Avatar
MichDenis
| Si tu n'as pas compris le pourquoi de la chose

Je ne me pose pas ce type de question lorsque je réponds
à une demande d'un intervenant sur ce forum. Je me contente
de l'aider à réaliser ce qu'il désire accomplir.
Le reste cela regarde que le demandeur!

Désolé, si tu n'as pas eu le commentaire attendu.
;-)
Avatar
milloche
Tu as l'air fâché ?
Pourquoi as tu tronqué ma phrase, toute phrase s'arrête au premier point
rencontré.
Je disais donc :

"Si tu n'as pas compris le pourquoi de la chose (et ça m'étonnerait) c'est
que je peux dans cette petite fenêtre, recopier facilement les cours se
trouvant dans une autre application qui se trouve derrière excel."

Ce qui veut dire simplement dans quel but j'ai créé cette macro.
Et ce n'est pas un commentaire bon ou mauvais, mais une explication simple.
Je ne vois pas ou est le mal ou la mauvaise réaction là-dedans.

"MichDenis" a écrit dans le message de news:

| Si tu n'as pas compris le pourquoi de la chose

Je ne me pose pas ce type de question lorsque je réponds
à une demande d'un intervenant sur ce forum. Je me contente
de l'aider à réaliser ce qu'il désire accomplir.
Le reste cela regarde que le demandeur!

Désolé, si tu n'as pas eu le commentaire attendu.
;-)




Avatar
milloche
Et j'appelle le bouton multiple "la bombe" parce que ça y ressemble.
Pas parceque je suis terroriste.
Je vais l'appeler désormais "le petit dirigeable"
Merci pour l'explication pixels et points.
Ca, fallait le savoir.
JMM

"MichDenis" a écrit dans le message de news:

J'aurais peut-être dû donner quelques informations sur ces lignes de code
:

With range ("K25")
x = Application.ActiveWindow.PointsToScreenPixelsX((.Left + (.Width /
2)) * 4 / 3)

"Left" et "Width" représentent 2 propriétés de l'objet "Range" utilisant
le "POINT"
comme unité de mesure.

Left = distance entre le côté gauche de la cellule et le bord gauche de
l'application
Width = Largeur de l'objet "Range". Cette largeur est divisée en 2 pour
obtenir le
milieu de la cellule dans le sens de la largeur

PointsToScreenPixelsX : Représente une méthode permettant de transposer
une
mesure horizontale de points en
pixels d'écran

Correspondance entre le point et le pixel :
1 point = 3/4 de pixel OU 1 pixel = 4/3 de points

y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height / 2))
transpose la somme des valeurs des 2 propriétés en point
On doit multiplier par 4/3 pour transformer cette valeur en Pixel,
car la fonction "SetCursorPos x, y" émanant de l'API requiert des unités
en Pixel.

C'est le même principe pour cette ligne de code :
y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height /
2)) * 4 / 3)

La procédure doit être appelée à partir de l'interface de calcul.





Avatar
milloche
Si tu n'est plus fâché,
Grâce à tes explications, je pense avoir trouvé la source du problème, mais
pas la solution.
Je dois rajouter 20 à X dans ta formule, et je pense que cela doit provenir
du fait que la heading verticale est cachée. Pas grave. Cette valeur étant
constante.
Mais je dois rajouter un nombre à Y, et pas toujours le même pour rejoindre
le dirigeable, ou appollo13 si tu veux.
En sachant que ce fichier travaille toujours en mode filtre, je pense que
excel doit confondre le Y du bas (top+rowheight) de la ligne 2 (ou est le
freezepanes) avec le Y du haut (top) de la première ligne visible à
l'écran. Elles se superposent, je crois.
Ce serait pour ça qu'il m'envoie la souris dans les choux (en Y mais pas en
X).
Je dois rajouter actuellement 4220 à ta formule Y pour rejoindre appollo13
et la première ligne visible est la 278.
Si cela t'ennuie, dis moi et laisse tomber.
Je suis un peu trop perfectionniste.
JMM

"milloche" a écrit dans le message de news:
eBDN$
Et j'appelle le bouton multiple "la bombe" parce que ça y ressemble.
Pas parceque je suis terroriste.
Je vais l'appeler désormais "le petit dirigeable"
Merci pour l'explication pixels et points.
Ca, fallait le savoir.
JMM

"MichDenis" a écrit dans le message de news:

J'aurais peut-être dû donner quelques informations sur ces lignes de
code :

With range ("K25")
x = Application.ActiveWindow.PointsToScreenPixelsX((.Left + (.Width /
2)) * 4 / 3)

"Left" et "Width" représentent 2 propriétés de l'objet "Range" utilisant
le "POINT"
comme unité de mesure.

Left = distance entre le côté gauche de la cellule et le bord gauche de
l'application
Width = Largeur de l'objet "Range". Cette largeur est divisée en 2 pour
obtenir le
milieu de la cellule dans le sens de la largeur

PointsToScreenPixelsX : Représente une méthode permettant de transposer
une
mesure horizontale de points en
pixels d'écran

Correspondance entre le point et le pixel :
1 point = 3/4 de pixel OU 1 pixel = 4/3 de points

y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height /
2))
transpose la somme des valeurs des 2 propriétés en point
On doit multiplier par 4/3 pour transformer cette valeur en Pixel,
car la fonction "SetCursorPos x, y" émanant de l'API requiert des unités
en Pixel.

C'est le même principe pour cette ligne de code :
y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height /
2)) * 4 / 3)

La procédure doit être appelée à partir de l'interface de calcul.









Avatar
milloche
Encore une idée qui me vient.
Et la résolution de l'écran ?
Sans doute quelque chose à voir dans la traduction des points en pixels.
Je suis en 800*600 sur un écran 17 pouces
La norme actuelle est bien supérieure.
Mais je suis bigleux et je ne supporte pas les lunettes, alors bien obligé.
JMM

"milloche" a écrit dans le message de news:

Si tu n'est plus fâché,
Grâce à tes explications, je pense avoir trouvé la source du problème,
mais pas la solution.
Je dois rajouter 20 à X dans ta formule, et je pense que cela doit
provenir du fait que la heading verticale est cachée. Pas grave. Cette
valeur étant constante.
Mais je dois rajouter un nombre à Y, et pas toujours le même pour
rejoindre le dirigeable, ou appollo13 si tu veux.
En sachant que ce fichier travaille toujours en mode filtre, je pense que
excel doit confondre le Y du bas (top+rowheight) de la ligne 2 (ou est le
freezepanes) avec le Y du haut (top) de la première ligne visible à
l'écran. Elles se superposent, je crois.
Ce serait pour ça qu'il m'envoie la souris dans les choux (en Y mais pas
en X).
Je dois rajouter actuellement 4220 à ta formule Y pour rejoindre
appollo13 et la première ligne visible est la 278.
Si cela t'ennuie, dis moi et laisse tomber.
Je suis un peu trop perfectionniste.
JMM

"milloche" a écrit dans le message de news:
eBDN$
Et j'appelle le bouton multiple "la bombe" parce que ça y ressemble.
Pas parceque je suis terroriste.
Je vais l'appeler désormais "le petit dirigeable"
Merci pour l'explication pixels et points.
Ca, fallait le savoir.
JMM

"MichDenis" a écrit dans le message de news:

J'aurais peut-être dû donner quelques informations sur ces lignes de
code :

With range ("K25")
x = Application.ActiveWindow.PointsToScreenPixelsX((.Left + (.Width
/ 2)) * 4 / 3)

"Left" et "Width" représentent 2 propriétés de l'objet "Range"
utilisant le "POINT"
comme unité de mesure.

Left = distance entre le côté gauche de la cellule et le bord gauche de
l'application
Width = Largeur de l'objet "Range". Cette largeur est divisée en 2 pour
obtenir le
milieu de la cellule dans le sens de la largeur

PointsToScreenPixelsX : Représente une méthode permettant de transposer
une
mesure horizontale de points en
pixels d'écran

Correspondance entre le point et le pixel :
1 point = 3/4 de pixel OU 1 pixel = 4/3 de points

y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height /
2))
transpose la somme des valeurs des 2 propriétés en point
On doit multiplier par 4/3 pour transformer cette valeur en Pixel,
car la fonction "SetCursorPos x, y" émanant de l'API requiert des
unités en Pixel.

C'est le même principe pour cette ligne de code :
y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height /
2)) * 4 / 3)

La procédure doit être appelée à partir de l'interface de calcul.













Avatar
milloche
Bien compris la leçon.
Il faut pourtant admettre que excel permet de modifier la hauteur de ligne
en points, la largeur de colonne en nombre de caractères, et que tout cela
est recalculé en pixels.
Pour l'aide d'excel, ta remarque est bien gentille, mais quand tu ne
connais pas le nom de la commande ou de la propriété recherchée, comment
peux tu la trouver ?
Merci en tous cas.

"MichDenis" a écrit dans le message de news:

Complément d'information sur la methode "PointsToScreenPixelsX" que je
n'ai pas eu le temps de terminer hier !

Définition donnée par l'aide d'Excel :
'------------------------------------------------
Méthode : PointsToScreenPixelsX

Cette méthode convertit une mesure horizontale de points (coordonnées du
document) en pixels d'écran (coordonnées de l'écran). Elle renvoie la
mesure convertie sous la forme d'une valeur de type Long.

Méthode : PointsToScreenPixelsY

Cette méthode convertit une mesure verticale de points (coordonnées du
document) en pixels d'écran (coordonnées de l'écran). Renvoie la mesure
convertie sous la forme d'une valeur de type Long.
'------------------------------------------------

Dans les 2 cas, la définition donnée manque de précision

A )
Dans le cas de "PointsToScreenPixelsX", cette méthode retourne le nombre
de pixels-écran de la distance à partir du côté gauche de la fenêtre de
la feuille de calcul juste qu'au côté gauche de la première colonne
visible dans la feuille de calcul + la valeur spécifiée de la position de
l'objet RANGE OU SHAPE en utilisant comme mesure d'unité : le pixel) . En
d'autres mots, la valeur retournée contient toujours l'en-tête de ligne
(numéro de ligne) si elle est présente dans la feuille + la largeur des
barres d'outils si certaines sont placées à gauche de la feuille de
calcul.
Dans la définition d'Excel, il est écrit ceci : "mesure horizontale de
points", "POINTS" ne fait pas référence a l'unité de mesure
le "point" que retourne la propriété Height ,Width , Top et Left de
l'objet. En effet, on doit transformer ces valeurs en pixel avant
d'appliquer la méthode PointsToScreenPixelsX. Pour ce faire, il y a les
équivalences suivantes:

1 point = 3/4 de pixel OU 1 pixel = 4/3 de points

Le même principe s'applique à la méthode PointsToScreenPixelsY mais cette
fois dans le sens de la hauteur de la fenêtre et des objets de la feuille
de calcul.

Pour vous en convaincre, vous pouvez exécuter cette procédure à partir de
l'interface de la feuille de calcul.
'-----------------------------------------
Sub test()
With ActiveWindow
MsgBox .PointsToScreenPixelsX(0) & " " _
& .PointsToScreenPixelsY(0)
End With
End Sub
'-----------------------------------------
Le résultat retourné représente le point de de par (propriété left - top)
exprime en pixel de la première cellule visible à l'écran sur la feuille
de calcul à partir du coin supérieur gauche de la fenêtre.


La fonction SetCursorPos() définit la position, en coordonnées d'écran,
du pointeur de la souris.

Voici la syntaxe de la fonction
SetCursorPos(x,y)

Ici x et y sont des entiers; x représente la position horizontale et y
est la position verticale.




Avatar
milloche
Allo Huston, j'ai un problème.
Je n'arrive même pas à faire fonctionner les exemples dans un fichier
vierge !
Alors, j'abandonne la lune et le mont Framahoro et j'essaie de rentrer sur
terre.
<[:o((
Bon dimanche.
Merci de ta patience.


"MichDenis" a écrit dans le message de news:

Voici quelques exemples lorsque tu as figé les volets.

Exemple si tu figes les volets en D26

Tu obtiendras 4 quadrilatères que l'on nomme "Pane" dans le modèle objet
d'Excel.
Tu dois utiliser la même méthode "PointsToScreenPixelsX" et
"PointsToScreenPixelsY"
mais en utilisant un objet "Pane" au lieu de "Window" comme dans mon
premier
exemple du message précédent.

A ) Si tu veux placer le curseur à l'intersection des 4 quadrants
'----------------------------------------
Sub Test()

Dim P As Pane
Dim G As Long, H As Long

With ActiveSheet
Set P = Application.ActiveWindow.Panes(4)
End With
With P
G = P.PointsToScreenPixelsX(.VisibleRange.Left)
H = P.PointsToScreenPixelsY(.VisibleRange.Top)
End With
SetCursorPos G, H

End Sub
'----------------------------------------


B ) Si tu veux placer le curseur dans le milieu de première cellule
du quadrant 4. La place du curseur à l'exemple "A" devient l'origine
le point de référence. La première cellule de ce quadrant 4
est A1 de la propriété "VisibleRange" de l'objet "Pane" même si
en fait son adresse réelle est D26
'----------------------------------------
Sub test2()

Dim X As Double, y As Double
Dim P As Pane
Dim G As Long, H As Long

With ActiveSheet
Set P = Application.ActiveWindow.Panes(4)
End With
With P
G = P.PointsToScreenPixelsX(.VisibleRange.Left + _
((.VisibleRange.Cells(1, 1).Width / 2)))
H = P.PointsToScreenPixelsY(.VisibleRange.Top + _
((.VisibleRange.Cells(1, 1).Height / 2)))
End With
SetCursorPos G, H
End Sub
'----------------------------------------

C ) Un dernier exemple : Toujours en partant du point de
référence 0, 0 de l'intersection des quadrants, tu veux
te situer au milieu de la cellule cells(2,3) par rapport à 0,0
autrement dit au milieu de la cellule C2 par rapporte à 0.0

Voici une façon de faire :

'--------------------------------------------------
Sub Test4()

Dim X As Double, y As Double
Dim P As Pane
Dim G As Long, H As Long

With ActiveSheet
Set P = Application.ActiveWindow.Panes(4)
End With
With P
G = P.PointsToScreenPixelsX(.VisibleRange.Left + _
((.VisibleRange.Range("A1:B2").Width)) + _
(.VisibleRange.Range("C2").Width / 2))
H = P.PointsToScreenPixelsY(.VisibleRange.Top + _
((.VisibleRange.Range("A1:b2").Height)) + _
(.VisibleRange.Range("C2").Height / 2))
End With
SetCursorPos G, H
End Sub
'--------------------------------------------------

C'est exactement ce que dit l'aide d'Excel sur le sujet.

Ceci étant, il y a probablement d'autres façons de procéder ...
J'attends que tu m'en propose au moins une autre !

Amuse-toi bien !

P.S. Si tu veux appeler ton bidule "Appolo 13", j'espère qu'il
connaîtra moins de problèmes que l'odyssée du vrai.





"milloche" a écrit dans le message de
groupe de discussion :
Encore une idée qui me vient.
Et la résolution de l'écran ?
Sans doute quelque chose à voir dans la traduction des points en pixels.
Je suis en 800*600 sur un écran 17 pouces
La norme actuelle est bien supérieure.
Mais je suis bigleux et je ne supporte pas les lunettes, alors bien
obligé.
JMM

"milloche" a écrit dans le message de news:

Si tu n'est plus fâché,
Grâce à tes explications, je pense avoir trouvé la source du problème,
mais pas la solution.
Je dois rajouter 20 à X dans ta formule, et je pense que cela doit
provenir du fait que la heading verticale est cachée. Pas grave. Cette
valeur étant constante.
Mais je dois rajouter un nombre à Y, et pas toujours le même pour
rejoindre le dirigeable, ou appollo13 si tu veux.
En sachant que ce fichier travaille toujours en mode filtre, je pense
que
excel doit confondre le Y du bas (top+rowheight) de la ligne 2 (ou est
le
freezepanes) avec le Y du haut (top) de la première ligne visible à
l'écran. Elles se superposent, je crois.
Ce serait pour ça qu'il m'envoie la souris dans les choux (en Y mais pas
en X).
Je dois rajouter actuellement 4220 à ta formule Y pour rejoindre
appollo13 et la première ligne visible est la 278.
Si cela t'ennuie, dis moi et laisse tomber.
Je suis un peu trop perfectionniste.
JMM

"milloche" a écrit dans le message de
news:
eBDN$
Et j'appelle le bouton multiple "la bombe" parce que ça y ressemble.
Pas parceque je suis terroriste.
Je vais l'appeler désormais "le petit dirigeable"
Merci pour l'explication pixels et points.
Ca, fallait le savoir.
JMM

"MichDenis" a écrit dans le message de news:

J'aurais peut-être dû donner quelques informations sur ces lignes de
code :

With range ("K25")
x = Application.ActiveWindow.PointsToScreenPixelsX((.Left + (.Width
/ 2)) * 4 / 3)

"Left" et "Width" représentent 2 propriétés de l'objet "Range"
utilisant le "POINT"
comme unité de mesure.

Left = distance entre le côté gauche de la cellule et le bord gauche
de
l'application
Width = Largeur de l'objet "Range". Cette largeur est divisée en 2
pour
obtenir le
milieu de la cellule dans le sens de la largeur

PointsToScreenPixelsX : Représente une méthode permettant de
transposer
une
mesure horizontale de points en
pixels d'écran

Correspondance entre le point et le pixel :
1 point = 3/4 de pixel OU 1 pixel = 4/3 de points

y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height /
2))
transpose la somme des valeurs des 2 propriétés en point
On doit multiplier par 4/3 pour transformer cette valeur en Pixel,
car la fonction "SetCursorPos x, y" émanant de l'API requiert des
unités en Pixel.

C'est le même principe pour cette ligne de code :
y = Application.ActiveWindow.PointsToScreenPixelsY((.Top + (.Height /
2)) * 4 / 3)

La procédure doit être appelée à partir de l'interface de calcul.















Avatar
MichDenis
Voici un fichier exemple http://cjoint.com/?ffkpxvogJL

IL a été élaboré sous Excel 2007. Sous cette version tout fonctionne parfaitement.

Le hic, c'est que je n'ai plus l'aide d'Excel 2003 d'installer et en testant le fichier,
je me suis rendu compte que la propriété : "PointsToScreenPixelsX" et
"PointsToScreenPixelsX" n'est pas défini pour l'objet "Pane" comme ce l'est
pour Excel 2007. L'exécution du code génère une erreur. La collection "Panes"
représente les quadrants lorsque les volets sont figés.

Voilà pourquoi tu n'as pas pu faire fonctionner les exemples de code soumis.
Il y a peut-être quelqu'un sur ce forum qui peut adapter les procédures pour Excel 2003
et versions précédentes.

Toutefois, cela n'empêche pas l'utilisation des exemples dans une feuille où il n'y a pas
de volets figés.
1 2 3 4 5