У меня есть диаграмма, встроенная на листе (X, Y разброс). У меня также есть событие mouseover на диаграмме, которое - когда вы наводите курсор на datapoint - печатает выбранное значение соответствующего datapoint в ячейке. Это работает с использованием метода .GetChartElement.Расчет позиции данных с событием наведения курсора
Однако, я также хотел бы добавить функцию, с которой вы можете добавить стрелку (или линию), соединяющую точку данных и предопределенную именованную ячейку. Мне также удалось это сделать, но , к сожалению, мои вычисления не достаточно точны, потому что конец datapoint линии никогда не находится точно в точке, а где-то вокруг него (см. Рисунок).
Как я это сделал:
Private Sub myChartClass_MouseMove(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)
Me.myChartClass.GetChartElement X, Y, ElementID, Arg1, Arg2
Set chrt = ActiveSheet.ChartObjects(1).Chart
Set ser = ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
chart_data = ser.Values
chart_label = ser.XValues
YValue = chart_data(Arg2)
XValue = chart_label(Arg2)
'[Code to print corresponding values]
If addComment = True Then Call wks35.addComment(XValue, YValue)
Таким образом, я могу либо передать координаты (X, Y переменные) и фактические значения по осям (XValue, YValue). Выше, последний используется.
Public Sub addComment(_
ByVal X As Double, _
ByVal Y As Double _
)
Dim chartObj As Chart
Dim chartWidth As Double
Dim chartHeight As Double
Dim l1 As Long, l2 As Long, r1 As Long, r2 As Long
With wks35
Set chartObj = .ChartObjects(1).Chart
chartWidth = chartObj.PlotArea.Width
chartHeight = chartObj.PlotArea.Height
Y = chartHeight - (chartHeight * ((Y - chartObj.Axes(xlValue).MinimumScale) _
/(chartObj.Axes(xlValue).MaximumScale - chartObj.Axes(xlValue).MinimumScale)))
X = chartWidth * ((X - chartObj.Axes(xlCategory).MinimumScale)/_
(chartObj.Axes(xlCategory).MaximumScale - chartObj.Axes(xlCategory).MinimumScale))
l1 = Range("Comment1").Left
l2 = Range("Comment1").Top
r1 = X + ActiveSheet.ChartObjects(1).Left + chartObj.PlotArea.InsideLeft
r2 = Y + ActiveSheet.ChartObjects(1).Top + chartObj.PlotArea.InsideTop
With ActiveSheet.Shapes.AddLine(l1, l2, r1, r2).Line
.ForeColor.RGB = RGB(255, 0, 0)
End With
End With
End Sub
Поэтому в основном идея состояла в том, чтобы иметь значения по осям и путем расчета его относительного положения с учетом минимального и максимального значения на оси получить абсолютную вершину в DataPoint и оставил значение от границ PlotArea. Затем добавьте разницу в диаграмме и области, а затем диаграммы сверху и слева.
Это может быть долгим и трудным для подражания, но я ценю любую помощь.