Création d'une fléche entre deux boutons [Résolu]

Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
- - Dernière réponse : cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
- 22 juin 2007 à 00:12
Bonjour,
voilà dans le cadre de développement d'un projet VBA j'aimerais savoir s'il est possible de créer une fléche entre deux boutons sur une feuille excel :
en fait jaimerais développer une macro qui me dessine une flêche lorsque je "clique" sur le premier bouton (début de la fléche)  et ensuite sur le deuxieme (fin de la flêche).
Voîlà j'aimerais savoir si cela vous semble possible et si vous avez des pistes n'hesiter pas

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
45
3
Merci
Salut,
Je ne sais pas is cela peut t'aider mais la collection Shapes de l'objet ActiveSheet possède une fonction AddLine

Shapes.AddLine(BeginX as Single, BeginY As Single, EndX As Single, EndY As Single) As Shape.

Essaie de t'en servir (pour quoi deux boutons????)

@+: Ju£i?n
Pensez: Réponse acceptée

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jrivet
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
1
3
Merci
Salut,

il me semble en effet que les fleches, faut les dessiner soit meme.

JRivet,
Je pense que c'est pour indiquer une procedure a suivre par l'utilisateur, je voulais faire la meme chose mais la flemme de dessiner des fleches "a la main" (si je puis dire).

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Nicko11
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
3
Merci
Comme boutons, tu peux utiliser des CommandButtons de la barre d'outils VB ou encore de simples rectangles de la barre d'outils Dessins ou encore utiliser la barre d'outils Formulaires...

Voici 2 méthodes de relier 2 boutons (VB et Rectangles) avec une flèche
Commence donc par placer 2 contrôles de chaque types et assures-toi que les noms concordent avec ceux des macros. Ensuite places le curseur dans une des macros et tape F5

Il faudra éventuellement que tu définisses lequel est à gauche ou à droite pour que les flèches s'alignent sur les bons côtés... Dans mes exemples, le bouton 1 est à gauche du 2

Sub Ligne1() 'avec CommandButton VB
    Dim DépartX As Double, DépartY As Double
    Dim ArrivéeX As Double, ArrivéeY As Double

    DépartX = Sheets("Feuil1"). CommandButton1 .Left _
            + Sheets("Feuil1").CommandButton1.Width
    DépartY = Sheets("Feuil1").CommandButton1.Top _
            + (Sheets("Feuil1").CommandButton1.Height / 2)
    ArrivéeX = Sheets("Feuil1").CommandButton2.Left
    ArrivéeY = Sheets("Feuil1").CommandButton2.Top _
            + (Sheets("Feuil1").CommandButton2.Height / 2)
   
    ActiveSheet.Shapes.AddLine(DépartX, DépartY, ArrivéeX, ArrivéeY).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
End Sub

Sub Ligne2() 'avec des rectangles de la barre de dessin
    Dim DépartX As Double, DépartY As Double
    Dim ArrivéeX As Double, ArrivéeY As Double

    DépartX = Sheets("Feuil1"). Shapes("Rectangle 1") .Left _
            + Sheets("Feuil1").Shapes("Rectangle 1").Width
    DépartY = Sheets("Feuil1").Shapes("Rectangle 1").Top _
            + (Sheets("Feuil1").Shapes("Rectangle 1").Height / 2)
    ArrivéeX = Sheets("Feuil1").Shapes("Rectangle 2").Left
    ArrivéeY = Sheets("Feuil1").Shapes("Rectangle 2").Top _
            + (Sheets("Feuil1").Shapes("Rectangle 2").Height / 2)
   
    ActiveSheet.Shapes.AddLine(DépartX, DépartY, ArrivéeX, ArrivéeY).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
End Sub

MPi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
3
Merci
Voici une petite ébauche qui n'est certes pas optimisée mais qui devrait fonctionner comme tu le souhaites ... Et j'ai ajouté à la fin une procédure pour effacer les flèches.

Place 4 boutons de commandes VB avec leurs noms par défaut et copie le code dans le module de la feuille où sont les boutons

Option Explicit

    Dim DépartX As Double, DépartY As Double
    Dim ArrivéeX As Double, ArrivéeY As Double
    Dim Départ As Boolean, Arrivée As Boolean
   
