Как получить адрес ячейки, щелкнув точку данных на графике рассеяния Excel? - PullRequest
1 голос
/ 24 февраля 2012

У меня есть таблица из трех столбцов. Два столбца содержат значения xy, используемые для построения графика рассеяния. Третий столбец содержит гиперссылки. Таким образом, каждая строка содержит значение x, значение y и гиперссылку (каждая ссылка уникальна). Как получить адрес ячейки соответствующей гиперссылки, когда я щелкаю точку данных на графике рассеяния Excel?

1 Ответ

1 голос
/ 24 февраля 2012

Один из способов сделать это - разместить столбец гиперссылок в именованном диапазоне. Как только они появятся, достаточно просто сослаться на них из таблицы.

Не совсем уверен, что вы спрашиваете, но при нажатии на точку данных появляется окно сообщения со значением в ячейке рядом со значением / ячейкой Y.

Один из способов сделать это - разместить столбец гиперссылок в именованном диапазоне. Как только они появятся, достаточно просто сослаться на них из диаграммы.

Если у вас есть диаграмма на отдельном рабочем листе, то вы можете использовать следующий код (встроенный в модуль Chart Worksheet):

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. Добавьте следующий код в новый модуль Class:

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

Затем добавьте новый модуль Code и добавьте следующий код.

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

В модуле «Рабочий лист» рабочего листа, содержащего вашу диаграмму, необходимо добавить вызов процедуры SelectChart () из события Worksheet_Activate (или любого другого события по вашему вкусу) следующим образом, заменив «ChartURLs» именем Ваш диапазон:

Option Explicit

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

Надеюсь, это то, что вы ищете, если нет, то это должно быть, по крайней мере, хорошее начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...