Excel VBA : Coordonnées d'un point graphique

Bien le bonjour,

Avant de poser ma question, voici la base de mon travail. J'ai actullement un graphique Excel (graphique à barres horizontales) comportant un certain nombre de séries.
J'aurai besoin de récupérer les coordonées d'une série particulière (afin de pouvoir tracer à cet endroit précis une flèche ou une barre verticale). J'ai bien réussi à récupérer le numéro de la série, j'ai cherché pendant pas mal de temps dans l'aide et divers forums, mais je n'arrive pas à savoir s'il est possible de récupérer ces coordonées.

J'espère que quelqu'un pourra m'aider, je reste à disposition pour plus de précision si vous en avez besoin.

Merci d'avance :)

2 réponses

  1. Bonjour

    VB/VBA/VBS - Programmation - FORUM HardWare.fr :
    Accéder aux éléments de dessin d'un graphique Excel [VBA EXCEL] :
    https://forum.hardware.fr/hfr/Programmation/VB-VBA-VBS/excel-acceder-excel-sujet_89822_1.htm

    coordonnées X et Y de la souris sur graphique excel ? :
    http://www.presence-pc.com/forum/ppc/Programmation/coordonnees-souris-graphique-excel-sujet-4592-1.htm

       1. Private Sub Chart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
       2. Dim ElementID As Long
       3. Dim Arg1 As Long
       4. Dim Arg2 As Long
       5. Dim v As Variant
       6. GetChartElement x, y, ElementID, Arg1, Arg2
       7. MsgBox ("X = " & x & " / Y = " & y)
       8. End Sub
    
    Cela permet d'afficher les coordonnées du pointeur de la souris si le graphique est dans un onglet et non intégré à une feuille Excel.
    
    ******************
    
    J'arrive à récupérer les coordonnées X et Y de la souris sur le graphique incorporé dans une feuille Excel. En fait il "suffit" de créer un module de classe "graphique" lequel existe déjà dans excel et reconnait les "mouse down", les "mouse up" et les "mouse move"
     
    Créez un nouveau module de classe, il s'appelle classe1 par défaut. Je l'ai laissé comme ça(en fait je n'arrive pas à le modifier)
    Il faut placer "Public WithEvents mychartclass As Chart" en tête de classe. Voici le code de la classe :
    
       1. Public WithEvents mychartclass As Chart
       2.
       3. Private Sub mychartclass_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
       4.     Range("A9" ) = x
       5.     Range("B9" ) = y
       6. End Sub
       7.
       8. Private Sub mychartclass_MouseMove(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
       9.     Range("A8" ) = x
      10.     Range("B8" ) = y
      11. End Sub
    
    ******************
    
    Ensuite il faut activer cette classe à partir du module de la feuille excel (sheet1 chez moi). La sub "initializechart" est reliée à un bouton de commande sur la feuille Excel. Voici le code :
    
       1. Dim myClassModule As New Classe1
       2.
       3. Private Sub initializechart()
       4. Set myClassModule.mychartclass = Sheet1.ChartObjects(1).Chart
       5. End Sub
    
    Avec ça vous verrez apparaitre les coordonnées du pointeur de votre souris dans les cases A8 et B8.
    "Il ne reste plus qu'à" lier ces coordonnées à une ligne qui sera tracée sur le graphique.

    Merci
    2
    1. Bonjour

      Infos si ça peut servir :

      Extraction de réseaux de rues à partir d’images satellites à haute résolution spatiale :
      http://www.google.fr/search?hl=fr&q=cache:U6jAJ4uE4ssJ:documents.irevues.inist.fr/bitstream/2042/13796/1/A79.pdf+extraire+coordonnee+point+sur+un+graphique

      XL: Etiquettes sur chaque point d'un graphique :
      https://support.microsoft.com/fr-fr/help/466512

      Retrouver les coordonnées d'un point sur un graphique - Forum des développeurs :
      https://www.developpez.net/forums/d330098/environnements-developpement/matlab/interfaces-graphiques/retrouver-coordonn-es-d-point-graphique/

      [Excel] Récupérer les coordonnées d'un point :
      https://forums.commentcamarche.net/forum/affich-1461012-excel-recuperer-les-coordonnees-d-un-point#0

      ******
      Recherche de 'coordonnee point sur un graphique' avec Google :
      https://www.google.fr/search?hl=fr&q=coordonnee+point+sur+un+graphique&gws_rd=ssl
      ******

      récup. donnée de graph - Excel Downloads Forums :
      https://www.excel-downloads.com/threads/recup-donnee-de-graph.30592/

      Récupération de points sur un graphiques Exce :
      https://forums.commentcamarche.net/forum/affich-7815283-recuperation-de-points-sur-un-graphiques-exce#0

      Merci

      ******************
      ******************

      Symptômes

      J'ai réalisé un graphique sur lequel je souhaite afficher des étiquettes personnalisées sur chaque point d'une série, le contenu de ces étiquettes se trouvant sur plage différente de celle utilisée pour la création du graphique.
      De plus, je souhaite que les modifications de ces valeurs dans la feuille de calcul mettent à jour ces étiquettes.
      Comment dois-je procéder ?

      Résolution

      Cette fonctionnalité n'est pas disponible directement dans Microsoft Excel.
      Cependant, vous pouvez réaliser cette opération en ajoutant manuellement la référence des cellules à chaque point de la série en suivant la procédure suivante :

      Si le graphique est incorporé à la feuille de calcul :
      1. Activez le graphique en double-cliquant sur l'objet graphique

      Dans tous les cas (autres que Surface):
      1. Sélectionner la série.
      2. Dans le menu Insertion, activer la commande Etiquette de données...
      3. Choisissez Afficher étiquette.
      4. Cliquez sur OK.
      5. Sélectionnez l'étiquette d'un des points.
      6. Tapez le signe égal "=".
      7. Puis cliquez sur la cellule de la feuille de calcul contenant
      l'étiquette.
      8. Validez.
      9. Répétez les étapes 5 à 9 pour chaque point de la série.

      Cette série de manipulations peut être automatisée par une macro-commande écrite en langage macro Excel 4.0 (pour toutes versions d'Excel) ou Visual Basic Edition Applications (pour les versions 5.0 et supérieures).

      ******************
      ******************
      EXEMPLE :
      
      Voici un exemple de code permettant d'automatiser ce traitement. Pour
      mettre en oeuvre ce programme, vous pouvez suivre le processus
      suivant :
      
      1. A partir des données contenues dans une feuille de calcul, créez un
      graphique
      2. Si le graphique est incorporé, activez le graphique.
      3. Sélectionnez une série.
      4. Exécutez la macro décrite ci-dessous.
      
      #########################################################################
      ' Code Visual Basic anglais
      
      Sub AttribuerEtiquettes()
      Dim maPlage As Variant, maCellule As Object, monPoint As Object
      Dim nmGraphique$, nmSérie$, i%
      
      ' Détection du type de la fenêtre (xlGraphiqueDansEmplacement ou
      ' xlGraphiqueEnFenetre).
      tpGraphique = ActiveWindow.Type
      
      ' Récupération du nom du graphique et de la série sélectionnée.
      nmGraphique = ActiveChart.Parent.Name
      nmSérie = Selection.Name
      
      ' Déselection du graphique incorporé pour pouvoir sélectionner
      ' une plage de cellules
      If tpGraphique <> 1 Then ActiveWindow.Visible = False
      
      ' Sélection de la plage contenant les étiquettes
      Set maPlage = Application.InputBox( _
      Prompt:="Selectionnez la plage contenant les étiquettes :", _
      Title:="Etiquettes", Type:=8)
      
      ' Réactivation du graphique incorporé
      If tpGraphique <> 3 Then ActiveSheet.ChartObjects(nmGraphique).Activate
      
      ' Sélection de la série
      ActiveChart.SeriesCollection(nmSérie).Select
      
      ' Quitte si on a annulé la boîte
      If VarType(maPlage) = vbBoolean Then Exit Sub
      
      ' Initialisation d'un compteur
      i = 1
      
      ' Quitte si on a plus de cellules que de points
      If maPlage.Count > Selection.Points.Count Then
      MsgBox Prompt:="Sélection non valide. Plage trop grande !", _
      Buttons:=vbCritical
      Exit Sub
      End If
      Application.ScreenUpdating = False
      With Selection
      For Each maCellule In maPlage
      Set monPoint = .Points(i)
      
      ' On initialise l'étiquette avec une référence de cellule
      ' ceci permettra d'avoir une liaison
      With monPoint
      .ApplyDataLabels Type:=xlShowValue
      .DataLabel.Text = "=" & maCellule.Address _
      (ReferenceStyle:=xlR1C1, External:=True)
      End With
      i = i + 1
      Next
      End With
      End Sub
      ' Code Visual Basic français
      
      Proc AttribuerEtiquettes()
      Dcl maPlage En Variant; maCellule En Objet; monPoint En Objet
      Dcl nmGraphique$; nmSérie$; i%
      
      ' Détection du type de la fenêtre (xlGraphiqueDansEmplacement ou
      ' xlGraphiqueEnFenetre).
      tpGraphique = FenêtreActive.Type
      
      ' Récupération du nom du graphique incorporé et depuis la série
      ' sélectionnée.
      nmGraphique = GraphiqueActif.Parent.Nom
      nmSérie = Sélection.Nom
      
      ' Déselection du graphique incorporé pour pouvoir sélectionner
      ' une plage de cellules
      Si tpGraphique <> 1 Alors FenêtreActive.Affiché = Faux
      
      ' Sélection de la plage contenant les étiquettes
      AffecteRéf maPlage = Application.BoîteSaisie( _
      Invite:="Selectionnez la plage contenant les étiquettes :"; _
      Titre:="Etiquettes"; Type:=8)
      
      ' Réactivation du graphique incorporé
      Si tpGraphique <> 3 Alors FeuilleActive.ObjetsGraphique(nmGraphique) _
      .Activer
      
      ' Sélection de la série
      GraphiqueActif.Séries(nmSérie).Sélectionner
      
      ' Quitte si on an annulé la boîte
      Si TypeVariant(maPlage) = vbBooléen Alors Sortir Proc
      
      ' Initialisation d'un compteur
      i = 1
      
      ' Quitte si on a plus de cellules que de points
      Si maPlage.NombreDe > Sélection.Points.NombreDe Alors
      Message Invite:="Sélection non valide. Plage trop grande !"; _
      Boutons:=vbCritique
      Sortir Proc
      Fin Si
      Application.MiseAJourEcran = Faux
      Avec Sélection
      Pour Chaque maCellule Dans maPlage
      AffecteRéf monPoint = .Points(i)
      
      ' On initialise l'étiquette avec une référence de cellule
      ' ce qui permettra d'avoir une liaison
      Avec monPoint
      .AttribuerEtiquettesDonnées Type:=xlAffichageValeur
      .EtiquetteDonnée.Texte = "=" & maCellule.Adresse _
      (StyleRéférence:=xlL1C1; Externe:=Vrai)
      Fin Avec
      i = i + 1
      Suivant
      Fin Avec
      Fin Proc
      #########################################################################
      
      #########################################################################
      Langage Macro Excel 4.0
      
      nmSérie=SELECTION()
      nmGraphique=LIRE.DOCUMENT(1)
      =ACTIVER()
      maZone=ENTRER("Selectionnez la plage contenant les étiquettes :";
      8;"Etiquettes")
      =ACTIVER(nmGraphique)
      =SELECTIONNER(nmSérie)
      =SI(ESTLOGIQUE(maZone);RETOUR())
      noSérie=CNUM(SUBSTITUE(nmSérie;"S";""))
      idPoint=1
      =ETIQUETTES.DONNEES(4)
      =ECRAN(FAUX)
      =POUR.CELLULE("maCellule";maZone)
      = AJOUTER.TEXTE(4;noSérie;idPoint)
      = FORMULE("="&TEXTEREF(maCellule))
      idPoint= idPoint+1
      =SUIVANT()
      =RETOUR()
      #########################################################################
      
      
      REMARQUES :
      
      1. Dans la macro en langage Excel 4.0, la fonction ETIQUETTES.DONNEES(4)
      doit être supprimée pour fonctionner dans la version 4.0 de Microsoft
      Excel.
      2. Les macros en Visual Basic Edition Applications et langage Macro
      Excel 4.0 suivent le même raisonnement.
      
      Merci
      0