엑셀 XLS를 XLSX로 변환되지 않을 때 해결법 총정리

이 글의 목적은 오래된 XLS 파일을 최신 XLSX 형식으로 변환하는 과정에서 발생하는 다양한 오류를 원인별로 진단하고, 데이터 손실 없이 안전하게 해결하는 실무 절차와 자동화 스크립트를 제공하는 것이다.

1. 문제 이해: XLS와 XLSX의 구조적 차이

XLS는 바이너리 BIFF 포맷(BIFF8 중심)이고, XLSX는 Open XML 기반 압축 패키지 구조로 서로 저장 방식이 다르다. 변환 시에는 포맷 간 매핑이 수행되며, 다음 요소에서 충돌이 발생하기 쉽다.

  • 매크로 포함 여부: XLSM으로 저장이 필요한데 XLSX로 강제 저장 시 매크로 제거 경고가 발생한다.
  • 시트 보호 및 공유 통합 문서: 공유 통합 문서나 구조 보호가 활성화된 경우 SaveAs가 거부된다.
  • 손상된 PivotCache·외부 연결: 캐시 손상이나 끊어진 OLE DB/ODBC 연결이 변환 실패를 유발한다.
  • 오래된 ActiveX 컨트롤: 레지스트리 손상 또는 손상된 캐시가 SaveAs 단계에서 오류를 낸다.
  • 긴 경로·권한 문제: Windows 경로 260자 제한 또는 네트워크 권한 부족이 저장 실패를 유발한다.
  • 보안 정책: 차단된 파일(웹에서 가져옴), 신뢰할 수 없는 위치, 매크로 정책이 변환을 막는다.
주의 : 매크로를 유지하려면 XLSX가 아니라 XLSM으로 저장해야 하며, XLSX로 저장하면 VBA 코드와 폼이 제거된다.

2. 대표 오류 메시지와 1차 조치

증상·메시지 가능 원인 즉시 조치
“다른 프로세스에서 사용 중이므로 저장할 수 없다” 동시 열림, 백그라운드 미리보기, 바이러스 백신 실시간 검사 모든 인스턴스 종료, 탐색기 미리보기 창 끄기, 잠금 해제 후 재시도
“경로가 너무 길다” 또는 저장 대화창이 닫힘 경로 218~260자 한계, 네트워크 UNC 경로 루트 가까이로 이동 후 저장, 경로 단축, OneDrive 동기화 폴더 외부로 이동
“파일 형식과 확장명이 일치하지 않는다” XLS 내부 손상, 확장자만 변경됨 다른 이름으로 저장, 열기 복구, 데이터만 새 통합 문서로 복사
“공유 통합 문서에서는 수행할 수 없다” 공유 통합 문서 설정 활성 검토 > 공유 통합 문서 해제, 보호 해제 후 저장
“이 통합 문서는 신뢰할 수 없는 위치에서 열렸다” 인터넷에서 내려받은 파일, 차단 속성 파일 속성 > 차단 해제, 신뢰할 수 있는 위치로 이동
“메모리 또는 리소스가 부족하여 저장할 수 없다” 대용량 이미지, 수많은 스타일·이름 범위 불필요한 스타일 정리, 이름 범위 중복 제거, 통합 문서 정리 후 저장
“매크로가 포함되어 삭제된다” XLSX로 강제 저장 XLSM으로 저장 또는 코드 내보내기 후 XLSX 저장

3. 체크리스트: 변환 전 안정화 작업

  1. 읽기 전용 해제: 속성에서 읽기 전용 제거 및 파일이 네트워크 잠금 상태인지 확인한다.
  2. 차단 해제: 파일 속성에서 “차단 해제” 체크 후 적용한다.
  3. 공유·보호 해제: 검토 메뉴에서 통합 문서 보호, 시트 보호, 공유 통합 문서를 모두 해제한다.
  4. 외부 연결 점검: 데이터 > 연결 편집에서 끊어진 연결을 제거하거나 값으로 고정한다.
  5. PivotCache 재생성: 피벗테이블 모두 새 데이터 범위로 업데이트하거나 캐시 삭제 후 재작성한다.
  6. ActiveX 정리: 파일 > 옵션 > 신뢰 센터 > ActiveX 설정을 기본으로 두고, 문제가 있으면 컨트롤을 폼 컨트롤로 교체한다.
  7. 스타일·이름 범위 정리: 과도한 셀 스타일과 중복 이름을 삭제한다.
  8. 경로 단축: C:\Work 처럼 짧은 경로로 이동 후 저장한다.
  9. OneDrive·SharePoint 잠금 점검: 동기화 중지 후 로컬에 복사하여 저장한다.

