2012-02-23 25 views
0

私は3つの列テーブルを持っています。 2つの列は、散布図の生成に使用されるxy値を提供します。 3番目の列にはハイパーリンクが含まれています。各行にはx値、y値、ハイパーリンクが含まれています(各リンクは一意です)。 Excelの散布図のデータポイントをクリックすると、対応するハイパーリンクのセルアドレスを取得するにはどうすればよいですか?Excel散布図のデータポイントをクリックしてセルアドレスを取得するにはどうすればよいですか?

答えて

1

これを行う1つの方法は、ハイパーリンクの列を名前付き範囲に含めることです。彼らがいったんそれを見れば、それはチャートからそれらを参照するのに十分なほどまっすぐです。

あなたが求めているものは完全にはわかりませんが、データポイントをクリックするとY値/セルの横にあるセルの値のメッセージボックスがポップアップ表示されます。

これを行う1つの方法は、ハイパーリンクの列を名前付き範囲に含めることです。彼らがいったんそれを見れば、それはチャートからそれらを参照するのに十分なほどまっすぐです。

あなたは別のチャートワークシート上のグラフを持っているなら、あなたは(チャートワークシートモジュールに組み込まれた)次のコードを使用することができます。

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 

ザ・「ChartURLs」を置き換える、次のように、あなたはWorksheet_Activateイベント(またはお好みの他のイベント)からSelectChart()プロシージャの呼び出しを追加する必要がありますあなたの範囲の名前を持つ:

Option Explicit 

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

うまくいけば、これはあなたが探しているものの一種である、そうでない場合は、それは少なくとも良いスタートでなければなりません。

関連する問題