엑셀 지도 차트 만들기
COVID-19 코로나 지역별 실시간 발생 현황을 엑셀 지도 차트로 쉽고 빠르게 만드는 방법
이번 강의에서는 엑셀의 지도 차트 기능과 연결된 이미지 기법을 활용해 코로나19 시·도별 발생 현황 대시보드를 직접 제작하는 과정을 다룹니다. 중앙재난안전대책본부에서 제공하는 원본 데이터를 가공해 지도 차트로 시각화하고, 매크로로 지역별 레이블까지 한 번에 만드는 워크플로를 단계별로 익혀봅니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
강의 소개
이번 강의에서는 중앙재난안전대책본부에서 공개하는 코로나 바이러스 발생 현황 원본 데이터를 활용하여 대한민국 시·도별 코로나 발생 현황을 지도 차트로 시각화하는 방법을 알아봅니다. 엑셀 기본 기능만으로 중앙재난안전대책본부에서 제공하는 지도 차트 양식과 동일한 결과물을 제작할 수 있습니다.

본 강의의 지도 차트는 아래 링크를 참고하여 제작되었습니다.
지도 차트에 사용되는 코로나 바이러스 지역별 발생 현황 원본 데이터는 아래 링크에서 확인할 수 있습니다. 링크로 이동한 뒤 페이지에 표시된 표를 복사하여 예제파일 [Raw] 시트의 [시도별 발생동향] 표 위에 붙여넣으면 [데이터] 시트의 값이 자동으로 업데이트됩니다.

이번 강의에서 사용하는 지도 차트 기능은 엑셀 2019 이후 버전에서만 지원됩니다. 엑셀 2019 이전 버전을 사용한다면 이번 단계를 건너뛰고 다음 단계부터 진행합니다.
- 예제파일의 [데이터] 시트로 이동한 뒤 [B6:D23] 범위(시도명~누적환자)를 선택합니다. 이어서 [삽입] - [차트] - [추천 차트]를 클릭하거나 단축키 Alt - N - R로 추천 차트 대화상자를 실행합니다.

- 추천 차트 목록에서 '지도 차트'를 선택한 뒤 [확인] 버튼을 눌러 지도 차트를 생성합니다. 추천 차트 목록에 지도 차트가 보이지 않을 경우 [모든 차트] - [지도]로 이동하여 차트를 생성합니다.

- 차트 제목과 범례를 지워 차트를 간소화합니다. 이어서 차트의 지도 범위를 우클릭하여 [데이터 계열 서식]으로 이동한 뒤 [계열 색] - [분기 3색]을 선택합니다.

- 현재 데이터에서는 '대구'의 값이 6,930으로 월등히 높기 때문에 최댓값과 최솟값을 기준으로 차트 색상을 표시하면 대구 지역만 진하게 강조되는 문제가 발생합니다. 따라서 전체 분포를 자연스럽게 표현할 수 있도록 최댓값·중간값·최솟값을 직접 지정합니다.
최소값 : [숫자] 50
중간값 : [숫자] 800
최대값 : [숫자] 2000

- 최댓값은 진한 파란색, 중간값은 하늘색, 최솟값은 옅은 회색으로 채우기 색상을 변경합니다.

- 지도 차트가 완성되었습니다. 완성된 차트를 잘라낸 뒤 [코로나 대시보드] 시트로 붙여넣기합니다. 기존 대시보드 시트에 있는 안내 문구와 물음표 아이콘을 우클릭한 뒤 [맨 앞으로 가져오기]를 선택해 차트 위에 표시되도록 위치를 조정합니다.

- 차트의 윤곽선을 제거하면 대시보드 위에 지도 차트 삽입이 완료됩니다.

엑셀 2019 이전 버전에서는 지도 차트 기능을 지원하지 않습니다. 따라서 2019 이전 버전 사용자는 [코로나 대시보드] 시트에 미리 준비된 지도 그림 이미지를 잘라낸 뒤 같은 위치에 붙여넣어 지도 차트 대용으로 활용합니다.

- 시트 목록 오른쪽의 (+) 더하기 버튼을 클릭하거나 단축키 Shift + F11키로 새 시트를 추가합니다.