4. 신뢰 센터 및 파일 차단 정책 설정

보안 정책으로 인해 XLS 저장 또는 변환이 차단될 수 있다. 다음을 점검한다.

  • 파일 > 옵션 > 신뢰 센터 > 신뢰 센터 설정 > 파일 차단 설정: “Excel 97-2003 통합 문서” 차단을 “열기 허용”으로 조정한다.
  • 신뢰할 수 있는 위치: 변환 작업 폴더를 신뢰할 수 있는 위치에 추가한다.
  • 매크로 설정: 조직 정책에 따라 “디지털 서명된 매크로만”을 사용한다.
주의 : 기업 환경에서는 그룹 정책이 로컬 설정을 덮어쓴다. GPO에서 Office 보안 템플릿과 파일 차단을 확인해야 한다.

5. 손상 의심 파일 복구 후 변환

  1. 파일 > 열기 > 찾아보기 > 파일 선택 > 열기 버튼 옆 ▼ > “열기 및 복구”를 실행한다.
  2. 복구 실패 시, 데이터만 새 통합 문서로 복사한다.
  3. 시트별 복사: 시트 탭 우클릭 > 이동/복사 > 새 통합 문서로 복사한다.
  4. 개체 제거: 개체 선택 모드로 그림·OLE 개체를 제거하고 다시 저장한다.

6. 자동 변환: VBA 매크로

여러 XLS 파일을 일괄적으로 XLSX 또는 XLSM으로 변환할 수 있다. 보안 정책과 신뢰 센터 설정을 먼저 확인해야 한다.

  
' 모듈에 붙여넣기 Option Explicit
Sub BatchConvertXlsToXlsx()
Dim fso As Object, src As String, tgt As String, f As Object, fl As Object
Dim wb As Workbook, hasVBA As Boolean, newExt As String, fmt As XlFileFormat

src = "C:\XLS_IN\"
tgt = "C:\XLS_OUT\"

Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(tgt) Then fso.CreateFolder tgt

For Each f In fso.GetFolder(src).Files
    If LCase(fso.GetExtensionName(f.Name)) = "xls" Then
        Application.DisplayAlerts = False
        Set wb = Workbooks.Open(Filename:=f.Path, ReadOnly:=False)
        hasVBA = wb.HasVBProject

        If hasVBA Then
            newExt = ".xlsm": fmt = xlOpenXMLWorkbookMacroEnabled
        Else
            newExt = ".xlsx": fmt = xlOpenXMLWorkbook
        End If

        wb.SaveAs Filename:=tgt & fso.GetBaseName(f.Name) & newExt, FileFormat:=fmt, CreateBackup:=False
        wb.Close SaveChanges:=False
        Application.DisplayAlerts = True
    End If
Next f
End Sub

  
주의 : 매크로가 포함된 경우 XLSX로 강제 저장하면 코드가 사라진다. 위 스크립트는 자동으로 XLSM으로 분기한다.

7. 자동 변환: PowerShell+Excel COM

관리자나 배치 서버에서 GUI 없이 대량 변환이 필요할 때 PowerShell을 사용할 수 있다. Office 데스크톱 앱이 설치되어 있어야 한다.

  
# 관리자 PowerShell $src = "C:\XLS_IN" $dst = "C:\XLS_OUT" $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false
Get-ChildItem $src -Filter *.xls -Recurse | ForEach-Object {
$wb = $excel.Workbooks.Open($.FullName)
$hasVBA = $wb.HasVBProject
if ($hasVBA) {
$fmt = 52 # xlOpenXMLWorkbookMacroEnabled
$ext = ".xlsm"
} else {
$fmt = 51 # xlOpenXMLWorkbook
$ext = ".xlsx"
}
$out = Join-Path $dst ($.BaseName + $ext)
$wb.SaveAs($out, $fmt)
$wb.Close($false)
}
$excel.Quit()

  

