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