• 최초 작성일: 2000-12-19
  • 최종 수정일: 2026-09-30
  • 조회수: 18 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 빛은 어둠을 만들고 어둠은 빛을 드러냅니다: 중간이 끊어진 차트

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

제목이 약간 특이하지요? ^^ 왜 이런 제목을 붙였는지 아래의 메일들을 보시면 이해가 되실 것입니다. (참고로 이 제목은 신영복님의 글 중에서 인용한 것입니다)

이번 강좌의 배경이 된 메일 두 통을 소개합니다.

메일 하나

예산 집행 실적을 정리하며 그래프를 그리는데, 다른 항목에 비해 터무니없이 높은 수치를 보이는 계정이 몇몇 있다고 합니다. 그 계정의 막대를 원하는 만큼 잘라내고 거기에 별도의 표시를 해 주고 싶은데, 예전에 어느 책에서 자른 부위에 물결표시가 되어 있는 것을 본 기억이 있으나 해답을 찾지 못했다는 질문입니다.

메일 두울

세로 막대 차트에서 한 개의 값이 다른 것에 비해 너무 길어서 나머지 막대가 작아져 잘 보이지 않는다는 질문입니다. 예를 들어 a의 성적이 10점, b가 20점, c가 150점이라면 10단위로 표시했을 때 보기가 좋지 않고 공간도 많이 차지합니다. 그래서 y축을 10, 20, 30까지 표시한 뒤 중간은 물결표시로 생략하고, 다시 100, 110, … 150부터 시작할 수는 없느냐, 엑셀로 불가능하다면 다른 프로그램이라도 소개해 달라는 내용입니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

빛은 어둠을 만들고 어둠은 빛을 드러냅니다: 중간이 끊어진 차트

핵심 요약: 중간이 끊어진 차트 만들기

축 범위를 달리한 두 차트를 그림 파일로 내보내 유저폼의 이미지 컨트롤 두 개에 위아래로 불러오면 중간이 생략된 것처럼 보입니다.

  • 1단계: 같은 소스 데이터로 두 개의 차트를 작성하고 크기를 맞춥니다.
  • 2단계: 각 차트의 Axes(xlValue) 최소·최대값을 다르게 설정합니다.
  • 3단계: Chart.Export로 GIF를 만들고 이미지 컨트롤의 Picture에 LoadPicture로 불러옵니다.

Step 1: 결과 미리 보기

Excel에서는 불가능하다면 다른 프로그램이라도 소개해 달라고 하셨는데… Excel로 안되는데 그것을 해결해 줄 수 있는 것이 있을까 하는 생각이 듭니다. ^^; 다른 프로그램에 눈을 돌리시기 전에 Excel 상에서 충분히 가능하다는 것을 보여 드리지요. 아래 버튼을 누르세요.

시트에는 원래의 전체 차트가 있고, 버튼을 누르면 아래쪽 구간(작은 값)과 위쪽 구간(큰 값)을 각각 다른 축 범위로 내보낸 그림 두 장을 유저폼에서 위아래로 붙여 하나의 끊어진 차트처럼 보여 줍니다.

피사체의 형상을 있는 그대로 담아내는 것이 사진입니다. 만약 여기에 어떤 인공적인 요소가 가미된다면 그것은 더 이상 사진이 아닐 것입니다. "합성사진도 사진이다!" 라고 끝까지 박박(?) 우기시는 분이 있다면 더 이상 할 말은 없어집니다만서도… ^^

그래프도 마찬가지입니다. 실제의 데이터를 보기 쉽도록 그림의 형태로 표시한 것이 그래프입니다. 빛이 있어서 어둠이 대비가 되고 어둠이 있어 빛의 소중함을 깨닫게 되는 것처럼 숫자와 그림은 서로 별개의 것이 아닙니다(그래서 이 강좌의 제목이 "빛은 어둠을 만들고 어둠은 빛을 드러냅니다" 이지요 ^^).

Step 2: 소스 데이터와 두 개의 차트 만들기

(1) 일단 그래프를 작성할 소스 데이터를 만듭니다. 그리고 그래프를 작성하실 때에는 두 그래프의 크기를 비슷하게 맞추어 주시기 바랍니다.

지점명매출액
동서울78,924
남서울9,850
부산82,000
대구74,287
대전11,500
광주79,520

(2) 이제 이 소스테이블을 가지고 두 개의 차트를 작성합니다.

이 소스 테이블로 아래쪽 구간용 차트(그림 1)와 위쪽 구간용 차트(그림 2) 두 개를 작성합니다.

차트를 작성하실 때, 중간정도의 매출액을 기준으로 삼아서, 하나는 그 이상의 것을, 다른 하나는 그 미만의 것을 기준으로 작성을 합니다. 그 이외의 세부적인 것은 VBA로 제어를 할 수 있습니다.

