如何通过单击Excel散点图上的数据点来获取单元格地址?

时间:2012-02-23 20:50:03

标签: excel-vba vba excel

我有一个三列表。其中两列提供用于生成散点图的xy值。第三列包含超链接。因此每行包含x值,y值和超链接(每个链接都是唯一的)。当我点击excel散点图上的数据点时,如何获取相应超链接的单元格地址?

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是将您的超链接列放在命名范围内。一旦它们出现,它就可以直接从图表中引用它们。

不完全确定你在问什么,但是当点击数据点时,会弹出一个Y值/单元格旁边单元格中值的消息框。

这样做的一种方法是将您的超链接列放在命名范围内。一旦它们出现,它就可以直接从图表中引用它们。

如果您在单独的图表工作表上有图表,那么您可以使用以下代码(嵌入在图表工作表模块上):

Private Sub Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
    Dim lngElementID As Long
    Dim lngArg1 As Long
    Dim lngArg2 As Long

    'Only catch Left-Clicks
    If Button = xlPrimaryButton Then
        With ActiveChart
            'Get the coordinates of what has been clicked
            call .GetChartElement(x, y, lngElementID, lngArg1, lngArg2)

            If lngElementID = xlSeries Then
                If lngArg2 > 0 Then
                    'Range containing the messages to be displayed
                    Set varRange = Worksheets("Sheet1").[ChartURLs]

                    Call MsgBox(CStr(varRange(lngArg2, 1)))
                End If
            End If
        End With
    End If
End Sub

如果图表只是嵌入在普通的工作表中,那么我们还需要使用WithEvents来捕获Chart事件。将以下代码添加到新的类模块:

Option Explicit

Public WithEvents chartEvents As Chart

Private m_rngPopupMsgs As Range

Private Sub chartEvents_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
    Dim lngElementID As Long
    Dim lngArg1 As Long
    Dim lngArg2 As Long
    Dim varRange As Variant

    'Only catch Left-Clicks
    If Button = xlPrimaryButton Then
        With ActiveChart
            'Get the coordinates of what has been clicked
            .GetChartElement x, y, lngElementID, lngArg1, lngArg2

            If lngElementID = xlSeries Then
                If lngArg2 > 0 Then

                    If Not (m_rngPopupMsgs Is Nothing) Then
                        Set varRange = m_rngPopupMsgs
                        Call MsgBox(CStr(varRange(lngArg2, 1)))
                    End If
                End If
            End If
        End With
    End If
End Sub

Public Property Get PopupMsgs() As Range
    Set PopupMsgs = m_rngPopupMsgs
End Property

Public Property Set PopupMsgs(rngPopupMsgs As Range)
    Set m_rngPopupMsgs = rngPopupMsgs
End Property

Private Sub Class_Terminate()
    Set m_rngPopupMsgs = Nothing
End Sub

然后添加一个新的代码模块并添加以下代码。

Option Explicit

Private m_objChtEvents As New clsChartEvents

Public Sub SelectChart(ByRef wks As Worksheet, ByRef rngPopupMsgs As Range)
    Dim objChart As Chart

    If wks.ChartObjects.Count > 0 Then
        Set m_objChtEvents = New clsChartEvents

        Set objChart = wks.ChartObjects(1).Chart
        Set m_objChtEvents.chartEvents = objChart

        Set m_objChtEvents.PopupMsgs = rngPopupMsgs
    End If
End Sub

在包含您的图表的工作表的工作表模块中,您需要从Worksheet_Activate事件(或您喜欢的任何其他事件)添加对SelectChart()过程的调用,如下所示,将“ChartURLs”替换为名称为你的范围:

Option Explicit

Private Sub Worksheet_Activate()
    Call SelectChart(Me, Range("ChartURLs"))
End Sub

希望这是你正在寻找的东西,如果不是那么它至少应该是一个好的开始。