Manipulation de Shapes (Flèches)

Hello !

Je me lance dans un projet assez baleze en VBA (pour mon niveau) qui consiste à représenter une déformation d'une pièce sur un plan avec des flèches dans un repaire orthonormé. En entrée j'ai des coordonnées (différence entre la valeur nominale et la valeur mesuré d'un point de la pièce) et en sortie des flèches sur une image.

capture

Pour simplifier prenons l'exemple ci-dessus:

Je rentre des valeurs X et Y et je veux que ma flèche se positionne grace à une macro.

Le cercle bleu représente l'origine de la flèche; l'origine d'une flèche ne changeras jamais et sera connu à l'avance

Je peux contrôler la flèche avec ces commandes:

    ActiveSheet.Shapes.Range(Array("Straight Arrow Connector 3")).Select
    Selection.ShapeRange.Height = 59.5275590551
    Selection.ShapeRange.Width = 116.2204724409
    Selection.ShapeRange.Rotation = -90

Problème:

• Comment connaitre le nom d'une flèche ? je vais en avoir plusieurs sur le programme finale.

• La commande:

 Selection.ShapeRange.Rotation = -90

Fait tourner la flèche sur elle même en son milieu.... donc forcément le début de la flèche ne se trouve plus sur son origine..

•Height and Width ne peux pas contenir des valeurs négatives....

    Selection.ShapeRange.Height = 59.5275590551
    Selection.ShapeRange.Width = 116.2204724409

Existerai-il un moyen tellement plus simple pour juste contrôler la rotation et la longueur de la flèche ? (en gardant le même origine)

Comme ca je n'aurais qu'as faire un pauvre pythagore pour obtenir la longueur totale de la flèche et lui donner un angle calculé avec les règles de trigo de bases...

SI besoin d'infos suplémentaires demandez moi !

Merqui

Gabin,

capture 2
capture 1

EDIT: Quelques photos en plus pour visualiser a quoi ressemblerais le programme finale. (Les flèches ont été faites a la main je voudrais automatiser le process.)

L'image en fond des flèches représenté la pièce mesurée je l'ai supprimé pour des raisons de confidentialitées.

Bonjour,

Le nom, tu l'as ici :

ActiveSheet.Shapes.Range(Array("Straight Arrow Connector 3")).Select

Elle s'appelle Straight Arrow Connector 3.

Mais tu peux les renommer.

Ensuite, petite astuce que j'utilise sur Powerpoint pour réaliser par exemple des horloges animées, c'est que tu dupliques ta flèche. Ta 2ème flèche, tu lui fais une rotation horizontale et tu la places tout contre ta 1ère, pour avoir une flèche à double sens. La 2ème, tu mets sans remplissage et sans contour. Et tu groupes tes 2 flèches. Tu ne vois ainsi pas du tout ce que tu viens de changer, sauf que maintenant la moindre rotation se fait au centre de ta forme.

Edit : Hello Gontrand-Gilles-Balthazar ;)

Bonjour,

Que voulez-vous faire exactement ? Créer une nouvelle image et la paramétrer ?

Dans ce cas, vous pourrez tout maitriser de l'image, grâce à ses propriétés et méthodes que je vous conseille de regarder sur ce lien :

https://docs.microsoft.com/fr-fr/office/vba/api/excel.shape

Avec par exemple des lignes qui pourraient être intéressantes :

With Activesheet.Shapes("nomimage")
 .IncrementLeft 70 'pour déplacer la position gauche de 70
 .IncrementTop -50 'pour déplacer la position haute de -50
 .IncrementRotation 30 'effectue rotation de 30°
End With

Pour connaitre les noms des images (en supposant une feuil2 pour accueillir les valeurs) :

sub nomsimages()

dim sh as shape

for each sh in activesheet.shapes
    i = i + 1
    sheets("Feuil2").range("A" & i + 1) = sh.name
    sheets("Feuil2").range("B" & i + 1) = sh.type
    sheets("Feuil2").range("C" & i + 1) = i
next sh

end sub

Avec les propriétés ci dessus et .width et .height (qui en effet ne peuvent être négatives), vous devriez vous retrouver.

Cdlt,

Salut JoyeuxNoel !

3GB:

Récupérer le nom de toutes mes flèches m'interesse très fortement !! Ton programme ne marche pas, excel me dit Erreur de synthaxe pour " range("A" i + 1)" Il apprécie pas le i+1 Il sufisait de marquer Range("A" & i + 1 ) c'est bon

Le problème de increment c'est que si je rappuie sur le bouton les flèches vont encore se déplacer ? normalement elle n'ont pas a bouger, les seuls paramêtre variable c'est la longueur et la rotation

JoyeuxNoel:

J'ai essayé de faire ton système de superposer les flèches malheuresement la rotation donne toujours n'importe quoi... je pense que j''ai mal compris je vais continuner d'essayer de les manipuler C'est bon j'ai pigé pour la rotation merci

Comment renommer les flèches ? ca m'aiderais tellement de les renommer !

J'ai édité mon code, désolé, j'ai oublié le "&" sur la première ligne et fait un copier coller .

