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