그런데 Chart Object는 다른 오브젝트에 비해 속성이 많으므로 웬만한 변경사항 정도는 워크시트 상에서 작업해 주시는 것이 VBA로 코딩을 할 때 좀더 간결하게 코드를 작성할 수 있는 한가지 방법입니다.

Step 3: 유저폼 만들기

(3) VB Editor 상태에서 유저폼을 하나 삽입하고 두 개의 이미지 컨트롤을 적당한 위치에 그려 넣습니다. 이것도 코딩시에 위치와 크기를 조절하므로 현재 상태에서 세밀한 크기까지는 신경쓰지 않으셔도 됩니다.

이미지 컨트롤 두 개를 배치한 빈 유저폼
아이엑셀러

Step 4: 메인 프로시저 작성하기

(4) 이번에는 일반 모듈시트를 하나 삽입하고 아래의 코드를 작성합니다.

Sub DrawSeparateChart()
    With [Source]
        .Columns(1).Name = "지점명"
        .Columns(2).Name = "매출액"
    End With
    '//새로운 것이 하나 나왔지요? [Source]라고 한 것은 Range("Source")를 달리 표현한
    '//것입니다. 이렇게 하면 코드는 좀더 단순해지는 반면, 알아보기가 약간 난해해지는(?)
    '//경향이 있습니다. 편한 방법을 사용하세요.

    '//Source라고 지정한 영역의 첫번째 컬럼에는 "지점명", 두번째 컬럼에는 "매출액"이라는
    '//범위명을 지정해 줍니다.

    Call DrawBottom
    Call DrawTop
    MyChart.Show
    '//DrawBottom, DrawTop 이라는 프로시저를 차례로 호출해서 실행시킨 다음 MyChart라는
    '//유저폼을 화면상에 표시토록 합니다.

End Sub

Step 5: 아래쪽 구간 그림 만들기(DrawBottom)

(5) DrawBottom 프로시저, 즉 그래프의 아래쪽 영역을 그림파일로 Exporting하는 프로시저입니다. 차트를 그림파일로 만드는 방법, 유저폼에 차트를 표시하는 방법 등에 대해서는 VB0046, 47 강좌에서 자세히 다루었으므로 '그런게 있었던가?' 하는 생각이 드는 분은 다시 살펴보고 오시기 바랍니다.

Exceller의 강좌를 들으시는, 아니 보시는 분 중에 '이 많은 걸 언제 다 보나!'하는 생각에 한숨이 나온다는 분이 계십니다. 그리고 모든 강좌를 자신의 PC에 죄다 다운받아 두고서 나중에 하나씩 볼려고 한다는 분도 계십니다.

강좌 순서에 구애받지 말고 보고싶은 것부터 아무거나 하나씩, 시간 날 때마다 보시는 것이 좋습니다. 그리고 몇 백개나 되는 강좌 파일을 한꺼번에 모조리 다운받아 놓는 것보다는 그때 그때 필요한 것만 내려받아 살펴보시는 것이 훨씬 좋을 것이라고 생각됩니다. Exceller의 성품상(^^) 예전 강좌 파일들을 다른 곳에 옮기거나 다운을 못하게 막거나 하는 등의 행동은 절대 않을 것이므로…

Sub DrawBottom()
    Dim strFile As String
    Dim intGap As Long
    Dim intMax As Long
    Dim intMin As Long
    intMax = 13000
    intMin = 10000
    intGap = intMax - intMin
    '//등장인물과 배역을 지정합니다. 여기서 intMax와 intMin은 그래프의 최대값과 최소값을
    '//지정해 주기 위한 변수입니다.

    With Sheets("Preface").ChartObjects(1).Chart.Axes(xlValue)
        .MinimumScale = intMin
        .MaximumScale = intMax
        .MajorUnit = Application.Round(intGap / 3, 0)
        .CrossesAt = intMin
    End With
    '//두 개의 차트 중 위에 있는 차트에 대해 최소값, 최대값, 눈금, 항목이 교차하는 지점 등을
    '//설정합니다. 차트 오브젝트는 다른 오브젝트에 비해 다양한 속성값을 가지고 있습니다.
    '//위의 속성들에 대해 도움말을 찾아보시기 바랍니다.

    With Sheets("Preface").ChartObjects(1).Chart
        .Parent.Width = 350
        .Parent.Height = 130
        strFile = ThisWorkbook.Path & Application.PathSeparator & "Bottom.GIF"
        .Export Filename:=strFile, filtername:="GIF"
        '//현재 차트의 너비와 높이를 지정해 준 다음 차트를 그림파일로 내보내는(Exporting)
        '//과정입니다. 여기서 Parent 속성은 지정한 개체의 부모(상위) 개체를 되돌려주는
        '//프로퍼티(속성) 입니다. 테스트를 한번 해보고 넘어 갈까요?

        '//이제 Parent 속성에 대해 확실히 아시겠지요? 코드는 모듈시트를 참고하세요.

    End With
    With MyChart.imgBottom
        .Left = 4
        .Height = 130
        .Width = 300
        .Picture = LoadPicture(strFile)
    End With
    '//이제 작성된 그림파일을 크기와 여백 등을 설정하여 유저폼으로 다시 불러옵니다.
    '//유저폼으로 불러올 때에는 당연히 아래 부분에 있는 이미지의 위치로 읽어들여야
    '//겠지요? 그래프의 아래쪽 영역이니까요!