Private Sub CommandButton1_Click()
    If Départ Then
        DéfinirCoordonnées CommandButton1
        TracerLigne
    Else
        DéfinirCoordonnées CommandButton1
    End If
   
End Sub

Private Sub CommandButton2_Click()
    If Départ Then
        DéfinirCoordonnées CommandButton2
        TracerLigne
    Else
        DéfinirCoordonnées CommandButton2
    End If

End Sub

Private Sub CommandButton3_Click()
    If Départ Then
        DéfinirCoordonnées CommandButton3
        TracerLigne
    Else
        DéfinirCoordonnées CommandButton3
    End If

End Sub

Private Sub CommandButton4_Click()
    If Départ Then
        DéfinirCoordonnées CommandButton4
        TracerLigne
    Else
        DéfinirCoordonnées CommandButton4
    End If

End Sub

Sub DéfinirCoordonnées(Bouton As CommandButton)
    If Départ = False Then
        DépartX = Bouton.Left _
                + (Bouton.Width / 2)
        DépartY = Bouton.Top _
                + (Bouton.Height / 2)
        Départ = True
       
    ElseIf Arrivée = False Then
        ArrivéeX = Bouton.Left _
                + (Bouton.Width / 2)
        ArrivéeY = Bouton.Top _
                + (Bouton.Height / 2)
        Arrivée = True
   
    End If
   
End Sub

Sub TracerLigne()
    ActiveSheet.Shapes.AddLine(DépartX, DépartY, ArrivéeX, ArrivéeY).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
  
    'Placer la flèche sous les boutons, si nécessaire
    Selection.ShapeRange.ZOrder msoSendToBack
   
    Arrivée = False
    DépartX = ArrivéeX
    DépartY = ArrivéeY
End Sub

'Effacer toutes les flèches
Sub Réinitialiser()
    Dim Shp As Shape
   
    For Each Shp In ActiveSheet.Shapes
        If InStr(1, Shp.Name, "Line") > 0 Then
            Shp.Delete
        End If
    Next
End Sub

MPi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Bonjour, merci pour vos réponses mais apparemment l'utilisation de shapes.AddLine crée une fléche avec les coordonnées de deux points (c'est ce que je comprends).


Mais en fait j'aimerais une flêche entre deux boutons car mon projet est de reporter les déplacements d'un opérateur dans un parc machines.


Explication : en fait mon idée est celle-ci :sur un tablet PC je met le plan de l'atelier en arrière plan sur lequel je place des boutons (les fameux boutons) qui représentent les machines de l'atelier.
Et en fait une fois mon atelier "virtuel créé" (plan + boutouns) ensuite je clique sur mes différents boutons pour représenter le déplacement de l'opérateur.

Ex: si l'opérateur va sur la machine 1 puis 2 puis 3 , je clique sur le bouton "machine1" puis 2 puis 3...et je représente le déplacement de celui-ci.
Ensuite le but serait de déplacer ses fameux boutons, se qui déplace mes flêches (agrandit ou raccoucit) afin de voir l'influence de ma nouvelle organisation de mon parc machine.

Etant débutant en info, j'ai imaginé  faire ce projet sur excel avec VBA mais je sais pas si d'autres langages (ou methodes) pourraient être mieux (je connait que le langage C )

Merci.

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
45
0
Merci
Salut,
Oui cela trace une droite entre deux points (remarque c'est le principe d'une droite)

Mais tes bouton on bien des coordonnées aussi donc tu doit pouvoir trouver les coordonnées des points intéressants.

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Ok mais mon problème est que même si j'indique les coordonnées de mes boutons, ceux-ci sont amenés à être bouger et donc leur coordonnées aussi.

Alors une autre question se pose : est que les coordonnées des boutons se changent dynamiquement afin que la flêche puisse "suivre" le déplacement du bouton?

Sinon, étant novice en VBA, comment (si cela est possible) met-on en place un système de coordonnées sur la feuille excel et quelle échelle: origine (0,0), point (3,5) (3m, 3mm?)

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Merci beaucoup Mpi, cette méthode marche à merveille, mais j'aimerais savoir si il est possible de créer la flêche sur des boutons aléatoire je m'explique :

