DÉPLACEMENT D'UN OBJET SHAPE DANS FEUILLE EXCEL

James122007 Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 30 mars 2010 - 29 mars 2010 à 14:02
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017 - 2 févr. 2011 à 19:18
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51513-deplacement-d-un-objet-shape-dans-feuille-excel

mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
2 févr. 2011 à 19:18
Salut COYOTE26,

Je pense que j'ai résolu ton pb et je vais déposer sur le site VB France un code qui devrait te convenir. Il s'appellera "Manipulations Formes sur Graphes Excel avec VBA".
Merci de me donner ton avis.

Cdt
cs_coyote26 Messages postés 4 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 22 juillet 2011
30 janv. 2011 à 23:44
Salut MIMIZANZAN,

Je te remercie de ta réponse, même si j'espérais pouvoir l'adapter à mon cas.

En fait je veut positionner un rectangle là ou je clique sur le graphique.

Pour cela, j'utilise les évènements mousedown et je récupere les coordonnées X et Y
Actuellement, je fais une transformation des coordonnée écran en coordonnée de mon chartarea avec des valeurs fixes qui correspondent à mon PC et mon niveau de Zoom dans excel.
Mais j'aimerais que mon code fonctionne sur n'importe quel PC ou n'importe quel niveau de zoom.

Il faudrais pour celà que j'arrive à créer une correspondance entre le X Y de la souris et le TOP,LEFT,WIDTH,HEIGHT de Chartarea
Pour déterminer le 0,0 de ChartArea et le coefficent entre les pixel et les point écran(qui semble être 4/3, quelque soit les PC)

Cordialement,
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
27 janv. 2011 à 17:26
Salut COYOTE26,
En effet, le code est écrit pour des feuilles de calcul Excel.
Pour les feuilles graphiques, j'ai réfléchi, mais je ne vois pas comment t'aider.
Désolé, peut-être que qq aura une idée, mais je ne vois pas l'intérêt de ce que tu veux faire avec les shapes sur une feuille graphique...

Cdt
cs_coyote26 Messages postés 4 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 22 juillet 2011
27 janv. 2011 à 00:28
Salut,

bravo pour ton code, je suis moi même intéressé mais sur un onglet activechart or toutes tes références sont en activesheet.
Car j'ai le même problème de transformation coordonnée fenêtre et coordonné souris, je ne vois pas comment modifier pour l'adapter

J'aimerais en fait commencer à tracer une shape à l'endroit ou j'ai cliqué

Cordialement,
cs_Godzestla Messages postés 9 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 19 mai 2011
15 déc. 2010 à 08:51
Salut MIMIZANZAN,

c'est très clair.
Merci beaucoup pour ta réponse rapide.
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
14 déc. 2010 à 18:03
Salut GODZESTLA,
Merci de t'intéresser à mon code.
Le bouton "Lance action cellule" déclenche le processus qui permet la détection du mouvement du curseur après la sélection d'une cellule: chaque cellule survolée ensuite se colore en rouge.
Ce processus est arrêté si on reclique sur une cellule. Mais si on reclique une autre fois sur une cellule, le processus redémarre: c'est là que le bouton "Stop Action cellule" doit être utilisé pour arrêter le processus...Si on reclique ensuite, rien ne se passe!
J'espère avoir été clair?
Cordialement
cs_Godzestla Messages postés 9 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 19 mai 2011
14 déc. 2010 à 10:31
Salut Mimizanzan
tout simplement génial ton code. Voilà un outil génial pour les shapes.

Peux-tu juste m'expliquer l'usage des bouton "lance action cellule" et "Stop Action cellule" car d'après mes tests ils restent sans effet sur les cellules même.
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
1 avril 2010 à 19:57
Çà y est, j'ai réussi à traiter les cellules avec le mouvement du curseur...
Je vais mettre un nouveau fichier en maj.
Qu'en penses-tu, James?
cs_amydale Messages postés 16 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 4 janvier 2012
1 avril 2010 à 08:00
Great ! :o)
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
31 mars 2010 à 17:25
AMYDALE,
Tu as raison, j'aurais dû prendre en compte le zoom pour la position du curseur au départ. Çà n'avait que peu d'influence pour les zooms pas trop différents de 100 (de 85 à 120).
J'ai résolu enfin le pb du scroll: il faut prendre en compte la 1ère cellule visible à l'écran qui est repérée par les coordonnées
ActiveWindow.ScrollRow et ActiveWindow.ScrollColumn. Tu m'as mis sur le chemin en disant de ne pas se baser sur la cellule A1, merci.
Je vais donc envoyer une maj de mon code tenant compte de ces améliorations, et tout semble maintenant OK.
Merci de vos avis
cs_amydale Messages postés 16 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 4 janvier 2012
31 mars 2010 à 15:19
Salut Mimi,
Juste pour la compréhension, est-ce normal lorsque tu positionns le curseur que tu ne prennes pas en compte le zoom ?
Tu mets :
Xc = (sh.Left + XEcran * PtperPix + WSh) / PtperPix
Yc = (sh.Top + YEcran * PtperPix + HSh) / PtperPix
Je serais tenté de mettre :
Xc = (sh.Left + WSh) * Z / 100 / PtperPix + XEcran
Yc = (sh.Top + HSh) * Z / 100 / PtperPix + YEcran
Si je racontes une grosse connerie, pousse un cri :o)