- [B2:S4] 범위를 선택한 뒤 아래 수식을 입력하고 Ctrl + Shift + Enter로 배열 수식을 입력합니다. (Microsoft 365 사용자는 B2 셀을 선택한 뒤 아래 수식을 Enter로 입력하면 파란색 테두리와 함께 배열 결과가 자동으로 반환됩니다.)

- 각 범위에 폰트를 깔끔하게 적용한 뒤 범위 채우기 색상을 흰색으로 변경합니다. 강의에서는 Noto Sans(본고딕) 폰트를 사용했습니다.
- [B4:S4] 범위(신규 확진자 수)를 선택한 뒤 [우클릭] - [셀 서식]을 선택하거나 단축키 Ctrl + 1을 눌러 셀 서식 대화상자를 실행합니다. [사용자 지정]을 선택한 뒤 형식 입력란에 아래 서식을 복사·붙여넣기하고 [확인]을 눌러 셀 서식을 적용합니다.
(+0);;(0);

- 연결된 이미지로 만들 지역별 발생 현황 레이블이 완성되었습니다. 첫 번째 값인 '대구' 범위를 선택한 후 Ctrl + C 로 복사합니다.

- B6 셀을 선택한 뒤 우클릭하여 [선택하여 붙여넣기] - [연결된 그림]으로 삽입하면 복사한 범위가 이미지 형태로 삽입됩니다. 이 과정을 18번 반복해 모든 지역의 연결된 이미지를 만들 수도 있지만, 반복 작업을 최소화하기 위해 아래 매크로를 사용하여 연결된 이미지를 한 번에 삽입할 수 있습니다.

- 이전 단계에서 삽입했던 연결된 그림을 모두 삭제합니다. 화면 상단의 [개발 도구] - [Visual Basic]을 클릭하거나 단축키 Alt + F11을 눌러 매크로 편집기를 실행합니다.

- [삽입] - [모듈]을 선택하여 새 모듈을 추가한 뒤 아래 명령문을 복사하여 붙여넣습니다.
'---------- 2024년 8월, M365 기준 클립보드 오류를 수정한 버전입니다 --------------- #If VBA7 Then Private Declare PtrSafe Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _ ByVal iChildStart As Long, ByVal cChildren As Long, _ ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long Public Const myVBA7 As Long = 1 #Else Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _ ByVal iChildStart As Long, ByVal cChildren As Long, _ ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long Public Const myVBA7 As Long = 0 #End If Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Sub ClearClipboard() ' 클립보드 열기 If OpenClipboard(0&) Then ' 클립보드 비우기 EmptyClipboard ' 클립보드 닫기 CloseClipboard End If End Sub Sub CreateLinkedImage() Dim rng As Range Dim WS As Worksheet Dim sFormula As String Dim pic As Shape Dim j As Long: j = 1 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set WS = ActiveSheet Set rng = WS.Range("B2").CurrentRegion '<- 연결된 이미지를 생성할 데이터가 시작되는 셀 주소를 입력하세요 With WS For i = rng.Column To rng.Column + rng.Columns.Count - 1 .Range(.Cells(rng.Row, i), .Cells(rng.Row + rng.Rows.Count - 1, i)).Copy .Cells(rng.Row + rng.Rows.Count + 1, i).Select .Pictures.Paste Link:=True Set pic = WS.Shapes(j): j = j + 1 Application.CutCopyMode = False ClearClipboard EvRClearOfficeClipBoard sFormula = pic.DrawingObject.Formula .Shapes.Range(Array(pic.Name)).Select Selection.Formula = "='" & WS.Name & "'!" & Trim(sFormula) Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub Public Sub EvRClearOfficeClipBoard() Dim cmnB, IsVis As Boolean, j As Long, Arr As Variant Arr = Array(4, 7, 2, 0) '4 and 2 for 32 bit, 7 and 0 for 64 bit Set cmnB = Application.CommandBars("Office Clipboard") IsVis = cmnB.Visible On Error Resume Next If Not IsVis Then cmnB.Visible = True DoEvents End If For j = 1 To Arr(0 + myVBA7) AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, cmnB, 1 Next cmnB.accDoDefaultAction CLng(Arr(2 + myVBA7)) Application.CommandBars("Office Clipboard").Visible = IsVis End Sub
- 매크로 편집기 상단의 재생 버튼을 클릭하거나 단축키 F5키를 눌러 명령문을 실행하면 각 지역별 발생 현황 레이블을 한 번에 생성할 수 있습니다.