Grâce à ceci on peut créer la flêche enht command bouton1 et commande bouton2 mais imaginons que je dispose de quatre boutons : 1  2
                                                                                  4  3
j'aimerais faire en sorte que si je clique sur le comande bouton 1 puis le 2, ceci me trace une flèche entre les deux puis 2-3, ou 3-4 ou 1-3 etc et que les flêches s'enchainne d'où le pb de nom du bouton.

Mais je te remercie encore une fois car ceci constitue un bon point de départ pour avancer

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Bonjour, pour préciser mon idée en fait j'aimerais savoir si il est possible de définir que : lorsque l'on clique sur le premier bouton, on définisse départX et départ Y étant le centre du bouton (comme cela ca m'enlève le problème de déssiner de gauche à droite ou de droite à gauche) et ensuite quand on clique sur le deuxième bouton, on définisse le centre du 2 eme bouton comme arrivée X et arrivée Y avec bien sur après le dessin de la flêche entre les deux centre des boutons.

Bon, jespère que c'est pas trop confus ...

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Pour trouver le centre, tu n'as qu'à utiliser les propriétés Left et Top du bouton cliqué, puis faire des calculs simples avec le Width et Height pour trouver le centre... plutôt simple.

Pour déterminer l'ordre des boutons, place 2 variables (Départ et Arrivée) booléennes dans un module en Public.
Sur Click d'un bouton, vérifie si Départ = TrueSi False then Départ True et tu calcules les valeurs DépartX et DépartYElse Si Arrivée False then Arrivée True , calcule les coordonnées d'arrivée, dessine la ligne et mets les 2 variables à False

quelque chose comme ça...

MPi
Commenter la réponse de cs_MPi
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Ok merci je vais essayer, sinon le centre j'avais trouvé en réflechissant un peu .

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Rebonjour, je suis dans la dernière ligne droite de mon apllication seul un élément me bloque en core, c'est que j'aimerais assigner à DépartX, DépartY les coordonnées de mon CommandButton mais sur celui que se clique et non le nom du bouton (idem pour ArrivéX et Y pour le deuxième boutons que je clique)

Voici ma procédure :

Private Sub A_Click()


If Depart True And DépartX 0 + 0 And DépartY = 0 + 0 Then


 DépartX = Sheets("Sheet1").A.Left _
            + (Sheets("Sheet1").A.Height / 2)
 DépartY = Sheets("Sheet1").A.Top _
            + (Sheets("Sheet1").A.Height / 2)
 End If
 
ArrivéeX = Sheets("Sheet1").B.Left _
           + (Sheets("Sheet1").B.Height / 2)
ArrivéeY = Sheets("Sheet1").B.Top _
            + (Sheets("Sheet1").B.Height / 2)
       
    ActiveSheet.Shapes.AddLine(DépartX, DépartY, ArrivéeX, ArrivéeY).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
   
ArrivéeX = DépartX
ArrivéeY = DépartY


End Sub

Ceci me trace bien une fléche entre A et B mais et ensuite me donne comme point de départ le bouton B mais j'aimerais généraliser cela et enchainer les fléches donc et il possible d'avoir quelquechose du genre :

Private Sub CommandButton_Click()


If Depart True And DépartX 0 + 0 And DépartY = 0 + 0 Then


 DépartX = Sheets("Sheet1").A.Left _
            + (Sheets("Sheet1").A.Height / 2)
 DépartY = Sheets("Sheet1").A.Top _
            + (Sheets("Sheet1").A.Height / 2)
 End If
 
ArrivéeX = Sheets("Sheet1").CommandButton_Click().Left _
           + (Sheets("Sheet1").CommandButton_Click().Height / 2)
ArrivéeY = Sheets("Sheet1").CommandButton_Click().Top _
            + (Sheets("Sheet1").CommandButton_Click().Height / 2)
       
    ActiveSheet.Shapes.AddLine(DépartX, DépartY, ArrivéeX, ArrivéeY).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
   
ArrivéeX = DépartX
ArrivéeY = DépartY


End Sub

Ceci je pense peut me permettre d'enchaines les fléches entre les boutonts (si j'arrive à dire que Arrivée = la position en X du bouton que je clique)  (idem ArrivéeY)

