Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀 호환 모드로 인해 특정 기능이 작동하지 않을 때, 원인 진단부터 근본 해결까지 실무자가 즉시 적용할 수 있는 절차와 체크리스트를 제공하는 것이다.
호환 모드는 주로 오래된 파일 형식(.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 변환, 보호된 보기 해제 후 다시 로드 |
다수의 .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) | 미지원 | 지원 |
| 조건부 서식 | 제한 큼 | 확장 | 확장 |
TEXT(값,"yyyy-mm-dd") 같이 명시적 서식을 사용해 변환 후 점검한다.구버전 .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 서버나 배치 환경에서 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
| # | 점검 항목 | 상태/메모 |
|---|---|---|
| 1 | 제목 표시줄 [호환 모드] 여부 확인 | |
| 2 | 파일 확장자 .xls/.xlt/.xla 여부 확인 | |
| 3 | .xlsx/.xlsm으로 변환 완료 | |
| 4 | 보호된 보기 해제 후 기능 재시험 | |
| 5 | 호환성 검사 경고 0 확인 | |
| 6 | 동적 배열·데이터 모델 기능 정상 동작 | |
| 7 | 매크로 참조 및 API 선언 64비트 호환 | |
| 8 | 팀 템플릿 최신 형식 교체 | |
| 9 | 기본 저장 형식 OpenXML 계열 설정 | |
| 10 | 신뢰할 수 있는 위치/문서 정책 반영 |
.xlsb는 바이너리 OpenXML 형식으로 호환 모드가 아니다. 최신 기능 대부분을 지원하며, 대용량에서 성능과 용량 측면의 이점이 있다. 매크로가 있다면 .xlsb 또는 .xlsm 중 정책에 맞는 형식을 사용한다.
.xlsx는 매크로를 저장하지 못한다. 매크로가 필요하면 .xlsm 또는 .xlsb로 변환해야 하며, 자동 변환 스크립트에서도 매크로 존재 여부를 탐지해 .xlsm으로 저장하는 로직을 사용한다.
해당 요소를 최신 대체 기능으로 재작성해야 한다. 예를 들어 자동서식 대신 표(ListObject)와 조건부 서식을 사용하고, 오래된 차트 유형이나 3D 효과는 표준 차트로 교체한다.
먼저 파일 형식을 .xlsx/.xlsm으로 바꾸고, 데이터 원본을 테이블 또는 데이터 모델로 구성한다. 피벗테이블 보고서가 구식 범위 기반이라면 새 피벗으로 재작성한다.
대부분 파일 형식 문제다. 제목 표시줄의 [호환 모드]를 확인하고, 변환 후에도 지속된다면 추가 기능 충돌이나 정책 제한을 점검한다.