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
'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 |