C'était pour te donner une idée mais il serait mieux que tu regardes le lien pour voir toutes les propriétés et méthodes.

Je ne sais pas exactement ce que tu comptes faire même si j'ai compris le principe... Avec ces propriétés et d'autres, on peut plus facilement manier l'image comme on le souhaite avec un peu de trigo.

Et pour renommer, on peut prendre mon code et les renommer en rafale : sh.name = "????"

Sinon, il faut sélectionner l'image et saisir son nouveau nom dans la barre de référence à gauche de la barre de formules.

Cdlt,

Ok la j'ai beauoup de réponses à mes questions.

Merci énormément à vous deux, je vais bosser la dessus je reviens vers vous si j'ai d'autre problèmes (et ca risque d'arriver )

Slt !

Je relance le sujet j'ai une mini question ca m'embete de la poser mais pas trouvé la réponse sur le net >:(

c'est quoi la conversion entre l'unité de shape:

Shapes.Width = 123456

et les cm excel ?

Mes calculs basés sur les mesures donnent une valeur en cm que j'applique à la main sur mes flèches. VBA veut une unité en pixel ou en "point" je sais pas trop si qq connais la formule de conversion un grand merci à lui

Hello, normalement 1 cm = 28.34645669291 pt

Alors les mystère d'excel.... j'ai fait ca:

Sub initialiserfleches()

Dim sh As Shape
Dim Ws As Worksheet
i = 10
For Each Ws In ThisWorkbook.Worksheets
    Ws.Activate
For Each sh In ActiveSheet.Shapes
    If sh.Type = 1 Then
    sh.Rotation = 0
    sh.Height = 28.34645669291 * 3
    sh.Width = 0
    End If
Next sh
Next Ws
End Sub

pour initialiser mes flèches à la position de départ et du coup:

sh.Height = 28.34645669291 * 3

devrais renvoyer 3 cm, sauf que certaines flèches sont a 3.1cm et d'autres sont à 3.08 !

pourquoi ne sont elles pas identiques ! enfin bon, c'est un écart négligeable pour ce que je veux faire mais des fois excel fait vraiment des trucs bizarres

Et en mettant directement 85.04 pts ?

Non, j'ai tjrs environ 50% de mes flèches a 3.1 et 50% de mes flèches a 3.08 trop bizarre ! mais vraiment c'est pas si grave j'ai pas trop besoin d'une telle précision!

Bonjour,

En complément de la réponse de JoyeuxNoel, voici une table des conversions (en page 3) :

https://melusine.eu.org/syracuse/texpng/jcc/aide.pdf

Sinon, peut-être que c'est dû à un nombre de décimales trop important ? En essayant ainsi, ça pourrait uniformiser les résultats :

sh.Height = round(28.34645669291 * 3, 2) 'arrondi à 2 décimales

Cdlt,

Salut 3GB, t'as proposition ne marche pas.

Mais j'ai peut être une explication: j'ai fixé le sh.width à 10 pour tester et surprise... les flèches ne s'orientes pas toutes de la même facon, pourtant la rotation est bien à 0

et évidemment, le changement est lié aux différences que j'ai sur la hauteur !

capture 3

Sur la photo:

TOUTES les flèches ont bien Largeur = 0.35cm

Mais les flèches orientées vers la droite ont longueur = 2.99

Les flèches orientées vers la gauche ont longueur = 3.01

Pour le moment la seul solution c'ets de supprimés et recréer les flèches qui posent problème (ca va etre très long j'ai environ 300 flèches )

D'accord, ça expliquerait le problème.

Avant de supprimer, tu ferais mieux de faire des essais de création de flèches, à l'enregistreur de macro, pour voir les paramètres, notamment pour voir si il y a une angle à définir. Ca permettrait de maitriser par la suite la création en définissant, dès le départ, la position, la direction, la longueur en fonction des données que tu aurais quelque part.

Mais c'est bizarre car la rotation est 0 et n'est pas reconnue... Parfois, l'ordre des instructions a une incidence alors j'aurais fait des ultimes essais au sein de la boucle :

sh.Rotation = 0
sh.Width = 0
sh.Height = 28.34645669291 * 3

'puis
sh.Width = 0
sh.Rotation = 0
sh.Height = 28.34645669291 * 3

'puis
sh.Width = 0
sh.Height = 28.34645669291 * 3
sh.Rotation = 0

Mais j'ai peu d'espoir...

J'ai créé plusieurs flèches différentes mais les seuls infos dont excel a besoin pour créer sa feuille c'est les coordonnées X et Y du début et X et Y de la fin de la flèche, pas de ligne VBA qui évoquent la rotation ou d'autres paramètres caché donc rien qui explique pourquoi certaines flèches se comporte différement entre elles.

D'accord, mais on impose finalement l'angle grâce aux coordonnées X et Y car si X début = X fin, la flèche est verticale et si Y début = Y fin, la flèche est horizontale.

Et j'imagine que c'est ensuite à partir de cette position de départ que la rotation agit...

Edit : grâce à ça, on peut positionner les flèches exactement comme on le souhaite par rapport à la feuille et aux propriétés .top et .left des cellules !

Rechercher des sujets similaires à "manipulation shapes fleches"