- 생성된 연결 이미지를 모두 선택하여 잘라낸 뒤 [코로나 대시보드] 시트에 붙여넣기합니다.

- 각 지역에 맞춰 레이블을 하나씩 이동합니다. 해외 감염자는 대시보드 아래쪽 도형 위에 배치합니다.

- 감염자 수에 따라 레이블 크기를 조절하면 대한민국 코로나 발생 현황 지도 차트가 완성됩니다.

실무로 물품 지역별 분배(안) 작성하면서 매번 엑셀로 계산해서
한글로 편집하여 표로 완성 했었는데....
이제 한번(엑셀)에 작성 도전해보겠습니다.
매크로도 점점 흥미가 생기는데 아직은 어렵기만 하네요.
쉽고 명쾌한 강의와 예제파일 항상 감사합니다.
엑셀365 추천 차트에 한국이 나오지 않는데, 어떻게 하나요?
네 2019 이전버전(맵차트가 지원되지 않는 버전) 에서는
배경그림(지도)와 데이터 범위를 직접 변경해주셔야 합니다.
파일이 잘못 업로드 되어 있었네요 ㅜㅜ
방금 파일을 수정해드렸으니 다시 확인해보시겠어요?
화면설명시에 '시/도' 까지만 가능하고 '서울시 ㅇㅇ구'는 안된다고 하셨는데요.
엑셀 도움말에서 보면 '시/도','군'으로 '경기도','가평/연천/양편' 등으로 설명이 되어있긴한데.. 실제로 엑셀에서 해보면 도움말과 달리 에러가 나네요. ( '시/도','군','우편번호' 등 지도 정보가 필요... )
'군'이 되는 거라면, '군/구' 까지 되야 맞을 거 같은데...
혹시 '경기도' 이하의 '화성시, 안양시' 등의 레벨도 안되는 걸까요??
제가 입력을 제대로 못해서 그런건지...
맵 차트는 시/도까지만 가능합니다.
현재 군단위는 지원되지 않는 것으로 알고 있습니다.
오류메시지입니다.
'1004' 런타임 오류가 발생하였습니다.
Picture 클래스 중 Formula 속성을 설정할 수 없습니다.
사용하고 계신 엑셀 버전이 어떻게 되시나요?
2010 이전 버전일 경우 말씀하신 오류가 발생할 수 있습니다.
엑셀 버전을 한번 확인해보세요.
윈도우 버전의 M365 라면 오류가 발생하지 않아야 합니다.
혹시 Mac을 사용중이실까요?
오류가 발생할 경우, [디버깅] 버튼을 클릭하여 오류가 발생한 지점을 확인할 수 있습니다.
오류가 발생한 지점과 오류를 스크린샷과 함께 한번 첨부해주시겠어요? :) 확인 후 답변 드리겠습니다.
감사합니다.
해당 오류가 발생한 지점 앞에, 아래 코드를 추가한 후 사진 이름과 반환된 수식이 올바른지 한번 확인해보시길 바랍니다. :)
하나 잘 되지 않는 것이 생겨서 질문 드립니다
매크로 사용해서 이미지 까지는 어찌저찌 만들었는데,
그 이미지를 잘라내서 대시보드 시트에 붙여넣기 하면은 지역별 이미지가 나오는게 아니라
첨부한 이미지처럼 뜨는게 뭐가 문제인걸까요?
그림으로 봤을 때, 시트의 눈금선이 연결되어 표시되는 것 같습니다.
이미지의 원본이 있는 시트에서, [보기] - [눈금선]을 체크해제해서 눈금선을 한번 숨겨보시겠어요? :)
감사합니다.