Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 부분합(Subtotal) 기능 사용 후 원본 데이터 정렬이 어긋나거나 행이 섞이는 오류를 신속하고 정확하게 복구하도록 실무 중심 절차와 체크리스트, 예방 규칙, 대체 방법을 체계적으로 제공하는 것이다.
부분합 기능을 사용하면 엑셀이 자동으로 그룹 윤곽(Outline)을 만들고 합계 행을 삽입하며, 내부적으로 숨김 처리와 레벨별 표시를 제어한다. 이 상태에서 전체 범위를 고려하지 않은 정렬, 접힌 상태에서의 정렬, 합계 행 포함 정렬, 병합 셀과 빈 행이 섞인 상태에서 정렬을 수행하면 원본 데이터가 섞이거나 헤더가 데이터로 내려가고 같은 키를 가진 레코드가 분리되는 문제가 발생한다. 주 증상은 다음과 같다.
=A2&"|"&B2&"|"&C2 같은 키를 구성하고 이전 백업본과 COUNTIF 또는 VLOOKUP/XLOOKUP으로 레코드 매칭을 검증한다.| 원인 | 설명 | 해결 절차 | 예방 팁 |
|---|---|---|---|
| 합계 행 포함 정렬 | 부분합 합계/소계 행이 데이터 행과 동일 범위에 포함되어 이동한다. | 부분합 메뉴에서 모두 제거 후 정렬 수행 또는 합계 행을 별도 시트로 분리한다. | 합계는 피벗테이블이나 보고용 별도 영역에서 계산한다. |
| 접힌 레벨 상태 정렬 | 윤곽 레벨이 2 또는 1로 접혀 있을 때 보이는 행만 정렬되어 순서가 꼬인다. | 정렬 전 모두 표시로 펼친다. | 정렬은 항상 레벨 전체 표시 상태에서 수행한다. |
| 부분 선택 정렬 | 열 하나 또는 일부 블록만 선택하고 정렬하여 열 간 매칭이 깨진다. | 정렬 경고에서 선택 영역 확장을 선택한다. | Ctrl+A로 테이블 전체를 선택하고 정렬한다. |
| 머리글 인식 오류 | 헤더 행이 공백·병합·중복으로 인해 헤더 미인식 상태가 된다. | 헤더를 단일 행으로 통일하고 병합을 해제한다. | 보고용 줄바꿈은 셀 내 줄바꿈으로 대체한다. |
| 표와 범위 혼용 | 일부는 표(ListObject)이고 일부는 일반 범위여서 정렬 기준이 분리된다. | 모두 표로 변환하거나 모두 범위로 통일한다. | 데이터는 항상 표 기능을 사용해 관리한다. |
| 숨김 행/필터 잔존 | 필터가 남아 보이는 행만 정렬된다. | 데이터 → 지우기로 모든 필터를 해제한다. | 정렬 전 필터 해제는 기본 습관으로 유지한다. |
| 빈 행/열 포함 | 연속 범위가 끊겨 일부 구간만 정렬된다. | 빈 행·열을 삭제하고 연속 범위를 만든다. | 입력 규칙으로 필수 키의 공란을 차단한다. |
-- 보조열 예시(키 결합) =TEXT([@거래일],"yyyymmdd") & "|" & [@고객코드] & "|" & [@품목코드]
-- 전후 일치 검증
=IF(COUNTIF(백업시트!$Z:$Z,[@키])=1,"OK","CHECK")
보고서 형태 유지가 필요한 경우 부분합 행을 유지하되 원본 레코드 정렬은 별도 복제본에서 수행한다. 절차는 다음과 같다.
자동 부분합 제거가 불가하거나 혼합 구조에서 수동 합계가 섞인 경우 아래 매크로를 사용하여 합계 패턴을 탐지하고 윤곽을 해제한 뒤 안전 정렬을 수행한다.
Sub CleanSubtotalAndSort() Dim ws As Worksheet, lo As ListObject Dim lastRow As Long, lastCol As Long Dim rng As Range, hdr As Range
Set ws = ActiveSheet
On Error Resume Next
' 1) 윤곽 해제
ws.Outline.ShowLevels RowLevels:=8, ColumnLevels:=8
ws.Cells.ClearOutline
On Error GoTo 0
' 2) 자동 부분합 제거 시도
On Error Resume Next
ws.ShowAllData
On Error GoTo 0
Cells.Select
Selection.RemoveSubtotal
' 3) 범위 결정
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))
Set hdr = rng.Rows(1)
' 4) 합계/소계 텍스트 행 제거(첫 열 기준 "합계","소계" 탐지)
Dim r As Long
For r = lastRow To 2 Step -1
If LCase$(ws.Cells(r, 1).Value) Like "*합계*" Or LCase$(ws.Cells(r, 1).Value) Like "*소계*" Then
ws.Rows(r).Delete
End If
Next r
' 5) 병합 해제
If rng.MergeCells Then rng.UnMerge
' 6) 빈 행 삭제
For r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row To 2 Step -1
If Application.WorksheetFunction.CountA(ws.Rows(r)) = 0 Then ws.Rows(r).Delete
Next r
' 7) 표 변환
On Error Resume Next
Set lo = rng.ListObject
On Error GoTo 0
If lo Is Nothing Then
ws.ListObjects.Add(xlSrcRange, rng, , xlYes).Name = "T_Data"
End If
' 8) 다중 키 정렬(예: A열, B열, C열)
With ws.ListObjects(1).Sort
.SortFields.Clear
.SortFields.Add Key:=ws.ListObjects(1).ListColumns(1).DataBodyRange, Order:=xlAscending
.SortFields.Add Key:=ws.ListObjects(1).ListColumns(2).DataBodyRange, Order:=xlAscending
.SortFields.Add Key:=ws.ListObjects(1).ListColumns(3).DataBodyRange, Order:=xlAscending
.Header = xlYes
.Apply
End With
End Sub
SUBTOTAL 함수는 필터로 숨긴 행을 제외할 수 있어 보고서에 유용하다. 하지만 정렬은 합계 영역과 분리해야 한다. 권장 구조는 다음과 같다.
-- 숨김 행을 제외한 합계 예시 =SUBTOTAL(9, T_Data[금액]) ' 9=SUM
-- 오류 무시 집계가 필요할 때
=AGGREGATE(9, 6, T_Data[금액])
' 옵션 6 = 숨김 행, 오류 값 무시
부분합으로 인한 정렬 오류는 설계상의 한계에서 비롯된다. 데이터가 지속적으로 누적되는 환경에서는 다음 전환이 안정적이다.
자동 부분합으로 삽입된 소계·합계 행은 제거 시 사라진다. 원본 데이터는 보존된다. 보고 목적이라면 피벗테이블 또는 별도 요약 영역으로 대체하여 유지한다.
안 된다. 접힌 상태에서는 보이는 행만 정렬되어 레코드 매칭이 깨진다. 반드시 모두 표시 후 정렬한다.
대부분의 경우 문제가 발생한다. 같은 행의 다른 열이 이동하지 않아 필드 매칭이 깨진다. 항상 선택 영역 확장을 사용한다.
가능하다. 다만 합계 수식 범위를 표 외부에 두고, 정렬은 표 내부에서만 수행한다. 보고 영역과 데이터 영역을 분리하면 안전하다.
대부분 가능하다. 그룹화·소계·필터·정렬을 안전하게 제공한다. 단, 피벗 외부 참조나 사용자 정의 행 삽입은 피한다.
백업본과의 키 매칭으로 복구한다. 백업이 없으면 해시 키를 구성해 중복·불일치를 탐지하고 원본 제공처에서 기준 정렬 키를 확보한 뒤 재정렬한다. 필요 시 VBA로 패턴 기반 복구를 시도한다.
-- 일자·고객·품목 키 해시 =HASH( TEXT([@일자],"yyyymmdd") & "|" & [@고객] & "|" & [@품목] )
-- 전후 무결성 비교(가정: 백업시트의 키 목록이 Z열)
=IF(COUNTIF(백업시트!$Z:$Z,[@키])=1,"OK","MISMATCH")
-- 유효성: 공란 금지(예: 고객코드) 수식: =LEN(TRIM([@고객코드]))>0
-- 조건부서식: 키 중복 감지(열 Z가 키)
수식: =COUNTIF($Z:$Z,$Z1)>1
문제: 소계 행이 데이터 중간으로 이동했다. 조치: 부분합 모두 제거 → 표 변환 → 다중 정렬 → 키 검증으로 복구한다.
문제: 보이는 레벨만 정렬되어 고객별 묶음이 해체되었다. 조치: 모두 표시 후 전 범위 정렬 → 키 재정렬 → 피벗 보고로 전환한다.
문제: 한 열만 정렬하여 열 간 매칭이 깨졌다. 조치: 백업본과 키 기준으로 재매칭 → 잘못 정렬된 열 복구 → 유효성 규칙 도입으로 재발 방지한다.
부분합은 보고서 작성에는 편리하나 정렬과 공존하기 어렵다. 원본 데이터는 표로 표준화하고, 합계·요약은 피벗 또는 별도 영역에서 처리하는 것이 장기적으로 가장 안전하다. 이미 꼬인 경우에는 부분합 제거, 윤곽 해제, 표 통일, 전체 확장 정렬, 키 검증 순으로 복구하면 된다.