📊 AI와 비즈니스 - 엑셀
AI로 엑셀 피벗 테이블 마스터하기 - ChatGPT 데이터 분석 가이드
피벗 테이블 어렵다고요? AI가 단계별로 알려주는 대로 따라하면 데이터 분석 전문가가 될 수 있어요!
차트 자동 생성
숫자로 가득한 표만 봐서는 추세가 잘 안 보이죠. 매출이 올랐는지 내렸는지, 어떤 제품이 잘 팔리는지... 이런 걸 한눈에 파악하려면 차트가 필수예요.
하지만 차트 만들기도 은근 번거로워요. 어떤 차트 유형을 써야 할지 고민되고, 데이터 범위 선택하고, 색상 바꾸고, 레이블 추가하고... 손이 많이 가죠.
AI를 활용하면 차트 생성도 자동화할 수 있습니다. "이 데이터로 차트 만들어줘"라고 하면, AI가 상황에 맞는 차트 유형을 추천하고, VBA 코드까지 만들어줘요. 버튼 한 번만 누르면 차트가 뚝딱 생성됩니다.
이번 글에서는 AI로 차트를 자동 생성하는 방법을 알아봅니다. 어떤 상황에 어떤 차트가 적합한지부터, VBA로 자동 생성하는 코드까지 실전 예제와 함께 살펴볼게요.
1. 차트 유형 선택 가이드
AI 프롬프트
"다음 상황에 가장 적합한 차트 유형을 추천해주세요:
1. 월별 매출 추이 분석
2. 제품별 매출 비중
3. 지역별 매출 비교
4. 시간대별 고객 방문 패턴
5. 목표 대비 실적"
AI 추천 결과
1. 월별 매출 추이 → 꺾은선 그래프 (Line Chart)
- 시간에 따른 변화를 명확히 표현
2. 제품별 매출 비중 → 원형 차트 (Pie Chart)
- 전체에서 차지하는 비율 표시
3. 지역별 매출 비교 → 세로 막대 차트 (Column Chart)
- 항목 간 크기 비교에 효과적
4. 시간대별 방문 패턴 → 영역형 차트 (Area Chart)
- 시간대별 밀집도 표현
5. 목표 대비 실적 → 혼합형 차트 (Combo Chart)
- 막대(실적) + 선(목표)
2. VBA로 차트 자동 생성
월별 매출 추이 차트
AI 프롬프트:
"A열에 월(1월, 2월...), B열에 매출액이 있습니다.
이 데이터로 꺾은선 그래프를 자동 생성하는 VBA 코드를 만들어주세요.
차트 제목은 '2025년 월별 매출 추이'로 하고,
데이터 레이블도 표시해주세요."
AI 생성 VBA:
Sub 월별매출차트생성()
Dim ws As Worksheet
Dim chartObj As ChartObject
Dim lastRow As Long
Set ws = ThisWorkbook.Sheets("매출데이터")
' 마지막 행 찾기
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 기존 차트 삭제 (있다면)
For Each chartObj In ws.ChartObjects
If chartObj.Name = "매출추이차트" Then
chartObj.Delete
End If
Next
' 새 차트 생성
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range("D2").Left, _
Top:=ws.Range("D2").Top, _
Width:=500, _
Height:=300)
With chartObj.Chart
' 차트 유형 설정
.ChartType = xlLineMarkers
' 데이터 범위 설정
.SetSourceData Source:=ws.Range("A1:B" & lastRow)
' 차트 제목
.HasTitle = True
.ChartTitle.Text = "2025년 월별 매출 추이"
.ChartTitle.Font.Size = 14
.ChartTitle.Font.Bold = True
' 축 제목
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Text = "월"
.Axes(xlValue).HasTitle = True
.Axes(xlValue).AxisTitle.Text = "매출액 (원)"
' 데이터 레이블 표시
.SeriesCollection(1).HasDataLabels = True
.SeriesCollection(1).DataLabels.NumberFormat = "#,##0"
' 범례 표시
.HasLegend = True
.Legend.Position = xlLegendPositionBottom
' 그리드선 설정
.Axes(xlValue).HasMajorGridlines = True
.Axes(xlValue).HasMinorGridlines = False
End With
chartObj.Name = "매출추이차트"
MsgBox "차트가 생성되었습니다.", vbInformation
End Sub
3. 제품별 매출 비중 파이 차트
AI 프롬프트:
"제품명과 매출액 데이터로 파이 차트를 만들고,
각 조각에 제품명과 비율을 표시해주세요.
상위 5개만 표시하고 나머지는 '기타'로 묶어주세요."
AI 생성 VBA:
Sub 제품별비중차트()
Dim ws As Worksheet
Dim chartWs As Worksheet
Dim chartObj As ChartObject
Dim dataRange As Range
Dim lastRow As Long
Dim i As Long
Set ws = ThisWorkbook.Sheets("제품데이터")
' 데이터 정렬 (매출액 기준 내림차순)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
ws.Range("A1:B" & lastRow).Sort _
Key1:=ws.Range("B1"), _
Order1:=xlDescending, _
Header:=xlYes
' 상위 5개 + 기타 처리
If lastRow > 6 Then
Dim etcSum As Double
etcSum = Application.WorksheetFunction.Sum(ws.Range("B7:B" & lastRow))
ws.Range("A7").Value = "기타"
ws.Range("B7").Value = etcSum
ws.Range("A8:B" & lastRow).Delete Shift:=xlUp
lastRow = 7
End If
' 차트 생성
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range("D2").Left, _
Top:=ws.Range("D2").Top, _
Width:=400, _
Height:=400)
With chartObj.Chart
.ChartType = xlPie
.SetSourceData Source:=ws.Range("A1:B" & lastRow)
' 차트 제목
.HasTitle = True
.ChartTitle.Text = "제품별 매출 비중"
' 데이터 레이블 (제품명 + 비율)
.SeriesCollection(1).HasDataLabels = True
With .SeriesCollection(1).DataLabels
.ShowCategoryName = True
.ShowPercentage = True
.ShowValue = False
.Separator = vbNewLine
.Position = xlLabelPositionBestFit
.Font.Size = 10
End With
' 범례 숨김 (레이블에 이미 표시)
.HasLegend = False
' 색상 설정
For i = 1 To .SeriesCollection(1).Points.Count
.SeriesCollection(1).Points(i).Format.Fill.ForeColor.RGB = _
Choose(i, RGB(79, 129, 189), RGB(192, 80, 77), _
RGB(155, 187, 89), RGB(128, 100, 162), _
RGB(75, 172, 198), RGB(247, 150, 70))
Next i
End With
MsgBox "파이 차트가 생성되었습니다.", vbInformation
End Sub
4. 지역별 비교 막대 차트
AI 프롬프트:
"지역별 매출을 세로 막대 차트로 만들고,
목표치를 점선으로 표시해주세요.
목표 달성한 막대는 파란색, 미달은 빨간색으로 표시하세요."
AI 생성 VBA:
Sub 지역별비교차트()
Dim ws As Worksheet
Dim chartObj As ChartObject
Dim lastRow As Long
Dim i As Long
Dim targetValue As Double
Set ws = ThisWorkbook.Sheets("지역데이터")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
targetValue = ws.Range("D1").Value ' 목표치
' 차트 생성
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range("E2").Left, _
Top:=ws.Range("E2").Top, _
Width:=500, _
Height:=350)
With chartObj.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=ws.Range("A1:B" & lastRow)
' 차트 제목
.HasTitle = True
.ChartTitle.Text = "지역별 매출 실적"
' 축 제목
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Text = "지역"
.Axes(xlValue).HasTitle = True
.Axes(xlValue).AxisTitle.Text = "매출액 (백만원)"
' 데이터 레이블
.SeriesCollection(1).HasDataLabels = True
.SeriesCollection(1).DataLabels.NumberFormat = "#,##0"
' 각 막대 색상 설정 (목표 달성 여부)
For i = 1 To .SeriesCollection(1).Points.Count
If ws.Cells(i + 1, 2).Value >= targetValue Then
' 목표 달성 - 파란색
.SeriesCollection(1).Points(i).Format.Fill.ForeColor.RGB = RGB(79, 129, 189)
Else
' 목표 미달 - 빨간색
.SeriesCollection(1).Points(i).Format.Fill.ForeColor.RGB = RGB(192, 80, 77)
End If
Next i
' 목표선 추가
With .SeriesCollection.NewSeries
.Name = "목표"
.ChartType = xlLine
.Values = "=" & ws.Name & "!$D$1"
.AxisGroup = xlPrimary
.Format.Line.DashStyle = msoLineDash
.Format.Line.ForeColor.RGB = RGB(255, 0, 0)
.Format.Line.Weight = 2
End With
' 범례
.HasLegend = True
.Legend.Position = xlLegendPositionTop
End With
MsgBox "지역별 비교 차트가 생성되었습니다.", vbInformation
End Sub
5. 복합 차트 (실적 + 목표)
AI 프롬프트:
"월별 실적을 막대 차트로, 목표를 꺾은선으로 표시하는
복합 차트를 만들어주세요. 달성률도 보조 축에 표시하세요."
AI 생성 VBA:
Sub 실적목표복합차트()
Dim ws As Worksheet
Dim chartObj As ChartObject
Dim lastRow As Long
Set ws = ThisWorkbook.Sheets("월별실적")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 달성률 계산 (C열)
Dim i As Long
For i = 2 To lastRow
ws.Cells(i, 4).Formula = "=B" & i & "/C" & i & "*100"
Next i
' 차트 생성
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range("F2").Left, _
Top:=ws.Range("F2").Top, _
Width:=600, _
Height:=400)
With chartObj.Chart
' 데이터 범위 설정
.SetSourceData Source:=ws.Range("A1:D" & lastRow)
' 차트 제목
.HasTitle = True
.ChartTitle.Text = "월별 실적 vs 목표"
.ChartTitle.Font.Size = 14
' 시리즈 1: 실적 (막대)
.SeriesCollection(1).ChartType = xlColumnClustered
.SeriesCollection(1).Name = "실적"
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(79, 129, 189)
' 시리즈 2: 목표 (꺾은선)
.SeriesCollection(2).ChartType = xlLine
.SeriesCollection(2).Name = "목표"
.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(192, 80, 77)
.SeriesCollection(2).Format.Line.Weight = 3
.SeriesCollection(2).MarkerStyle = xlMarkerStyleCircle
' 시리즈 3: 달성률 (보조축 꺾은선)
.SeriesCollection(3).ChartType = xlLine
.SeriesCollection(3).Name = "달성률(%)"
.SeriesCollection(3).AxisGroup = xlSecondary
.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(155, 187, 89)
.SeriesCollection(3).Format.Line.Weight = 2
' 주 축 설정
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Text = "금액 (백만원)"
' 보조 축 설정
.Axes(xlValue, xlSecondary).HasTitle = True
.Axes(xlValue, xlSecondary).AxisTitle.Text = "달성률 (%)"
.Axes(xlValue, xlSecondary).MinimumScale = 0
.Axes(xlValue, xlSecondary).MaximumScale = 150
' 범례
.HasLegend = True
.Legend.Position = xlLegendPositionBottom
End With
MsgBox "복합 차트가 생성되었습니다.", vbInformation
End Sub
6. 동적 차트 (필터 연동)
AI 프롬프트:
"드롭다운에서 연도를 선택하면
해당 연도의 월별 매출 차트가 자동으로 업데이트되게 해주세요."
AI 생성 VBA:
' 워크시트 모듈에 추가
Private Sub Worksheet_Change(ByVal Target As Range)
' A1 셀(연도 선택) 변경 시
If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
Call 동적차트업데이트
End If
End Sub
Sub 동적차트업데이트()
Dim ws As Worksheet
Dim chartObj As ChartObject
Dim selectedYear As Integer
Dim dataRange As Range
Dim lastRow As Long
Set ws = ThisWorkbook.Sheets("대시보드")
selectedYear = ws.Range("A1").Value
' 선택된 연도 데이터 필터링
With ThisWorkbook.Sheets("원본데이터")
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
' 필터 적용
.Range("A1:C" & lastRow).AutoFilter _
Field:=1, _
Criteria1:=selectedYear
' 보이는 셀만 복사
.Range("B1:C" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
Destination:=ws.Range("E1")
End With
' 차트 업데이트
Set chartObj = ws.ChartObjects("동적차트")
lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row
chartObj.Chart.SetSourceData Source:=ws.Range("E1:F" & lastRow)
chartObj.Chart.ChartTitle.Text = selectedYear & "년 월별 매출 추이"
' 필터 해제
ThisWorkbook.Sheets("원본데이터").AutoFilterMode = False
End Sub
7. 대시보드 차트 세트
AI 프롬프트:
"경영진 대시보드에 필요한 4개 차트를 한 번에 생성해주세요:
1. 월별 매출 추이 (꺾은선)
2. 제품별 비중 (도넛)
3. 지역별 실적 (막대)
4. 주간 증감률 (영역형)"
AI 생성 VBA:
Sub 대시보드차트세트생성()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("대시보드")
' 기존 차트 모두 삭제
Dim obj As ChartObject
For Each obj In ws.ChartObjects
obj.Delete
Next
' 1. 월별 매출 추이
Call 차트생성_월별추이(ws, "B2", 300, 200)
' 2. 제품별 비중
Call 차트생성_제품비중(ws, "H2", 300, 200)
' 3. 지역별 실적
Call 차트생성_지역실적(ws, "B15", 300, 200)
' 4. 주간 증감률
Call 차트생성_주간증감(ws, "H15", 300, 200)
MsgBox "대시보드 차트가 생성되었습니다.", vbInformation
End Sub
Sub 차트생성_월별추이(ws As Worksheet, startCell As String, w As Long, h As Long)
Dim chartObj As ChartObject
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range(startCell).Left, _
Top:=ws.Range(startCell).Top, _
Width:=w, Height:=h)
With chartObj.Chart
.ChartType = xlLine
.SetSourceData Source:=Sheets("데이터").Range("A1:B13")
.HasTitle = True
.ChartTitle.Text = "월별 매출 추이"
.ChartTitle.Font.Size = 11
.HasLegend = False
End With
End Sub
Sub 차트생성_제품비중(ws As Worksheet, startCell As String, w As Long, h As Long)
Dim chartObj As ChartObject
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range(startCell).Left, _
Top:=ws.Range(startCell).Top, _
Width:=w, Height:=h)
With chartObj.Chart
.ChartType = xlDoughnut
.SetSourceData Source:=Sheets("데이터").Range("D1:E6")
.HasTitle = True
.ChartTitle.Text = "제품별 매출 비중"
.ChartTitle.Font.Size = 11
End With
End Sub
Sub 차트생성_지역실적(ws As Worksheet, startCell As String, w As Long, h As Long)
Dim chartObj As ChartObject
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range(startCell).Left, _
Top:=ws.Range(startCell).Top, _
Width:=w, Height:=h)
With chartObj.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=Sheets("데이터").Range("G1:H8")
.HasTitle = True
.ChartTitle.Text = "지역별 매출 실적"
.ChartTitle.Font.Size = 11
End With
End Sub
Sub 차트생성_주간증감(ws As Worksheet, startCell As String, w As Long, h As Long)
Dim chartObj As ChartObject
Set chartObj = ws.ChartObjects.Add( _
Left:=ws.Range(startCell).Left, _
Top:=ws.Range(startCell).Top, _
Width:=w, Height:=h)
With chartObj.Chart
.ChartType = xlAreaStacked
.SetSourceData Source:=Sheets("데이터").Range("J1:K53")
.HasTitle = True
.ChartTitle.Text = "주간 증감률"
.ChartTitle.Font.Size = 11
End With
End Sub
8. 스파크라인으로 간단한 시각화
AI 프롬프트:
"각 제품 옆에 최근 12개월 매출 추이를
작은 라인 차트(스파크라인)로 표시해주세요."
AI 생성 VBA:
Sub 스파크라인생성()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ThisWorkbook.Sheets("제품목록")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 기존 스파크라인 삭제
ws.Range("N2:N" & lastRow).SparklineGroups.Clear
' 각 행에 스파크라인 추가
For i = 2 To lastRow
ws.Range("N" & i).SparklineGroups.Add _
Type:=xlSparkLine, _
SourceData:=ws.Range("B" & i & ":M" & i).Address
Next i
' 스파크라인 스타일 설정
With ws.Range("N2:N" & lastRow).SparklineGroups(1)
.LineWeight = 1.5
.SeriesColor.Color = RGB(79, 129, 189)
' 최고점, 최저점 표시
.Points.Highpoint.Visible = True
.Points.Highpoint.Color.Color = RGB(0, 176, 80)
.Points.Lowpoint.Visible = True
.Points.Lowpoint.Color.Color = RGB(255, 0, 0)
End With
MsgBox "스파크라인이 생성되었습니다.", vbInformation
End Sub
9. 차트 자동 업데이트
AI 프롬프트:
"데이터가 추가되면 차트 범위가 자동으로 확장되게 해주세요."
AI 생성 방법:
' 방법 1: 동적 이름 정의 사용
' 수식 탭 > 이름 관리자 > 새로 만들기
' 이름: 동적매출데이터
' 참조 대상:
=OFFSET(매출!$A$1,0,0,COUNTA(매출!$A:$A),2)
' 차트 데이터 범위에 "=동적매출데이터" 입력
' 방법 2: 테이블 변환
Sub 데이터를테이블로변환()
Dim ws As Worksheet
Dim lastRow As Long
Dim tbl As ListObject
Set ws = ThisWorkbook.Sheets("매출")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 테이블 생성
Set tbl = ws.ListObjects.Add( _
xlSrcRange, _
ws.Range("A1:F" & lastRow), _
, xlYes)
tbl.Name = "매출테이블"
tbl.TableStyle = "TableStyleMedium2"
' 차트 데이터를 테이블로 연결
' 데이터가 추가되면 자동 확장
End Sub
10. 차트 내보내기
AI 프롬프트:
"모든 차트를 이미지 파일(PNG)로 저장해주세요."
AI 생성 VBA:
Sub 차트를이미지로저장()
Dim ws As Worksheet
Dim chartObj As ChartObject
Dim savePath As String
Dim chartName As String
savePath = ThisWorkbook.Path & "\차트이미지\"
' 폴더 생성
If Dir(savePath, vbDirectory) = "" Then
MkDir savePath
End If
' 모든 시트의 차트 저장
For Each ws In ThisWorkbook.Worksheets
For Each chartObj In ws.ChartObjects
chartName = ws.Name & "_" & chartObj.Name & ".png"
' PNG로 내보내기
chartObj.Chart.Export _
Filename:=savePath & chartName, _
FilterName:="PNG"
Next chartObj
Next ws
MsgBox "차트가 " & savePath & " 폴더에 저장되었습니다.", vbInformation
End Sub
마무리
AI로 차트 자동 생성:
- ✅ 적절한 차트 유형 자동 선택
- ✅ VBA로 반복 작업 자동화
- ✅ 동적 차트로 실시간 업데이트
- ✅ 대시보드 일괄 생성
다음 글에서는 데이터 중복을 찾아 정리하는 방법을 알아봅니다.