엑셀 VBA 차트 그리기
VBA를 활용하여 차트 만들기
엑셀을 사용하면, 엑셀 차트 그리기 기초에서 살펴본 것처럼 삽입 -> 차트 메뉴를 통해서 직접 차트를 그리는 것이 아니라 VBA를 통해서 차트를 생성하는 것도 가능하다. VBA를 통해서 차트를 만들면, 여러 데이터를 조합한 차트를 만들거나 동적인 데이터 변경에 대응이 가능하다는 장점이 있다.
차트는 아래 그림 1과 같이 데이터 범위 설정, 차트 생성, 상세 설정이라는 세 가지 단계를 순차적으로 거치면 만들 수 있다.
데이터 범위 설정
먼저 아래 그림 2와 같이 엑셀 차트 그리기 기초에서 했던 "차트 데이터 범위" 설정 작업을 해야 한다.
차트의 데이터 범위는 Range 객체로 정의해야 하는데, "데이터"를 Range로 선언하고 작업을 수행하면 된다. 데이터시트를 선언한 뒤 데이터시트에서 가져올 데이터의 범위를 정해서 Range로 선언한 "데이터" 변수에 넣어주면 데이터 범위 설정은 완료된다.
Sub 차트만들기()
'데이터 Range로 선언
Dim 데이터 As Range
' 작업할 워크시트 설정
Set 데이터시트 = ThisWorkbook.Sheets("데이터 시트 명")
' 데이터 범위 설정
Set 데이터 = 데이터시트.Range("차트의 대상이 되는 데이터 범위")
End Sub
차트생성
차트의 구조는 아래 그림 3으로 이해하면 된다. 차트 객체에 차트가 종속되어 있고, 그 차트가 데이터, 축, 차트제목 등을 속성으로 가지고 있다.
따라서 VBA 코드에서도 차트객체와 그에 속한 차트를 정의하면 된다. 추가적으로 데이터를 가져오는 시트와 차트를 그릴 시트가 다르다면 추가적으로 작업시트를 정의해 주는 작업도 필요하다. 정의한 작업시트에 차트객체를 set 하고 차트까지 만들면 차트 생성작업은 완료된다.
Sub 차트만들기()
'차트객체 ChartObject로 정의, 차트 chart로 정의 , 데이터 Range로 정의
Dim 차트객체 As ChartObject
Dim 차트 As chart
Dim 데이터 As Range
' 작업할 워크시트 설정
Set 작업시트 = ThisWorkbook.Sheets("그래프 그릴 시트 명")
Set 데이터시트 = ThisWorkbook.Sheets("데이터 시트 명")
' 데이터 범위 설정
Set 데이터 = 데이터시트.Range("차트의 대상이 되는 데이터 범위")
' 차트 객체 생성(크기 설정)
Set 차트객체 = 작업시트.ChartObjects.Add(Left:=100, Top:=50, Width:=700, Height:=300)
Set 차트 = 차트객체.chart
End Sub
차트 상세 설정
이제 세부적인 차트 설정만 해주면 된다. 차트 데이터를 설정해 주고(SetSourceData), 차트 종류를 설정해 주고(ChartType), 그 외에 축, 범례 등을 설정한다. 차트 만들기 VBA 코드는 결국 아래와 같은 구조를 가진다.
Sub 차트만들기()
'차트객체 ChartObject로 정의, 차트 chart로 정의 , 데이터 Range로 정의
Dim 차트객체 As ChartObject
Dim 차트 As chart
Dim 데이터 As Range
' 작업할 워크시트 설정
Set 작업시트 = ThisWorkbook.Sheets("그래프 그릴 시트 명")
Set 데이터시트 = ThisWorkbook.Sheets("데이터 시트 명")
' 데이터 범위 설정
Set 데이터 = 데이터시트.Range("차트의 대상이 되는 데이터 범위")
' 차트 객체 생성(크기 설정)
Set 차트객체 = 작업시트.ChartObjects.Add(Left:=100, Top:=50, Width:=700, Height:=300)
Set 차트 = 차트객체.chart
' 차트 데이터 설정
차트.SetSourceData Source:=데이터
' 차트 종류 설정
차트.ChartType = xlLine ' 2차원 선형 차트
' 차트 제목 설정
차트.HasTitle = True
차트.ChartTitle.Text = "차트 제목"
' 축 제목 설정
With 차트.Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X축 데이터 명"
End With
With 차트.Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "Y축 데이터 명"
End With
' 범례 표시 설정
차트.FullSeriesCollection(1).Name = "범례로 데이터 명 설정"
차트.HasLegend = True
End Sub
코스피 종가 데이터 그래프 그리기
데이터 수집
KRX 정보데이터시스템( http://data.krx.co.kr)에서 지수-> 주가지수-> 개별지수 시세추이를 통해서 코스피 지수 등의 시계열 자료를 받을 수 있다.
위 그림 4에 표시한 대로 코스피 지수의 2023-12-06 ~ 2024-12-06까지의 시계열 자료를 뽑으면 아래 그림 5와 같은 데이터를 뽑아낼 수 있다. 데이터를 아래 그림 5와 같이 "코스피"시트에 저장하고, 그래프 작업을 할 "그래프" 시트를 추가적으로 만든다.
차트 그리기 VBA코드
먼저 "그래프"라는 이름의 작업시트와 "코스피"라는 이름의 데이터시트를 정의한다. "코스피"시트에서 A컬럼의 일자를 가로축, B컬럼의 코스피 종가를 세로축으로 쓸 것이기 때문에 "A1:B246"까지의 범위를 데이터로 잡는다.(다운로드한 데이터가 총 246 행까지 이다.) "그래프"시트(현재시트)에 차트 객체를 정의하고, 순차적으로 차트 데이터설정, 종류설정, 축 설정 등의 과정을 거치면 차트가 완성된다.
Sub 차트만들기()
Dim 차트객체 As ChartObject
Dim 차트 As chart
Dim 데이터 As Range
' 작업할 워크시트 설정
Set 현재시트 = ThisWorkbook.Sheets("그래프")
Set 코스피시트 = ThisWorkbook.Sheets("코스피")
' 기존 차트 삭제
For Each 차트객체 In 현재시트.ChartObjects
차트객체.Delete
Next
' 데이터 범위 설정
Set 데이터 = 코스피시트.Range("A1:B246") ' A열: 범주, B열: 값
' 차트 객체 생성
Set 차트객체 = 현재시트.ChartObjects.Add(Left:=100, Top:=50, Width:=700, Height:=300)
Set 차트 = 차트객체.chart
' 차트 데이터 설정
차트.SetSourceData Source:=데이터
' 차트 종류 설정
차트.ChartType = xlLine ' 2차원 선형 차트
' 차트 제목 설정
차트.HasTitle = True
차트.ChartTitle.Text = "코스피 종가"
' 축 제목 설정
With 차트.Axes(xlCategory, xlPrimary)
.HasTitle = True '축 이름 표시 설정
.AxisTitle.Text = "일자" '축 명 설정
.TickLabelSpacing = 100 '축 간격 설정
.AxisTitle.Top = .AxisTitle.Top + 10 '축 이름과 축 사이의 간격 설정
End With
With 차트.Axes(xlValue, xlPrimary)
.HasTitle = True '축 이름 표시 설정
.AxisTitle.Text = "코스피종가" '축 명 설정
.AxisTitle.Orientation = xlHorizontal ' 축 제목을 가로로 표시
.AxisTitle.Left = .AxisTitle.Left - 10 '축 이름과 축 사이의 간격 설정
End With
' 범례 표시 설정
차트.FullSeriesCollection(1).Name = "코스피종가"
차트.HasLegend = True
With 차트.Legend
.Position = xlLegendPositionTop ' 범례를 상단에 배치
.Top = 차트.PlotArea.Top + 10 ' 범례를 그래프 내부에 맞춤
.Left = 차트.PlotArea.Left + 차트.PlotArea.Width - .Width - 20 ' 그래프 우측 상단에 위치
End With
' 차트 여백 없애기 (우측 여백 조정)
With 차트.PlotArea
.Width = 차트.ChartArea.Width - 50 ' 여백 크기 조정
End With
End Sub
엑셀 VBA 실행 버튼 만들기(Active X 컨트롤 삽입)을 참조하여 "그래프"텝에 위 코드를 실행하는 버튼을 만들면 그림 6처럼 구현된 엑셀파일을 만들 수 있다.