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, 데이터 시리즈 등을 표시해 줍니다.
아래 움짤은 피벗테이블에서 더블클릭하면 관련 세부자료가 나오듯이
피벗 차트에서도 막대 그래프를 더블클릭하면 세부 데이터를 보여주는 기능을 구현한 것입니다.
728x90
'Excel - VBA' 카테고리의 다른 글
Outlook 없이 메일을 발송하기 (CDO.Message) (0) | 2023.08.04 |
---|---|
Outlook을 이용하여 Email 발송하기 (0) | 2023.08.03 |
특정일이 공휴일이면 이전/이후의 근무일 찾기 FindWorkDay (0) | 2023.07.27 |
대량의 목록을 한 번에 VLOOKUP 조회하는 mass VLOOKUP (0) | 2023.07.26 |
Naver 파파고 API를 이용한 번역함수 만들기 (0) | 2023.07.11 |