Excel 使用图表鼠标悬停事件计算数据点位置

Excel 使用图表鼠标悬停事件计算数据点位置,excel,events,charts,vba,Excel,Events,Charts,Vba,我有一张嵌入在纸上的图表(X,Y散点)。我在图表上还有一个mouseover事件,当您将鼠标悬停在数据点上时,它会将相应数据点的选定值打印到单元格中。这适用于使用.GetChartElement方法 但是,我还想添加一个特性,您可以添加一个箭头(或线)连接一个数据点和一个预定义的命名单元。我也成功地做到了这一点,但不幸的是,我的计算不够准确,因为线的数据点末端从来都不是精确的点,而是它周围的某个地方(见图) 我这样做的方式: Private Sub myChartClass_MouseMove

我有一张嵌入在纸上的图表(X,Y散点)。我在图表上还有一个mouseover事件,当您将鼠标悬停在数据点上时,它会将相应数据点的选定值打印到单元格中。这适用于使用.GetChartElement方法

但是,我还想添加一个特性,您可以添加一个箭头(或线)连接一个数据点和一个预定义的命名单元。我也成功地做到了这一点,但不幸的是,我的计算不够准确,因为线的数据点末端从来都不是精确的点,而是它周围的某个地方(见图)

我这样做的方式:

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
因此,基本上,我们的想法是将值放在轴上,通过计算其相对位置,考虑轴上的最小值和最大值,从绘图区域的边界获得数据点的绝对顶部和左侧值。然后添加图表和绘图区域的差异,然后添加顶部和左侧的图表


这可能很长,很难理解,但我很感激任何帮助。

不管怎样,我都明白了

我用过这个

chartWidth = chartObj.PlotArea.InsideWidth
chartHeight = chartObj.PlotArea.InsideHeight
而不是这个

chartWidth = chartObj.PlotArea.Width
chartHeight = chartObj.PlotArea.Height
它几乎就在那里,所以我在末尾添加了一些常量(10到左边,3到顶部),这些线就在它们的位置上