2014-10-17 2 views
0

У меня есть диаграмма, встроенная на листе (X, Y разброс). У меня также есть событие mouseover на диаграмме, которое - когда вы наводите курсор на datapoint - печатает выбранное значение соответствующего datapoint в ячейке. Это работает с использованием метода .GetChartElement.Расчет позиции данных с событием наведения курсора

Однако, я также хотел бы добавить функцию, с которой вы можете добавить стрелку (или линию), соединяющую точку данных и предопределенную именованную ячейку. Мне также удалось это сделать, но , к сожалению, мои вычисления не достаточно точны, потому что конец datapoint линии никогда не находится точно в точке, а где-то вокруг него (см. Рисунок).

lines almost at the right place

Как я это сделал:

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. Затем добавьте разницу в диаграмме и области, а затем диаграммы сверху и слева.

Это может быть долгим и трудным для подражания, но я ценю любую помощь.

ответ

0

Как бы то ни было, я понял.

Я использовал этот

chartWidth = chartObj.PlotArea.InsideWidth 
chartHeight = chartObj.PlotArea.InsideHeight 

вместо этого

chartWidth = chartObj.PlotArea.Width 
chartHeight = chartObj.PlotArea.Height 

Это было почти там, так что я добавил некоторые константы к концу (10 налево, 3 вверх) линии находятся на место.

Смежные вопросы