2012-02-23 2 views
0

3 개의 컬럼 테이블이 있습니다. 두 개의 열은 산점도를 생성하는 데 사용되는 xy 값을 제공합니다. 세 번째 열에는 하이퍼 링크가 있습니다. 따라서 각 행에는 x 값, y 값 및 하이퍼 링크가 포함됩니다 (각 링크는 고유합니다). 엑셀 분산 형 플롯에서 데이터 포인트를 클릭하면 해당 하이퍼 링크의 셀 주소를 어떻게 얻을 수 있습니까?Excel 분산 형 플롯에서 데이터 점을 클릭하여 셀 주소를 얻는 방법은 무엇입니까?

답변

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 

그런 다음 새 코드 모듈을 추가하고 다음 코드를 추가하십시오. "ChartURLs 교체"다음과 같이

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 이벤트에서 절차 (또는 원하는대로의 다른 이벤트)에 대한 호출을 추가 할 필요가 당신의 범위의 이름 :

Option Explicit 

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

는 희망이 당신이 다음 적어도 좋은 시작해야하지 않을 경우, 찾고있는 물건의 일종이다.

관련 문제