8. 자동 변환: Python+xlwings

서버에서 Python을 활용할 경우 xlwings를 통해 Excel COM을 제어할 수 있다. 이 또한 Windows와 Excel 설치가 필요하다.

  
import os, xlwings as xw
src = r"C:\XLS_IN"
dst = r"C:\XLS_OUT"
os.makedirs(dst, exist_ok=True)

app = xw.App(visible=False, add_book=False)
try:
for name in os.listdir(src):
if name.lower().endswith(".xls"):
path = os.path.join(src, name)
wb = xw.Book(path)
has_vba = wb.api.HasVBProject
if has_vba:
fmt = 52 # xlOpenXMLWorkbookMacroEnabled
ext = ".xlsm"
else:
fmt = 51 # xlOpenXMLWorkbook
ext = ".xlsx"
out = os.path.join(dst, os.path.splitext(name)[0] + ext)
wb.api.SaveAs(out, FileFormat=fmt)
wb.close()
finally:
app.quit()

  

9. 경로 제한과 파일 시스템 이슈

  • 경로 260자 제한: Windows 10 이상에서 긴 경로 정책을 활성화하거나, 루트 경로로 이동하여 변환한다.
  • 네트워크 공유: 임시로 로컬 드라이브에 복사하여 변환 후 다시 업로드한다.
  • 열려 있는 핸들: 백신, 미리보기, 동기화 클라이언트가 파일을 잡고 있는지 확인한다.
  
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f 
  
주의 : 레지스트리 변경은 조직 정책과 충돌할 수 있다. 변경 전 정책 담당자와 협의한다.

10. 매크로 보존 전략

기존 XLS에서 VBA 프로젝트와 양식을 유지해야 하면 XLSM으로 저장한다. 다음 절차를 따른다.

  1. VBA 편집기에서 모듈·클래스·폼을 파일로 내보낸다.
  2. XLS를 XLSM으로 저장한다.
  3. 문제 발생 시 새 빈 XLSM에 모듈을 다시 가져온다.

11. 스타일 폭증과 이름 범위 오염 정리

외부에서 가져온 XLS는 수천 개의 스타일과 중복 이름 범위를 가지고 있을 수 있다. 이는 저장 시 에러와 파일 비대화를 유발한다.

  
Sub CleanStylesAndNames() Dim st As Style, nm As Name On Error Resume Next For Each st In ActiveWorkbook.Styles If Not st.BuiltIn Then st.Delete Next st On Error GoTo 0 For Each nm In ActiveWorkbook.Names If InStr(1, nm.Name, "_FilterDatabase", vbTextCompare) > 0 Then nm.Delete Next nm End Sub 
  

12. 외부 연결과 PivotCache 재생성

외부 연결이 끊어졌거나 인증이 필요한 경우 변환 중 오류가 난다. 다음을 권장한다.

  1. 데이터 > 연결 편집에서 사용하지 않는 연결을 모두 삭제한다.
  2. 피벗테이블 옵션에서 데이터 원본을 현재 범위로 지정하고 캐시를 새로 만든다.
  3. 통합 문서 닫기 시 피벗 데이터 캐시를 지우도록 설정한다.

13. ActiveX 컨트롤 문제

오래된 XLS에 포함된 ActiveX 컨트롤이 손상되면 저장 실패가 발생한다. 폼 컨트롤로 교체하거나 컨트롤을 제거 후 변환한다.

14. 조직 환경에서의 정책·권한 이슈

  • AppLocker·WDAC 정책으로 Office 자동화가 차단될 수 있다. 허용 목록에 Excel을 추가한다.
  • 네트워크 공유 쓰기 권한이 없으면 로컬로 변환한다.
  • EDR·백신 예외에 변환 작업 폴더를 등록한다.

