Option Explicit
'coordonnées des points sélectionnées A (gauche)et B (droite)
Dim x1!, y1!, x2!, y2!
Private Sub Chart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
Dim rep, a!, b!, x0!, y0!, x3!, y3!, i&, Pas&
Pas = 2     'valeur du pas
'test si on a sélectionne un point de graphique
If ElementID = xlSeries Then
   'c'est un point de graphique
   If Arg2 = -1 Then
    'msgbox "Tous les points du graphique " & Arg1 & " ont été sélectionnés"
   Else
    'demander si c'est le point A (celui de droite)
    rep = vbNo
    rep = MsgBox("S'agit il du point A (Le plus à gauche)?" & vbLf & "( sinon c'est le point B le plus à droite )", vbYesNo + vbQuestion + vbDefaultButton1)
    If rep = vbYes Then
      'point le plus à droite
      x1 = ActiveChart.SeriesCollection(Arg1).Points(Arg2).Left
      y1 = ActiveChart.PlotArea.Top + ActiveChart.PlotArea.Height - ActiveChart.SeriesCollection(Arg1).Points(Arg2).Top
      y1 = y1
    Else
      'point B le plus à gauche
      rep = vbNo
      x2 = ActiveChart.SeriesCollection(Arg1).Points(Arg2).Left
      y2 = ActiveChart.PlotArea.Top + ActiveChart.PlotArea.Height - ActiveChart.SeriesCollection(Arg1).Points(Arg2).Top
      
      rep = MsgBox("Voulez vous tracer la droite ?", vbYesNo + vbQuestion + vbDefaultButton1)
      If rep = vbYes Then
        'traçage de la droite
        'coeff directeur de la droite
        a = (y2 - y1) / (x2 - x1) 'coeff directeur de la droite
        'ordonnée à x=0
        b = (x2 * y1 - x1 * y2) / (x2 - x1)
        ' abscisse du point du graphe le plus à gauche
        x0 = ActiveChart.PlotArea.Left
        ' ordonnée du point du graphe le plus à gauche (positif)
        For i = 0 To 1000 Step Pas
          x0 = ActiveChart.PlotArea.Left + i * Pas
          y0 = ActiveChart.PlotArea.Top + ActiveChart.PlotArea.Height - (a * x0 + b)
          If y0 > 0 And y0 <= ActiveChart.PlotArea.Top + ActiveChart.PlotArea.Height Then Exit For
        Next i
        'correction hauteur du marqueur
        If a > 0 Then y0 = y0 - 1# Else y0 = y0 + 1.5
        ' abscisse du point du graphe le plus à droite
        x3 = ActiveChart.PlotArea.Left + ActiveChart.PlotArea.Width
        ' ordonnée du point du graphe le plus à droite
        For i = 0 To 1000 Step Pas
          x3 = ActiveChart.PlotArea.Left + ActiveChart.PlotArea.Width - i * Pas
          y3 = ActiveChart.PlotArea.Top + ActiveChart.PlotArea.Height - (a * x3 + b)
          If y3 >= 0 And y3 <= ActiveChart.PlotArea.Top + ActiveChart.PlotArea.Height Then Exit For
        Next i
        'correction hauteur du marqueur
        If a > 0 Then y3 = y3 - 1# Else y3 = y3 + 1.5
        On Error Resume Next
        ' on tente de supprimer la précédente droite
        ActiveChart.Shapes("toto").Delete
        On Error GoTo 0
        'Limitation des bornes de la droite
        a = a
        ' On trace la droite
        ActiveChart.Shapes.AddConnector(msoConnectorStraight, x0, y0, x3, y3).Select
        ' on nomme la droite pour l'effacer la prochaine fois
        Selection.Name = "toto"
        ' épaisseur et couleur de la droite
        With Selection.ShapeRange.Line
          .Visible = msoTrue
          .Weight = 1.25
          .ForeColor.RGB = RGB(255, 0, 0)
          .Transparency = 0
        End With
      End If
    End If
  End If
End If
End Sub