- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 차트 축의 최소값·최대값 설정이 저장되지 않거나 자동으로 초기화되는 문제를 사용 사례별로 정확히 진단하고 재발 없이 고정하는 실무 절차와 VBA 자동화 방법을 제공하는 것이다.
문제 정의와 증상 진단
차트 축 범위가 저장되지 않는 대표 증상은 다음과 같다고 요약할 수 있다.
- 축 최소값·최대값을 수동 입력했지만 시트 재계산·파일 재열기·데이터 새로고침 후 다시 자동으로 바뀌는 현상이다.
- 피벗차트에서 분기별·월별 데이터를 업데이트하면 축이 다시 자동으로 확대·축소되는 현상이다.
- 보조축을 쓰는 복합차트에서 한쪽 축을 고정하면 다른 축의 스케일이 같이 틀어지는 현상이다.
- 날짜 축에서 주말·공휴일 제외 설정 또는 빈 셀 처리 방법 변경 시 축이 원치 않게 재계산되는 현상이다.
원인별 해법 개요(의사결정 트리)
다음 표에서 자신의 상황을 먼저 매칭한 뒤 해당 절로 이동하면 된다.
| 상황 | 주요 원인 | 우선 조치 | 심화 조치 |
|---|---|---|---|
| 일반 차트(피벗 아님) | 자동 스케일 재적용, 숨김/빈 셀 처리, 동적 범위 변동 | 축 옵션에서 자동 해제 후 수동 값 입력 | 데이터 범위 고정, 숨김 데이터 표시, VBA로 고정 |
| 피벗차트 | 피벗 새로고침 이벤트가 축 스케일 초기화 | 피벗범주 고정, 그룹 레벨 고정 | Worksheet_PivotTableUpdate 이벤트에서 축 재적용 |
| 보조축 사용하는 복합차트 | 1차·2차 축 스케일 불일치 및 자동 재조정 | 두 축 모두 수동 고정 | 계열별 축 지정 재점검 및 단위 통일 |
| 날짜 축(시간 척도) | 축 유형이 ‘텍스트’ 또는 불연속 날짜 | 축 유형을 ‘날짜’로 지정 | CDbl(Date) 기반 VBA로 최소/최대값 고정 |
| 로그 축 | 0 또는 음수 데이터 포함으로 자동 스케일 | 0/음수 제외 또는 변환 | 데이터 전처리 및 보간치 사용 |
기본 조치: 축 옵션에서 자동 스케일 해제
- 차트를 클릭하고 축을 선택한 뒤 축 서식 창을 연다.
- 경계(최소/최대)와 주 단위 항목의 자물쇠 아이콘 또는 ‘자동’ 체크를 해제한다.
- 필요 최소값·최대값·주 단위 값을 직접 입력한다.
- 파일을 저장하고 다시 열어 변동 여부를 확인한다.
데이터 원본과 숨김/빈 셀 처리 점검
축 스케일은 데이터 범위 확장·감소, 빈 셀 처리 방식에 직접 영향을 받는다.
- 데이터 범위 고정: 표 객체(Table)로 되어 있고 행이 자동으로 늘어나는 경우 축 자동 스케일 재적용이 잦다. 동적 범위를 유지하되 축은 VBA로 고정하는 전략을 권장한다.
- 숨김 및 빈 셀: 차트 → 데이터 선택 → 숨김 및 빈 셀 → ‘숨겨진 행과 열의 데이터 표시’를 켠다. 빈 셀은 ‘간격’ 대신 ‘선으로 연결’이 축 스케일 안정에 유리하다.
보조축이 있는 복합차트의 체크리스트
- 계열 서식에서 해당 계열이 보조축인지 기본축인지 확인한다.
- 값 축(세로축)을 기본축과 보조축 각각 선택해 최소값·최대값을 모두 수동으로 입력한다.
- 주 단위·보조 단위도 각각 수동으로 맞춘다.
- 계열 단위가 크게 다른 경우(예: 백만 vs %) 보조축에 % 계열만 올린다.
날짜 축(시간 척도)에서 범위가 풀리는 경우
날짜 데이터는 축 유형이 중요하다.
- 축 유형을 ‘텍스트’가 아니라 ‘날짜(시간 척도)’로 지정한다.
- 주말·공휴일 제외로 데이터가 불연속이면 엑셀이 축을 다시 계산할 수 있다. 불연속 날짜라도 날짜 축을 유지하면 최솟값·최댓값 고정이 안정적이다.
피벗차트에서 축이 매번 초기화될 때
피벗차트는 새로고침과 그룹 변경 시 내부적으로 차트를 재생성하여 축 범위를 되돌릴 수 있다. 다음 순서로 대응한다.
- 피벗 필드에서 범주(예: 월, 분기) 그룹 레벨을 고정한다.
- 값 필드의 표시 형식·집계를 바꾸지 않는다. 바꾸어야 한다면 아래 VBA 이벤트로 축을 재적용한다.
- Worksheet_PivotTableUpdate 이벤트에 축 고정 코드를 넣어 매번 자동으로 최소/최대값을 재설정한다.
' 시트 모듈(예: Sheet1 코드)에 삽입 Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) On Error Resume Next With Me.ChartObjects("chtSales").Chart With .Axes(xlValue) .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False .MinimumScale = 0 .MaximumScale = 1000000 .MajorUnitIsAuto = False .MajorUnit = 200000 End With ' 보조축 사용하는 경우 If .HasAxis(xlValue, xlSecondary) Then With .Axes(xlValue, xlSecondary) .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False .MinimumScale = 0 .MaximumScale = 100 .MajorUnitIsAuto = False .MajorUnit = 10 End With End If End With End Sub VBA로 일반 차트 축을 영구 고정하는 방법
데이터 범위가 동적이어도 다음 매크로로 열린 즉시·저장 직전 고정할 수 있다.
' 표준 모듈(Module1) Sub LockAxis_AllChartsOnSheet() Dim co As ChartObject For Each co In ActiveSheet.ChartObjects With co.Chart.Axes(xlValue) .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False .MinimumScale = 0 ' 필요 값으로 변경 .MaximumScale = 100 ' 필요 값으로 변경 .MajorUnitIsAuto = False .MajorUnit = 20 ' 필요 값으로 변경 End With ' 보조축이 있을 경우 If co.Chart.HasAxis(xlValue, xlSecondary) Then With co.Chart.Axes(xlValue, xlSecondary) .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False .MinimumScale = 0 .MaximumScale = 100 .MajorUnitIsAuto = False .MajorUnit = 10 End With End If Next co End Sub 파일 저장 시 자동 적용하려면 ThisWorkbook 모듈에 다음을 추가한다.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.ScreenUpdating = False Call LockAxis_AllChartsOnSheet Application.ScreenUpdating = True End Sub 날짜 축을 VBA로 정확히 고정하기
날짜는 일련번호(Double)로 저장되어 축 최소·최대값도 숫자여야 한다. DateSerial을 사용하면 안정적이다.
Sub LockDateAxis() Dim ch As Chart Set ch = ActiveSheet.ChartObjects("chtDate").Chart With ch.Axes(xlCategory) .CategoryType = xlTimeScale .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False .MinimumScale = CDbl(DateSerial(2025, 1, 1)) .MaximumScale = CDbl(DateSerial(2025, 12, 31)) .BaseUnit = xlDays .MajorUnit = 30 .MajorUnitIsAuto = False End With End Sub 로그 축에서 값이 초기화되는 경우
- 로그 축은 0 또는 음수 데이터가 있으면 설정이 강제로 해제되거나 스케일이 왜곡된다.
- 0 값을 아주 작은 양수(예: 0.0001)로 대체하거나, 로그 축이 필요한 계열만 별도 차트로 분리한다.
동적 범위(테이블·OFFSET·INDEX) 사용 시 권장 패턴
동적 범위로 새 행이 추가될 때마다 최대값이 커지면 엑셀이 스케일을 다시 잡으려 한다. 다음 패턴으로 차트의 재계산은 허용하되 축은 고정한다.
- 원본 범위는 테이블로 관리하여 수식·서식을 자동 확장한다.
- 차트는 테이블 열을 직접 참조하되, 축 최소/최대는 VBA로 주기적 재적용한다.
- 월말 등 정기 시점에만 축 상한을 상향 조정하는 매크로를 만든다.
Sub RaiseAxisCapIfNeeded() Dim co As ChartObject, maxData As Double maxData = Application.WorksheetFunction.Max(Range("tblSales[Amount]")) For Each co In ActiveSheet.ChartObjects With co.Chart.Axes(xlValue) .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False If .MaximumScale < maxData Then .MaximumScale = WorksheetFunction.Ceiling_Precise(maxData, 10000) End With Next co End Sub 재발 방지를 위한 설정 체크리스트
| 항목 | 권장 설정 | 비고 |
|---|---|---|
| 축 경계/단위 | 자동 해제 후 수동 값 | 기본축·보조축 모두 적용 |
| 숨김/빈 셀 | 숨긴 데이터 표시, 빈 셀은 선으로 연결 | 스케일 급변 억제 |
| 축 유형 | 날짜 데이터는 날짜 축 | 텍스트 축은 불연속으로 인식 |
| 피벗 새로고침 | PivotTableUpdate에서 축 재설정 | 자동화를 통한 일관성 |
| 로그 축 | 0/음수 데이터 제거 또는 변환 | 필요 시 별도 차트 |
| 지역 소수점 | 시스템 구분자와 동일 | 입력 무시 방지 |
| 문서 보호 | 축 변경 전 보호 해제 | 특히 공유통합문서 |
자주 발생하는 함정과 해결 팁
- 차트 템플릿(.crtx) 재적용: 템플릿에 자동 스케일이 저장돼 있으면 적용 시 현재 설정이 덮어쓴다. 템플릿을 다시 저장한다.
- 축이 다른 개체를 참조: 복합 차트에서 특정 계열이 잘못된 축에 할당되면 스케일이 상충한다. 계열별 축을 재배치한다.
- 계산 모드: 수동 계산 모드에서 데이터가 변경되었는데 재계산 전에 축을 고정하면 실제 데이터와 불일치가 생긴다. 재계산 후 축 고정을 적용한다.
- 범례 필터: 범례에서 계열을 토글하면 축이 다시 조정될 수 있다. 필요 시 이벤트 기반 고정을 사용한다.
현장 적용 예시: 보고서용 매출 추이 차트 고정
- 매출 테이블(tblSales)을 월별로 관리한다.
- 꺾은선형 차트에 Amount 열을 연결한다.
- 세로축 최소 0, 최대 1,000,000, 주 단위 100,000으로 수동 입력한다.
- 숨김 및 빈 셀에서 ‘숨김 데이터 표시’, 빈 셀은 ‘선으로 연결’을 선택한다.
- 다음 VBA를 ThisWorkbook에 넣어 저장 전 자동 고정한다.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Application.ScreenUpdating = False Call LockAxis_AllChartsOnSheet Application.ScreenUpdating = True End Sub 고급: 특정 차트만 대상, 조건부 축 상한 적용
보고서마다 요구 스케일이 다르면 차트 이름 기반으로 조건을 건다.
Sub LockAxis_ByChartName() Dim co As ChartObject For Each co In ActiveSheet.ChartObjects Select Case co.Name Case "chtRevenue" With co.Chart.Axes(xlValue) .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False .MinimumScale = 0 .MaximumScale = 1500000 End With Case "chtMargin" With co.Chart.Axes(xlValue) .MinimumScaleIsAuto = False .MaximumScaleIsAuto = False .MinimumScale = -10 .MaximumScale = 50 End With End Select Next co End Sub 테스트 체크리스트(완료 기준)
- 파일을 닫았다가 열어도 축 값이 동일하다.
- 데이터 추가·삭제 후에도 축 값이 유지된다.
- 피벗 새로고침 후에도 축이 유지되거나 이벤트로 즉시 재적용된다.
- 보조축이 있는 경우 두 축 모두 의도한 값으로 고정되어 있다.
- 로그 축·날짜 축에서도 예외 없이 동작한다.
FAQ
피벗차트에서만 축이 자꾸 풀린다. 일반 차트로 바꾸는 것이 좋은가?
피벗차트는 새로고침 시 내부 재생성이 발생하여 축이 초기화되기 쉽다. 피벗 유지가 필요하다면 Worksheet_PivotTableUpdate 이벤트에서 축을 재설정하는 자동화를 권장한다. 피벗 기능이 필요 없고 데이터가 확정적이라면 일반 차트로 변환하여 안정성을 높이는 것이 낫다.
날짜 축에서 최솟값을 특정 월의 1일로 고정하고 싶다.
축 유형을 날짜로 지정한 뒤 CDbl(DateSerial(연, 월, 1)) 값을 VBA로 설정한다. UI에서 직접 입력도 가능하나 VBA가 재현성과 이식성이 높다.
로그 축에서 0 값이 있어 오류가 난다.
0을 아주 작은 양수로 대체하거나 로그 축 전용 보조 계열로 분리한다. 데이터 전처리 단계에서 0 제거가 가장 확실하다.
보조축을 쓰면 색상·범례가 자주 바뀐다.
계열이 이동될 때 서식 재적용이 일어난다. 서식 템플릿을 저장하거나 VBA로 축과 함께 서식을 재설정한다.
축 주 단위가 바뀌어 보기가 불편하다.
주 단위를 자동 해제하고 보고서 규격(예: 5, 10, 100, 10,000 등)으로 고정한다. 날짜 축은 MajorUnit을 일 단위로 지정한다.