Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 시트를 한꺼번에 삭제한 뒤 자동 복원·되돌리기 이후 통합 문서가 손상되었을 때, 데이터 손실을 최소화하며 파일을 안정적으로 복구하고 재발을 방지하는 실무 절차를 제시하는 것이다.
엑셀은 내부적으로 통합 문서를 다수의 XML 파트와 관계 파일로 구성하여 관리한다.
여러 시트를 동시에 삭제하면 이름 정의, 외부 링크, 피벗 캐시, 차트 데이터, 수식 참조가 대량으로 끊어질 수 있다.
이 상태에서 자동 복원 또는 실행 취소를 통해 되돌리면, 삭제 직전과 직후의 관계 정보가 충돌하여 일부 XML 파트가 불일치 상태가 될 수 있다.
대표 증상은 열기 시 “파일 내용을 복구했습니다” 메시지, 피벗 테이블이 비활성화되는 현상, 정의된 이름 다수의 #REF! 생성, 스타일 항목 폭증, 저장 시 비정상 용량 증가 등이다.
아래 순서를 상단부터 차례로 수행하여 데이터 가용성을 높인다.
excel /safe를 입력한다.#REF! 항목을 삭제한다.| 증상 | 가능 원인 | 즉시 조치 |
|---|---|---|
| 열기 시 자동 복구 메시지 표시 | 워크북·워크시트 관계 불일치, 콘텐츠 타입 누락 | 열기 및 복구 실행 후 새 파일로 즉시 저장한다 |
| 피벗 테이블 새로 고침 불가 | PivotCache XML 손상 또는 원본 범위 참조 소실 | 피벗 테이블을 삭제 후 원본 데이터 정규화하여 재작성한다 |
| 정의된 이름에 #REF! 다수 | 시트 삭제로 이름 대상 범위 소멸 | #REF! 이름을 일괄 삭제하고 필요한 이름만 재정의한다 |
| 파일 용량 급증·저장 지연 | 스타일 항목 폭증, 사용하지 않는 개체 잔존 | 불필요한 스타일과 서식을 정리하고 새 파일로 내보낸다 |
| 그래프·모양 개체가 흰 상자로 표시 | 깨진 연결 또는 손상된 차트 파트 | 개체를 이미지로 임시 내보내거나 원본 데이터로 재작성한다 |
엑셀의 .xlsx는 ZIP 컨테이너 기반 구조이다.
파일 확장자를 .zip으로 바꾸어 내부 파일을 점검할 수 있다.
.xlsx를 .zip으로 확장자 변경 후 압축 해제한다.xl/workbook.xml, xl/worksheets/sheet*.xml, xl/_rels/workbook.xml.rels, xl/styles.xml을 우선 점검한다._rels)에서 존재하지 않는 시트나 외부 링크를 참조하는 항목을 제거한다.xl/externalLinks, xl/pivotCache, xl/drawings 폴더의 깨진 항목을 임시 제거하고 다시 압축하여 열림 여부를 확인한다.아래 VBA 코드는 손상 유발 빈도가 높은 항목을 일괄 정리한다.
Sub CleanBrokenNames() Dim nm As Name On Error Resume Next For Each nm In ThisWorkbook.Names If InStr(1, nm.RefersTo, "#REF!", vbTextCompare) > 0 Then nm.Delete End If Next nm Dim ws As Worksheet, wsName As Name For Each ws In ThisWorkbook.Worksheets For Each wsName In ws.Names If InStr(1, wsName.RefersTo, "#REF!", vbTextCompare) > 0 Then wsName.Delete End If Next wsName Next ws End Sub Sub BreakAllLinks() Dim Links As Variant, i As Long On Error Resume Next Links = ThisWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks) If Not IsEmpty(Links) Then For i = LBound(Links) To UBound(Links) ThisWorkbook.BreakLink Name:=Links(i), Type:=xlLinkTypeExcelLinks Next i End If End Sub Sub CleanStyles() Dim st As Style, n As Long On Error Resume Next For Each st In ActiveWorkbook.Styles If Not st.BuiltIn Then st.Delete n = n + 1 End If Next st Application.StatusBar = "Deleted styles: " & n End Sub Sub ResetCachesAndConnections() Dim pc As PivotCache On Error Resume Next For Each pc In ActiveWorkbook.PivotCaches pc.Refresh Next pc Dim cn As WorkbookConnection For Each cn In ActiveWorkbook.Connections cn.Delete Next cn End Sub 파일 구조가 불안정하면 시트별로 데이터만 안전하게 추출해 새 통합 문서로 옮기는 것이 합리적이다.
Sub ExportSheetsAsValues() Dim ws As Worksheet, nb As Workbook Set nb = Workbooks.Add(xlWBATWorksheet) For Each ws In ThisWorkbook.Worksheets ws.UsedRange.Copy With nb.Sheets(nb.Sheets.Count) .Range("A1").PasteSpecial xlPasteValues .Range("A1").PasteSpecial xlPasteFormats .Name = Left(ws.Name, 31) End With nb.Sheets.Add After:=nb.Sheets(nb.Sheets.Count) Next ws Application.CutCopyMode = False End Sub 문서 복원은 데이터 손실을 줄이는 핵심 수단이다.
추가 기능이나 보안 설정이 회복을 방해할 수 있다.
| 항목 | 검증 방법 | 합격 기준 |
|---|---|---|
| 정의된 이름 | 이름 관리자에서 오류 필터링 및 VBA 일괄 삭제 | #REF! 0개 |
| 외부 링크 | 연결 편집에서 남은 링크 확인 | 필요한 링크만 잔존 |
| 피벗 테이블 | 새로 고침 성공 여부 | 오류 없이 새로 고침 완료 |
| 조건부 서식 | 중복 규칙 제거, 적용 범위 점검 | 중복·순환 참조 없음 |
| 파일 크기 | 정리 전후 용량 비교 | 불필요한 급증 없음 |
| 저장·열기 속도 | 초 단위 기록 | 지연 현상 없음 |
아래 텍스트 플로우를 따라가면 의사결정을 빠르게 할 수 있다.
시작 ├─ 파일 열림? ── 아니오 → 열기 및 복구 → 열림? │ ├─ 예 → 데이터 사본 생성 → 스크립트 정리 → 새 파일로 재구성 → 끝 │ └─ 아니오 → .zip 열기 → 외부링크·피벗·드로잉 제거 → 재시도 └─ 예 → 복구 로그 확인 → 이름/링크/스타일 정리 → 성능 정상화? ├─ 예 → 버전 저장 및 문서화 → 끝 └─ 아니오 → 시트별 CSV 추출 → 새 통합 문서 빌드 → 끝 xl/workbook.xml의 <sheets> 목록과 _rels 관계의 대상 파일이 일치하는지 확인한다.xl/styles.xml에서 스타일 카운트가 비정상적으로 크면 불필요한 스타일 블록을 삭제한다.xl/externalLinks 폴더가 있으나 workbook.xml.rels에 연결이 없으면 폴더를 제거한다.xl/pivotCache에 캐시가 남아 있어도 참조 피벗이 없으면 제거한다.xl/drawings와 관계를 함께 제거한다.공유 전 아래 항목을 수행한다.
Sub HardCleanWorkbook() Application.ScreenUpdating = False CleanBrokenNames BreakAllLinks CleanStyles ResetCachesAndConnections Application.ScreenUpdating = True End Sub Function SheetExists(ByVal sName As String) As Boolean Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets If ws.Name = sName Then SheetExists = True: Exit Function Next ws End Function
Sub ReplaceBrokenFormulas()
Dim ws As Worksheet, c As Range
For Each ws In ThisWorkbook.Worksheets
For Each c In ws.UsedRange
If c.HasFormula Then
If InStr(1, c.Formula, "#REF!", vbTextCompare) > 0 Then
c.Value = c.Value
End If
End If
Next c
Next ws
End Sub
데이터 보존이 최우선이므로 추출값을 기준으로 새 파일을 만들고 필수 서식만 재적용하는 것이 안전하다. 서식 복구를 위해 원본에서 정상인 시트의 스타일만 복사해 병합하는 방법을 활용한다.
외부 링크, 피벗 캐시, 깨진 드로잉처럼 데이터 값에 직접 영향을 주지 않는 파트부터 제거한다. 워크북과 시트 본문 XML은 삭제하지 않는다.
원본 데이터를 표로 재정의하고 새 통합 문서에서 동일 필드로 피벗을 재작성한다. 기존 캐시는 신뢰하지 않는 것이 안전하다.
VBA 스크립트로 #REF! 항목을 일괄 삭제하고 필요한 동적 이름만 문서화하여 재생성한다.
스타일 폭증 가능성이 크다. 스타일 정리 매크로 실행 후 새 통합 문서로 복사 저장하여 메타데이터를 초기화한다.