- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀 호환 모드로 인해 특정 기능이 작동하지 않을 때, 원인 진단부터 근본 해결까지 실무자가 즉시 적용할 수 있는 절차와 체크리스트를 제공하는 것이다.
왜 ‘호환 모드’가 문제를 만드는가
호환 모드는 주로 오래된 파일 형식(.xls, .xlt, .xla 등)을 열었을 때 자동으로 적용되며, 최신 엑셀 기능 일부가 비활성화되거나 대체 동작을 하도록 제한한다. 이로 인해 동적 배열 함수, 데이터 모델, 피벗테이블의 고급 기능, 슬라이서, 스파크라인, 조건부 서식 다중 규칙, 도형 효과, 매크로 보안 모델 등 최신 기능이 정상적으로 동작하지 않을 수 있다.
또한 파일이 네트워크/메일에서 온 경우 보호된 보기가 함께 적용되어 편집이 차단되거나 외부 연결이 막혀 기능이 멈춘 것처럼 보일 수 있다. 호환 모드와 보호된 보기는 독립된 메커니즘이지만, 현장에서는 두 조건이 동시에 걸려 복합적인 문제로 나타나는 경우가 많다.
증상별 빠른 진단 표
| 증상 | 가능 원인 | 우선 조치 |
|---|---|---|
| 동적 배열(XLOOKUP, FILTER, UNIQUE 등) 오류 또는 인식 불가 | .xls 형식으로 열려 호환 모드 작동, 계산 엔진이 구버전 호환 경로 사용 | 다른 이름으로 저장→.xlsx 또는 .xlsm 변환 후 다시 계산 |
| 피벗 슬라이서/타임라인 버튼 회색 비활성 | 파일 형식 제한(.xls), 데이터 모델 사용 불가 | .xlsx/.xlsm 변환 및 데이터 모델에 이 데이터 추가로 다시 작성 |
| 스파크라인 삽입 메뉴 비활성 | .xls에서 스파크라인 미지원 | .xlsx 변환 후 삽입 |
| 조건부 서식이 일부만 적용 | .xls 규칙 수·우선순위 제한 | .xlsx 변환 후 규칙 정리 |
| 매크로가 참조 오류 발생 | 구식 .xla 참조, 32/64비트 API 선언 불일치, 보호된 보기 | 편집 사용, 신뢰할 수 있는 위치 지정, 참조 경로 재설정, PtrSafe 선언 점검 |
| 행 65,536 이후 데이터 소실 또는 가져오기 실패 | .xls 행·열 한계(65,536×256) | .xlsx/.xlsb로 변환 후 원본 소스 재가져오기 |
| 파워쿼리/데이터 모델 로드 실패 | .xls 저장 형식, 외부 연결 차단 | .xlsx/.xlsm 변환, 보호된 보기 해제 후 다시 로드 |
근본 해결 원칙 3가지
- 저장 형식 현대화: .xls, .xlt, .xla 파일은 즉시 .xlsx(매크로 없을 때) 또는 .xlsm(매크로 있을 때)로 변환한다.
- 호환성 검사 통과: 변환 후 파일 > 정보 > 문제 확인 > 호환성 검사를 수행하여 남은 제한 요소를 제거한다.
- 보호된 보기/신뢰 센터 정비: 편집이 차단되는 경우 편집 사용 버튼을 눌러 테스트하고, 조직 정책에 맞게 신뢰할 수 있는 위치를 사용한다.
.XLS → .XLSX/.XLSM 변환 절차(표준)
- 문서를 연다. 제목 표시줄에 [호환 모드]가 보이는지 확인한다.
- 파일 > 다른 이름으로 저장을 선택한다.
- 파일 형식을 Excel 통합 문서(*.xlsx) 또는 Excel 매크로 사용 통합 문서(*.xlsm)로 지정한다.
- 저장 후 다시 열어 기능이 활성화되는지 확인한다.
- 파일 > 정보에서 문제 확인 > 호환성 검사를 실행하여 잔여 경고를 처리한다.
대량 변환이 필요할 때: VBA 일괄 변환 스크립트
다수의 .xls 파일을 안전하게 .xlsx로 변환하는 표준 매크로이다. 백업 폴더를 선행 생성한다.
' 모듈에 추가 Option Explicit
Sub BatchConvertXLS2XLSX()
Dim fso As Object, fld As Object, fil As Object
Dim srcPath As String, bakPath As String, newPath As String
Dim wb As Workbook
Application.ScreenUpdating = False
Application.DisplayAlerts = False
srcPath = "C:\Data\XLS" ' 변환 대상 폴더
bakPath = "C:\Data\XLS\_backup" ' 백업 폴더
newPath = "C:\Data\XLSX" ' 변환 결과 폴더
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(bakPath) Then fso.CreateFolder bakPath
If Not fso.FolderExists(newPath) Then fso.CreateFolder newPath
Set fld = fso.GetFolder(srcPath)
For Each fil In fld.Files
If LCase(fso.GetExtensionName(fil.Name)) = "xls" Then
Set wb = Workbooks.Open(fil.Path, Local:=True)
' 원본 백업
wb.SaveCopyAs fso.BuildPath(bakPath, fso.GetFileName(fil.Path))
' 매크로 존재 여부 판별
If HasVBProject(wb) Then
wb.SaveAs fso.BuildPath(newPath, fso.GetBaseName(fil.Name) & ".xlsm"), FileFormat:=xlOpenXMLWorkbookMacroEnabled
Else
wb.SaveAs fso.BuildPath(newPath, fso.GetBaseName(fil.Name) & ".xlsx"), FileFormat:=xlOpenXMLWorkbook
End If
wb.Close SaveChanges:=False
End If
Next fil
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox "변환 완료"
End Sub
Private Function HasVBProject(wb As Workbook) As Boolean
On Error Resume Next
HasVBProject = Not wb.VBProject Is Nothing And wb.VBProject.VBComponents.Count > 0
End Function
보호된 보기로 인한 기능 차단 확인
- 리본 상단에 보호된 보기 표시가 있으면 편집 사용을 눌러 즉시 재현 시험을 한다.
- 자주 열어야 하는 신뢰된 파일은 파일 > 정보 > 파일 보호 > 이 파일을 신뢰할 수 있는 문서로 설정을 적용한다.
- 조직 공용 폴더라면 신뢰할 수 있는 위치로 지정하는 방안을 검토한다.
형식별 기능 지원 차이 요약
| 항목 | .xls | .xlsx | .xlsm |
|---|---|---|---|
| 최대 행×열 | 65,536×256 | 1,048,576×16,384 | 1,048,576×16,384 |
| 동적 배열(XLOOKUP 등) | 미지원 | 지원 | 지원 |
| 데이터 모델/파워피벗 | 미지원 | 지원 | 지원 |
| 파워쿼리 | 제한적 | 지원 | 지원 |
| 스파크라인 | 미지원 | 지원 | 지원 |
| 매크로 | 지원(.xls) | 미지원 | 지원 |
| 조건부 서식 | 제한 큼 | 확장 | 확장 |
현장 표준 운영 절차(SOP) 제안
- 접수 단계 : 파일 확장자 확인, 제목 표시줄의 [호환 모드] 여부 기록, 보호된 보기 상태 기록한다.
- 진단 단계 : 사용하려는 기능 목록을 체크하고, 표에서 형식별 지원 여부를 대조한다.
- 처리 단계 : 변환(.xlsx/.xlsm) → 기능 재구성(슬라이서, 데이터 모델) → 외부 연결/매크로 재설정 순서로 수행한다.
- 검증 단계 : 호환성 검사, 수식 재계산, 성능 테스트(파일 크기, 열기/계산 시간) 결과를 기록한다.
- 인계 단계 : 사용자에게 새 형식만 유지하도록 지침을 제공하고, 기본 저장 형식을 OpenXML 계열로 고정한다.
기본 저장 형식 변경(재발 방지)
- 파일 > 옵션 > 저장으로 이동한다.
- 다음 형식으로 파일 저장을 Excel 통합 문서(*.xlsx) 또는 Excel 매크로 사용 통합 문서(*.xlsm)로 지정한다.
- 팀 공용 템플릿(.xlt, .xltx, .xltm)을 최신 형식으로 교체한다.
함수·수식 호환 재작성 팁
- VLOOKUP→XLOOKUP 전환 시 .xls에서는 동작하지 않으므로 반드시 형식 변환 후 적용한다.
- 동적 배열이 막힌 경우 임시로 Ctrl+Shift+Enter 배열 수식으로 대체할 수 있으나, 유지보수성이 떨어지므로 변환 후 표준화한다.
- 날짜·시간·지역설정 이슈는
TEXT(값,"yyyy-mm-dd")같이 명시적 서식을 사용해 변환 후 점검한다.
파워쿼리/데이터 모델 복구 체크리스트
- .xlsx 또는 .xlsm 형식으로 저장했는지 확인한다.
- 데이터 > 쿼리 및 연결에서 각 쿼리를 열고 새로 고침 미리 보기를 수행한다.
- 자격 증명(Windows/Organization/Microsoft 계정)을 다시 바인딩한다.
- 모델에 로드가 해제된 경우 이 데이터 모델에 추가를 다시 체크한다.
매크로 참조 및 API 호환성
구버전 .xla 참조 또는 32비트 전용 API 선언은 최신 환경에서 실패할 수 있다. 변환 이후 개발 도구 > VBA → 도구 > 참조에서 MISSING 항목을 교체한다. 64비트 오피스에서는 API 선언에 PtrSafe와 LongPtr를 사용한다.
' 64비트 호환 예시 #If VBA7 Then Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #Else Private Declare Function GetTickCount Lib "kernel32" () As Long #End If 호환 모드 여부를 코드로 감지
자동화 시 현재 통합 문서가 호환 모드인지 감지하여 경고하고 저장 형식을 권고한다.
Sub WarnIfCompatibilityMode() Dim ff As XlFileFormat ff = ActiveWorkbook.FileFormat Select Case ff Case xlExcel8, xlExcel9795 ' .xls 계열 MsgBox "이 통합 문서는 호환 모드(.xls)이다. .xlsx/.xlsm으로 변환하라." Case Else ' 최신 형식 End Select End Sub PowerShell로 대량 변환(IT 전용)
서버나 배치 환경에서 COM 자동화를 사용하여 변환할 수 있다. 관리자 권한과 백업이 전제되어야 한다.
# PowerShell 5.x 예시 $src = "C:\Data\XLS" $dst = "C:\Data\XLSX" New-Item -ItemType Directory -Force -Path $dst | Out-Null
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
Get-ChildItem -Path $src -Filter *.xls -Recurse | ForEach-Object {
$wb = $excel.Workbooks.Open($.FullName)
$target = Join-Path $dst ($.BaseName + ".xlsx")
$wb.SaveAs($target, 51) # 51 = xlOpenXMLWorkbook
$wb.Close($false)
}
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
흔한 함정과 회피 전략
- 템플릿이 구형: 신규 문서가 자동으로 .xls로 생성되는 경우 팀 템플릿을 .xltx/.xltm으로 교체한다.
- 메일 첨부 즉시 편집: 보호된 보기 상태에서 테스트 결과를 판단하지 말고, 신뢰 절차 후 재현한다.
- 섞인 범위/테이블: 호환 모드에서 표(ListObject)가 자동 범위로 강등될 수 있다. 변환 후 표로 다시 정의한다.
- 외부 추가 기능: 구형 .xla 기능 추가 도구는 .xlam 최신 버전으로 대체한다.
현장 체크리스트(인쇄용)
| # | 점검 항목 | 상태/메모 |
|---|---|---|
| 1 | 제목 표시줄 [호환 모드] 여부 확인 | |
| 2 | 파일 확장자 .xls/.xlt/.xla 여부 확인 | |
| 3 | .xlsx/.xlsm으로 변환 완료 | |
| 4 | 보호된 보기 해제 후 기능 재시험 | |
| 5 | 호환성 검사 경고 0 확인 | |
| 6 | 동적 배열·데이터 모델 기능 정상 동작 | |
| 7 | 매크로 참조 및 API 선언 64비트 호환 | |
| 8 | 팀 템플릿 최신 형식 교체 | |
| 9 | 기본 저장 형식 OpenXML 계열 설정 | |
| 10 | 신뢰할 수 있는 위치/문서 정책 반영 |
FAQ
.xlsb로 저장해도 호환 모드가 생기나?
.xlsb는 바이너리 OpenXML 형식으로 호환 모드가 아니다. 최신 기능 대부분을 지원하며, 대용량에서 성능과 용량 측면의 이점이 있다. 매크로가 있다면 .xlsb 또는 .xlsm 중 정책에 맞는 형식을 사용한다.
매크로가 있는 .xls를 .xlsx로 바꾸면 어떻게 되나?
.xlsx는 매크로를 저장하지 못한다. 매크로가 필요하면 .xlsm 또는 .xlsb로 변환해야 하며, 자동 변환 스크립트에서도 매크로 존재 여부를 탐지해 .xlsm으로 저장하는 로직을 사용한다.
호환성 검사에서 경고가 계속 나오면?
해당 요소를 최신 대체 기능으로 재작성해야 한다. 예를 들어 자동서식 대신 표(ListObject)와 조건부 서식을 사용하고, 오래된 차트 유형이나 3D 효과는 표준 차트로 교체한다.
슬라이서가 비활성일 때 빠른 해결책은?
먼저 파일 형식을 .xlsx/.xlsm으로 바꾸고, 데이터 원본을 테이블 또는 데이터 모델로 구성한다. 피벗테이블 보고서가 구식 범위 기반이라면 새 피벗으로 재작성한다.
보호된 보기 없이도 기능이 안 되는 경우는?
대부분 파일 형식 문제다. 제목 표시줄의 [호환 모드]를 확인하고, 변환 후에도 지속된다면 추가 기능 충돌이나 정책 제한을 점검한다.