15. 실무 표준 절차(SOP)

  1. 원본 백업 생성 후 읽기 전용 속성 해제한다.
  2. 차단 해제 및 신뢰할 수 있는 위치로 이동한다.
  3. 공유·보호 해제, 외부 연결 제거, 스타일·이름 범위 정리한다.
  4. 피벗·ActiveX 검토 후 필요 시 제거 또는 교체한다.
  5. 경로 단축 및 로컬 폴더에서 수동 저장 시도한다.
  6. 실패 시 VBA·PowerShell로 자동 변환을 수행한다.
  7. 매크로 보존이 필요하면 XLSM으로, 그렇지 않으면 XLSX로 저장한다.
  8. 변환 후 수식 재계산, 데이터 유효성, 서식, 차트, 연결, 권한을 검증한다.

16. 변환 후 검증 체크리스트

검증 항목 체크 방법 합격 기준
수식 무결성 무작위 10개 셀 수식·값 비교 오차 없음
피벗 동작 새로 고침 수행 오류 메시지 없음
이름 범위 이름 관리자 점검 깨진 참조 없음
데이터 유효성 드롭다운 작동 확인 원래와 동일
조건부 서식 미리보기·인쇄 비교 깨짐 없음
매크로 필요 시 테스트 XLSM에서 정상

17. 자주 묻는 이슈와 해법

  • 날짜 시스템(1900 vs 1904): 다른 날짜 시스템을 쓰는 통합 문서 병합 시 날짜가 어긋난다. 고급 > 계산 옵션에서 통일한다.
  • 서체·차트 깨짐: 시스템에 없는 글꼴은 대체된다. 표준 글꼴로 교체 후 저장한다.
  • 암호화 파일: 암호 해제 후 변환하거나 새 파일에 데이터만 복사한다.
  • 병합된 셀 대량: 변환 후 서식 틀어짐이 있다. 변환 전 표 형태로 정규화한다.

18. 문제 재현과 로그 수집

대량 실패 시 원인을 빠르게 특정하려면 다음 정보를 수집한다.

  1. 오류 메시지 스크린샷과 시간
  2. 원본 파일 크기, 시트 수, 피벗 개수
  3. 외부 연결 목록, 이름 범위 수
  4. 경로 길이, 저장 대상 위치 유형(로컬·네트워크·클라우드)

19. 최소 데이터 손실 전략

어떤 방법으로도 저장이 실패하면 다음 전략을 사용한다.

  1. CSV로 시트별 내보내기 후 새 XLSX에 가져오기
  2. 서식·수식 포기하고 값 붙여넣기
  3. 필수 시트만 분리하여 단계적 변환

20. 문제 유형별 빠른 해결 가이드

유형 진단 기준 해결 레버 대안
보안 차단 차단 해제 메시지 표시 속성 차단 해제, 신뢰 위치 정책 예외 요청
경로 문제 로컬 루트에서 저장되면 성공 경로 단축, LongPaths 활성 ZIP 후 이동
외부 연결 새로 고침 시 오류 연결 제거·값 고정 파워쿼리 재작성
피벗·캐시 피벗 새로 고침 실패 캐시 재생성 피벗을 표로 대체
ActiveX 컨트롤 포함 시만 실패 폼 컨트롤 교체 컨트롤 제거
파일 손상 열기 및 복구만 작동 시트별 복사 CSV 재구성

FAQ

XLS를 바로 XLSX로 저장하면 매크로는 어떻게 되나?

XLSX는 매크로를 저장하지 않는다. 매크로가 있으면 XLSM으로 저장하거나 코드 내보내기 후 XLSX 저장을 해야 한다.

“형식과 확장명이 일치하지 않는다” 경고가 계속 뜨나?

내부 BIFF 구조가 손상되었을 가능성이 높다. 열기 및 복구 실행 후 새 통합 문서로 시트를 복사하여 저장한다.

대량 변환 시 가장 안전한 방식은 무엇인가?

원본을 읽기 전용으로 백업하고, PowerShell 또는 VBA로 자동 변환하되 매크로 포함 여부에 따라 XLSM/XLSX를 분기 저장하는 방식이 안전하다.

경로 제한을 회피하려면 어떻게 하나?

루트 근처 폴더로 이동하여 저장하거나 긴 경로 정책을 활성화한다. 네트워크 드라이브 매핑도 도움이 된다.

변환 후 숫자가 텍스트로 바뀌었다면?

CSV 경유 시 서식이 사라질 수 있다. 텍스트를 숫자로 변환하거나 원본에서 바로 XLSX로 저장한다.