Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 차트 축의 최소값·최대값 설정이 저장되지 않거나 자동으로 초기화되는 문제를 사용 사례별로 정확히 진단하고 재발 없이 고정하는 실무 절차와 VBA 자동화 방법을 제공하는 것이다.
차트 축 범위가 저장되지 않는 대표 증상은 다음과 같다고 요약할 수 있다.
다음 표에서 자신의 상황을 먼저 매칭한 뒤 해당 절로 이동하면 된다.
| 상황 | 주요 원인 | 우선 조치 | 심화 조치 |
|---|---|---|---|
| 일반 차트(피벗 아님) | 자동 스케일 재적용, 숨김/빈 셀 처리, 동적 범위 변동 | 축 옵션에서 자동 해제 후 수동 값 입력 | 데이터 범위 고정, 숨김 데이터 표시, VBA로 고정 |
| 피벗차트 | 피벗 새로고침 이벤트가 축 스케일 초기화 | 피벗범주 고정, 그룹 레벨 고정 | Worksheet_PivotTableUpdate 이벤트에서 축 재적용 |
| 보조축 사용하는 복합차트 | 1차·2차 축 스케일 불일치 및 자동 재조정 | 두 축 모두 수동 고정 | 계열별 축 지정 재점검 및 단위 통일 |
| 날짜 축(시간 척도) | 축 유형이 ‘텍스트’ 또는 불연속 날짜 | 축 유형을 ‘날짜’로 지정 | CDbl(Date) 기반 VBA로 최소/최대값 고정 |
| 로그 축 | 0 또는 음수 데이터 포함으로 자동 스케일 | 0/음수 제외 또는 변환 | 데이터 전처리 및 보간치 사용 |
축 스케일은 데이터 범위 확장·감소, 빈 셀 처리 방식에 직접 영향을 받는다.
날짜 데이터는 축 유형이 중요하다.
피벗차트는 새로고침과 그룹 변경 시 내부적으로 차트를 재생성하여 축 범위를 되돌릴 수 있다. 다음 순서로 대응한다.
' 시트 모듈(예: 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 데이터 범위가 동적이어도 다음 매크로로 열린 즉시·저장 직전 고정할 수 있다.
' 표준 모듈(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 날짜는 일련번호(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 동적 범위로 새 행이 추가될 때마다 최대값이 커지면 엑셀이 스케일을 다시 잡으려 한다. 다음 패턴으로 차트의 재계산은 허용하되 축은 고정한다.
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/음수 데이터 제거 또는 변환 | 필요 시 별도 차트 |
| 지역 소수점 | 시스템 구분자와 동일 | 입력 무시 방지 |
| 문서 보호 | 축 변경 전 보호 해제 | 특히 공유통합문서 |
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 피벗차트는 새로고침 시 내부 재생성이 발생하여 축이 초기화되기 쉽다. 피벗 유지가 필요하다면 Worksheet_PivotTableUpdate 이벤트에서 축을 재설정하는 자동화를 권장한다. 피벗 기능이 필요 없고 데이터가 확정적이라면 일반 차트로 변환하여 안정성을 높이는 것이 낫다.
축 유형을 날짜로 지정한 뒤 CDbl(DateSerial(연, 월, 1)) 값을 VBA로 설정한다. UI에서 직접 입력도 가능하나 VBA가 재현성과 이식성이 높다.
0을 아주 작은 양수로 대체하거나 로그 축 전용 보조 계열로 분리한다. 데이터 전처리 단계에서 0 제거가 가장 확실하다.
계열이 이동될 때 서식 재적용이 일어난다. 서식 템플릿을 저장하거나 VBA로 축과 함께 서식을 재설정한다.
주 단위를 자동 해제하고 보고서 규격(예: 5, 10, 100, 10,000 등)으로 고정한다. 날짜 축은 MajorUnit을 일 단위로 지정한다.