Concernant le problème du scroll, je pense qu'il faudrait mettre ceci :
Dans la procédure CoordEcran, ne pas se baser sur le range("A1"), mais sur ActiveWindow.VisibleRange.Cells(1) car bizarrement, si A1 n'est pas affiché, les coordonnées sont décalées un peu gauche
Lors du positionnement du curseur, pour supprimer le décalage : ajouter "- ActiveWindow.VisibleRange.Cells(1).Left * Z / 100 / PtperPix" (idem avec le .top)
Et enfin dans le positionnement de la forme par rapport au curseur, pour ajouter le décalage : "+ ActiveWindow.VisibleRange.Cells(1).Left" (pas besoin de gestion du zoom) et idem avec le .top)
Ca semble marcher chez moi
AC045364 Messages postés 4 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 30 mars 2010
30 mars 2010 à 17:37
Au kazou ça vous intéresserait, j'ai créé un rustine qui fait bouger une forme de gauche à droite à gauche en cliquant sur une feuille.
Daniel

PVG: APropos est le nom de code de la feuille
Shapes(1) est le nom de la shape

Sub Rotate()
Dim wHeight As Single
Dim wWidth As Single
Dim insideW As Single
Dim i As Integer
Dim Deg As Integer ' Nombre de mouvements du rectangle rouge de gauche à droite
Dim s As Double
APropos.Activate
insideW = APropos.Shapes(1).Width
Deg = 6
APropos.Shapes(1).Top = 200
APropos.Shapes(1).Left = 10

With APropos.Shapes(1)
For i = 1 To Deg
.IncrementLeft Int((Application.UsableWidth - insideW) / Deg)
s = Timer + 0.02
Do While Timer < s
DoEvents
Loop
Next
For i = 1 To Deg
.IncrementLeft -Int((Application.UsableWidth - insideW) / Deg)
s = Timer + 0.02
Do While Timer < s
DoEvents
Loop
Next
End With
End Sub
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
30 mars 2010 à 16:30
AMYDALE,
Merci pour tes commentaires.
Regardes la mise à jour: le nouveau zip ne contient plus la procédure "MoveFormToCell". J'ai simplifié le code avec uniquement intervention d'un ChartObjet pour déterminer la fenêtre active par rapport à l'écran.
Je te signale que l'usage de cellule top_left ne permet pas d'avoir accès aux coordonnées écran, car il se réfère à la fenêtre Excel.
Par contre, tu as raison, il y a qq pbs si on scrolle. Je vais voir ce que l'on peut faire. On peut en attendant changer le zoom pour déplacer la form.
A ce sujet, je viens de découvrir que le zoom déplace le curseur de la forme pendant le déplacement: je viens de rectifier en tenant compte du zoom de la fenêtre, je vais donc encore ajouter une maj du code.
Pour traiter les cellules, JAMES, je ne suis arrivé malheureusement à aucun résultat. Si qq peut prendre le relais...
cs_amydale Messages postés 16 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 4 janvier 2012
30 mars 2010 à 10:34
Il faut avouer que le principe est vraiment génial.
Mais le fait d'utiliser "MoveFormToCell FrmProv, ActiveSheet.Range("A1")" ne marche pas dans tous les cas, par exemple si on a fait un scroll vers la droite pour masquer la colonne a et qu'on clic sur le bouton, on est complètement décalé.
Je me demande si on ne pourrait pas plutot utiliser un "ActiveWindow.VisibleRange.Cells(1)" pour récupérer la cellule top_left ou quelque chose comme ca, ce qui devrait rendre le cas passe-partout
Il faudrait aussi gérer si le shape n'est pas dans l'écran, ou faire un scroll vers la cellule shape.TopLeftCell avant

En tout cas j'adore l'idée, et je te met un 8 ! :o)

Pour James: bien entendu que c'est possible. Il suffit de mettre un timer, d'utiliser l'API getCursorPos (contenu dans cette source), couplé avec la fonction "RangeFromPoint", tu devrais trouver ton bonheur je pense
James122007 Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 30 mars 2010
30 mars 2010 à 08:56
MimiZanzan,

A ton avis, serait-il possible d'étendre ta procédure à toutes les "Merged Cells" qui certes ne sont pas des objects ... mais qui mériteraient le même traitement génial...
Ce serait formidable dans le cadre de la manipulation des rendez-vous dans une feuille agenda ...
James122007 Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 30 mars 2010
29 mars 2010 à 20:54
MimiZanzan,

Tout simplement GENIAL ...!!!

Milles Mercis
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
29 mars 2010 à 16:57
JAMES122007,
Merci pour ton commentaire.
Je vais réfléchir à ce que tu demandes.
N'importe comment, je projetais de diffuser une mise à jour (déjà!), car j'ai trouvé encore + simple pour arriver au même résultat...
James122007 Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 30 mars 2010
29 mars 2010 à 14:02
Très utile ... et Coincidence incroyable ... car je me suis posé cette question ... hier ...

Que faudrait-il modifier à ton code pour que l'utilisateur puisse librement choisir sa shape ...( avec environ 12 Shapes dans la feuille )

Dores et déjà, un grand Merci pour ton code