Excel - VBA

Chart의 이벤트를 사용하기

EGTools 2023. 8. 1. 23:20
728x90

Chart의 특정 부위를 더블 클릭하면 이벤트를 실행하고자 할 때

Class를 이용해서 차트에서 이벤트를 사용할 수 있도록 설정하는 방법입니다.

 

전체적인 내용은 이벤트를 가진 개체를 정의할 때 사용하는 방법과 동일합니다.

 

□ 이벤트를 가진 Chart용 이벤트 Class 정의

먼저 Chart에서 이벤트를 사용할 수 있도록 WithEvents를 사용한 Class를 정의합니다.

Class 이름은 clsEventChart라고 하겠습니다.

실제 Chart에서 일어나는 이벤트 처리 작업은 여기에서 설정합니다.

Public WithEvents EvtChart As Chart '//이벤트를 가진 Chart개체

Private m_x As Long         '//마우스 위치
Private m_y As Long         '//마우스 위치
Private d_series As Long    '//데이터 시리즈
Private d_point As Long     '//데이터 포이트

Private Sub EvtChart_BeforeDoubleClick(ByVal ElementID As Long, _
    ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
    Application.EnableEvents = False         '// 다른 이벤트가 실행되지 않도록 중단
    'If ElementID <> xlSeries Then Exit Sub  '// 데이터 시리즈 인 경우에만 실행할 때 해제
    If ElementID <> xlSeries Then d_series = 0: d_point = 0
    
    '// GetChartElement를 이용해서 변수에 현재 발생한 위치와 아이템을 확인
    EvtChart.GetChartElement m_x, m_y, ElementID, d_series, d_point
    
    '// 확인한 정보로 이벤트 처리
    MsgBox "ElementID=" & ElementID & vbNewLine & "x=" & m_x & vbNewLine & "y=" & m_y & _
           vbNewLine & "Series=" & d_series & vbNewLine & "Point=" & d_point
    Cancel = True
    
    Application.EnableEvents = True
End Sub

Private Sub EvtChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
    m_x = x:                    m_y = y               '// 마우스 클릭 위치
End Sub

Private Sub EvtChart_SeriesChange(ByVal SeriesChange As Long, ByVal PointIndex As Long)
    d_series = SeriesChange:    d_point = PointIndex  '// 변경된 데이터 정보
End Sub

 

 일반 Module에서 이벤트를 사용할 Chart 지정

먼저 이벤트 활성화 된 Chart를 모아둘 Collection을 정의하고,

이벤트를 활성화할 Chart들을 clsEventChart Class의 이벤트 차트에 지정하고 콜렉션에 추가

Dim colEvCharts As Collection         '// 이벤트를 가진 Chart를 모아둘 콜렉션

Sub EnableChartEvents()
    Dim myEvChart As clsEventChart        '// 이벤트를 가진 Chart Class
    Dim chtObj As ChartObject
    
    Set colEvCharts = New Collection      '// 실행시마다 콜렉션 초기화
    
    If TypeName(ActiveSheet) = "Chart" Then   '//시트삽입-차트로 만든 Chart
        'If Left(ActiveSheet.Name, 3) = "EG_" Then '//특정 이름의 차트만 사용할 경우
            Set myEvChart = New clsEventChart
            Set myEvChart.EvtChart = ActiveSheet
            colEvCharts.Add myEvChart     '// 이벤트 Chart를 콜렉션에 추가
        'End If
    End If

    If ActiveSheet.ChartObjects.Count > 0 Then  '// 일반시트에 삽입한 Chart
        For Each chtObj In ActiveSheet.ChartObjects
            'If Left(chtObj.Name, 3) = "EG_" Then  '//특정 이름의 차트만 사용할 경우
                Set myEvChart = New clsEventChart
                Set myEvChart.EvtChart = chtObj.Chart
                colEvCharts.Add myEvChart   '// 이벤트 Chart를 콜렉션에 추가
            'End If
        Next
    End If
End Sub

 

 현재_통합_문서 Class에서 자동실행 설정

문서에서 자동으로 Chart이벤트를 실행할 수 있도록 트리거를 만들어 줌

Private Sub Workbook_Activate()
    '// Workbook이 열릴 때 SheetActivate 이벤트는 실행되지 않으므로 강제 실행
    Workbook_SheetActivate ActiveSheet
End Sub

Private Sub Workbook_SheetActivate(ByVal sh As Object)
    Call EnableChartEvents
End Sub

 

이제 그래프 막대를 더블클릭하면 마우스 좌표와 클릭한 ElementID, 데이터 시리즈 등을 표시해 줍니다.

 

Chart_Event_Sample.xlsm
0.04MB

 

아래 움짤은 피벗테이블에서 더블클릭하면 관련 세부자료가 나오듯이

피벗 차트에서도 막대 그래프를 더블클릭하면 세부 데이터를 보여주는 기능을 구현한 것입니다.

 

728x90