PS: Ce qui est en rouge donne une indication sur ce que je voudrais et je cherche naturellemnt la bonne commande

Merci d'avance

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Cette syntaxe serait préférable

ArrivéeX = Sheets("Sheet1").CommandButton.Left _
           + (Sheets("Sheet1").CommandButton.Height / 2)
ArrivéeY = Sheets("Sheet1").CommandButton.Top _
            + (Sheets("Sheet1").CommandButton.Height / 2)

Pour être plus clair, disons que tu as plusieurs boutons A, B, C, ...
Quand veux-tu relier A et B ? sur click de A ou sur click de B ?

MPi
Commenter la réponse de cs_MPi
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Bonjour, je vais essyer de préciser mon idée :

Nous avons 3 boutons A,B et C, en fait j'aimerais que lorsque je lance ma Macro, quand je clique sur le tout premier bouton ( A )cela me définit le bouton A comme point de départ et ensuite quand je clique sur le bouton B, cela me définit celui ci comme point d'arrivée et trace la flêche entre A et B.
Ensuite ce point d'arrivée devient le nouveau point de départ : B est le nouveau point de départ, et je clique sur C mon nouveau bouton d'arrivée et cela me trâce la flêche entre B et C (et ainsi de suite).

Voila j'espère que c'est plus clair et merci.

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Merci beaucoup, moi j'avais reussi mais fait un truc beaucoup plus lourd, je mettais ce code dans tout les commandButton

Public Depart As Boolean
Public Arrivée As Boolean
Public DépartX As Double, DépartY As Double
Public ArrivéeX As Double, ArrivéeY As Double




Private Sub CommandButton1_Click()


If Depart True And DépartX 0 + 0 And DépartY = 0 + 0 Then


 DépartX = Sheets("Sheet1").CommandButton1.Left _
            + (Sheets("Sheet1").CommandButton1.Height / 2)
 DépartY = Sheets("Sheet1").CommandButton1.Top _
            + (Sheets("Sheet1").CommandButton1.Height / 2)
 End If
 
ArrivéeX = Sheets("Sheet1").CommandButton1.Left _
           + (Sheets("Sheet1").CommandButton1.Height / 2)
ArrivéeY = Sheets("Sheet1").CommandButton1.Top _
            + (Sheets("Sheet1").CommandButton1.Height / 2)
 If Arrivée = False Then
 
    ActiveSheet.Shapes.AddLine(DépartX, DépartY, ArrivéeX, ArrivéeY).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
    Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
   
End If


DépartX = ArrivéeX
DépartY = ArrivéeY


End Sub

Sinon j'avais aussi penser à effacer les flêches et quelque-uns m'avais donné la solution :

Private Sub Effacer_fleches_Click()


Dim Li As Line
   For Each Li In ActiveSheet.Lines
       Call Li.Delete
   Next
   Set Li = Nothing


End Sub

Je te remercie encore une fois

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Je ne comprends toujours pas le pourquoi de cette commande
DépartX = 0 + 0

Un simple 0 aurait pu suffire...(?)
De toutes façons, l'idée des variables booléennes était justement de ne pas vérifier les autres

Bonne continuation

MPi
Commenter la réponse de cs_MPi
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
0
Merci
Oui tu a raison, un simple 0 suffit, j'avais ecris cela car je ne savais pas comment marche un "double", je me  suis dit double, il faut lui déclaré 2 chose
et vu que par exemple ArrivéeX = Sheets("Sheet1").CommandButton1.Left _
           + (Sheets("Sheet1").CommandButton1.Height / 2)
J'ai  cru qu'il fallait lui indiqué 0 + 0 et non juste 0

Voila la petite explication

Ps: c'est mon tout premier pgrm en VB donc j'apprend de mes erreurs)
Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Commenter la réponse de taj88
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
N'oublie pas l'aide en ligne qui en dit pas mal sur des choses comme Double. Un simple click sur le mot, puis F1

On ne s'en sort pas... Tous y passent régulièrement... et moi-même encore après de nombreuses années.
La mémoire est la faculté qui oublie... et ça empire en vieilissant

Bonne continuation.

MPi
Commenter la réponse de cs_MPi