엑셀VBA

엑셀 VBA 차트 그리기

엑셀로투자자 2024. 12. 14. 14:53
반응형

VBA를 활용하여 차트 만들기

엑셀을 사용하면, 엑셀 차트 그리기 기초에서 살펴본 것처럼 삽입 -> 차트 메뉴를 통해서 직접 차트를 그리는 것이 아니라 VBA를 통해서 차트를 생성하는 것도 가능하다. VBA를 통해서 차트를 만들면, 여러 데이터를 조합한 차트를 만들거나 동적인 데이터 변경에 대응이 가능하다는 장점이 있다. 

차트는 아래 그림 1과 같이 데이터 범위 설정, 차트 생성, 상세 설정이라는 세 가지 단계를 순차적으로 거치면 만들 수 있다. 

그림1: 차트만들기 순서

데이터 범위 설정

먼저 아래 그림 2와 같이 엑셀 차트 그리기 기초에서 했던 "차트 데이터 범위" 설정 작업을 해야 한다.

그림2: 엑셀 차트 그리기 데이터 범위 설정

차트의 데이터 범위는 Range 객체로 정의해야 하는데, "데이터"를 Range로 선언하고 작업을 수행하면 된다. 데이터시트를 선언한 뒤 데이터시트에서 가져올 데이터의 범위를 정해서 Range로 선언한 "데이터" 변수에 넣어주면 데이터 범위 설정은 완료된다.

Sub 차트만들기()
    '데이터 Range로 선언
    Dim 데이터 As Range

    ' 작업할 워크시트 설정
    Set 데이터시트 = ThisWorkbook.Sheets("데이터 시트 명")

    ' 데이터 범위 설정
    Set 데이터 = 데이터시트.Range("차트의 대상이 되는 데이터 범위")
End Sub

 

차트생성

차트의 구조는 아래 그림 3으로 이해하면 된다. 차트 객체에 차트가 종속되어 있고, 그 차트가 데이터, 축, 차트제목 등을 속성으로 가지고 있다.

그림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: KRX정보시스템에서 데이터 입수

위 그림 4에 표시한 대로 코스피 지수의 2023-12-06 ~ 2024-12-06까지의 시계열 자료를 뽑으면 아래 그림 5와 같은 데이터를 뽑아낼 수 있다. 데이터를 아래 그림 5와 같이 "코스피"시트에 저장하고, 그래프 작업을 할 "그래프" 시트를 추가적으로 만든다.

그림5: KRX 데이터 정리

차트 그리기 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처럼 구현된 엑셀파일을 만들 수 있다.

그림6: 코스피 종가 데이터 차트 그리기
241213_코스피종가데이터_그래프그리기.xlsm
0.05MB

반응형