End Sub

Step 6: 위쪽 구간 그림 만들기(DrawTop)

(5) 이번에는 그래프의 아래쪽 영역을 그림파일로 만드는 DrawTop 프로시저를 작성합니다. DrawBottom이나 거의 비슷합니다.

Sub DrawTop()
    Dim strFile As String
    Dim intGap As Long
    Dim intMax As Long
    Dim intMin As Long
    intMax = Application.Max([매출액])
    intMin = 70000
    intGap = intMax - intMin
    '//여기서는 그래프의 최소값과 최대값을 높게 지정합니다. Application.Max([매출액])은
    '//Application.Max(Range("매출액")과 같은 의미입니다.

    '//나머지 부분은 위에서 설명드린 DrawBottom과 거의 같을 것입니다. 다만 차트의 위쪽
    '//부분으로 그림파일을 만들어야 하므로 2번째 차트오브젝트, 즉 ChartObjects(2)를
    '//작업대상으로 한다는 점이 다를 뿐이지요.

    '//차트 오브젝트에 딸려있는 그밖의 속성들은 모두 생략을 하였습니다. "매크로 기록하기"
    '//기능을 사용해서 어떤 속성이나 방법들이 있는지 잘 정리해 두시기 바랍니다.

    With Sheets("Preface").ChartObjects(2).Chart.Axes(xlValue)
        .MinimumScale = intMin
        .MaximumScale = intMax
        .MajorUnit = 3000
    End With

    With Sheets("Preface").ChartObjects(2).Chart
        strFile = ThisWorkbook.Path & Application.PathSeparator & "Top.GIF"
        .Export Filename:=strFile, filtername:="GIF"
    End With

    With MyChart.imgTop
        .Left = 4
        .Height = 130
        .Width = 300
        .Picture = LoadPicture(strFile)
    End With
End Sub

Chart.Export로 GIF를 내보내 LoadPicture로 불러오는 방식은 유저폼의 이미지 컨트롤에 차트를 표시하는 전통적인 방법입니다. 유저폼에는 파일 경로가 필요하므로 저장 위치에 쓰기 권한이 있어야 합니다. 또한 요즘 버전의 엑셀에서는 축 범위를 나눈 보조 축이나 축 나누기를 이용한 방법도 자주 사용됩니다.

마무리

차트를 두 부분으로 나누어서 그림파일로 만든 다음, 이것을 다시 불러와서 하나로 합친다는 점이 중요합니다. 코드 자체는 대부분 다루었던 내용들이므로 생소하거나 어렵지는 않을 것입니다.

어떤 일을 할 때 시나리오를 잘 짜는 것이 중요합니다. 서울로 가는 길은 많습니다. 주어진 자원과 시간을 어떻게 여하히 조합하여 ROI를 최소화하느냐 하는 것이 관건이지요.

다음 시간에…

정리 — 끊어진 차트 핵심

구분 사용한 코드 역할
범위명 지정 [Source].Columns(1).Name [Source]는 Range("Source")의 약식 표기
축 범위 Axes(xlValue).MinimumScale/MaximumScale 구간별 축 설정
그림 내보내기 .Export Filename:=strFile, filtername:="GIF" 차트를 GIF 파일로 저장
그림 표시 .Picture = LoadPicture(strFile) 이미지 컨트롤에 표시
부모 개체 .Parent.Width / .Parent.Height 차트 크기 지정

자주 묻는 질문 (FAQ)

Q1. 엑셀 차트의 중간을 생략할 수 있나요?

차트 자체에는 축 나누기 기능이 없어서, 축 범위를 달리한 두 차트를 그림으로 내보내 위아래로 붙이는 방법을 쓸 수 있습니다.

Q2. Chart.Export는 무엇인가요?

차트를 GIF 등의 그림 파일로 저장하는 메서드입니다.

Q3. Parent 속성은 무엇인가요?

지정한 개체의 상위(부모) 개체를 돌려주는 속성으로, Chart의 Parent는 ChartObject입니다.

마치며

시나리오를 잘 짜면 엑셀에 없는 기능도 이미 아는 기능을 조합해 구현할 수 있습니다.