Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 수십만 행 이상의 큰 파일을 빠르게 열고 계산하며 저장하도록 성능을 체계적으로 최적화하는 실무 절차와 설정값을 제공하는 것이다.
엑셀 성능은 입력 데이터 크기, 수식 구조, 서식 복잡도, 추가기능 및 외부 데이터 처리 방식, 하드웨어 자원에 의해 좌우되며 병목을 정확히 진단한 뒤 단계별로 제거하는 방식이 효율적이다.
| 영역 | 주요 병목 | 핵심 레버 | 우선순위 |
|---|---|---|---|
| 파일 구조 | 형식 비효율, 불필요 시트·이름·객체 | XLSB 저장, 불필요 요소 제거 | 상 |
| 수식 | 휘발성 함수, 전체열 참조, 중복계산 | 도움열, 범위 축소, 계산 모드 관리 | 상 |
| 서식 | 무분별한 조건부 서식, 색채우기·테두리 남발 | 규칙 통합, 표준 테마 최소화 | 중 |
| 데이터 입출 | 복사·붙여넣기 반복, 비접힘 쿼리 | Power Query 접힘, 배치 로드 | 상 |
| VBA/자동화 | 셀 단위 반복, 화면 갱신 | 배열 처리, ScreenUpdating Off | 상 |
| 하드웨어 | RAM 부족, 저장장치 속도 | 64비트 엑셀, SSD, 충분한 메모리 | 중 |
XLSB는 이진 형식으로 저장·열기 속도가 빠르고 파일 크기를 줄이는 데 유리하다.
'VBA로 이름 정의 일괄 삭제 예시 Sub ClearOrphanNames() Dim n As Name For Each n In ThisWorkbook.Names On Error Resume Next If InStr(1, n.RefersTo, "#REF!") > 0 Then n.Delete On Error GoTo 0 Next n End Sub 입력·정규화·분석을 별도 파일로 모듈화하면 열기와 저장이 빨라지며 손상 위험을 낮출 수 있다.
'계산 모드 제어 템플릿 Sub Calc_Manual_Context() Dim prev As XlCalculation prev = Application.Calculation Application.Calculation = xlCalculationManual Application.ScreenUpdating = False '대량 편집 로직 Application.CalculateFullRebuild Application.ScreenUpdating = True Application.Calculation = prev End Sub OFFSET, INDIRECT, TODAY, RAND, NOW, CELL, INFO 등 휘발성 함수는 모든 변경 시 재계산되어 병목이 된다.
'OFFSET 대체 예시 '기존: =SUM(OFFSET(A1,0,0,ROWS(A:A),1)) '대체: =SUM(INDEX(A:A,1):INDEX(A:A,COUNTA(A:A))) =SUMIF(A:A, ...), =VLOOKUP(…, B:B, …) 같은 전체열 참조는 필요 이상 범위를 스캔하므로 성능을 크게 저하시킨다.
동적 배열의 스필 범위를 가급적 좁게 정의하고 필요 시 스필 결과를 값으로 고정한다.
VBA UDF는 셀 단위 호출 오버헤드가 크므로 가능하면 네이티브 함수나 Power Query로 대체한다.
여러 피벗이 같은 데이터 원본을 사용하면 캐시를 공유해 메모리 사용을 줄인다.
주기적 리프레시가 불필요한 중간결과는 값으로 치환하고 원본 수식을 보관 시 별도 시트로 분리한다.
'대용량 처리 표준 래퍼 Sub FastBatch(ByVal work As String) Dim prevCalc As XlCalculation prevCalc = Application.Calculation With Application .ScreenUpdating = False .EnableEvents = False .DisplayStatusBar = True .Calculation = xlCalculationManual .DisplayAlerts = False End With
Select Case work
Case "정규화": Call NormalizeLargeSheet
Case "정리": Call CleanupFormats
Case Else: '업무별 라우팅
End Select
With Application
.DisplayAlerts = True
.Calculation = prevCalc
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
셀을 한 건씩 접근하는 대신 Variant 배열로 한 번에 읽고 계산 후 일괄 쓰기 한다.
Sub NormalizeLargeSheet() Dim rng As Range, v, i As Long Set rng = Sheet1.Range("A1").CurrentRegion v = rng.Value2 For i = 2 To UBound(v, 1) If v(i, 1) = "" Then v(i, 1) = v(i - 1, 1) Next i rng.Value2 = v End Sub 키 인덱스가 있는 경우 Range.Find로 시작 위치를 잡고 Application.Match로 대량 매칭을 수행한다.
Scripting.Dictionary로 중복 제거와 그룹화를 수행하면 속도가 향상된다.
Sub DedupWithDict() Dim dict As Object, r As Range, v, i As Long Set dict = CreateObject("Scripting.Dictionary") v = Range("A2", Cells(Rows.Count, "A").End(xlUp)).Value2 For i = 1 To UBound(v, 1) dict(v(i, 1)) = 1 Next i Range("C2").Resize(dict.Count, 1).Value = WorksheetFunction.Transpose(dict.Keys) End Sub 수백만 행은 데이터 모델에 적재하고 피벗테이블로 분석하는 것이 효율적이다.
계산 열보다 측정값을 우선 사용하여 저장 공간을 줄인다.
대용량 처리에는 64비트 엑셀이 유리하며 시스템 RAM을 충분히 확보해야 한다.
임시 파일과 캐시가 SSD에서 빠르게 동작하므로 저장·열기 시간이 단축된다.
SharePoint나 네트워크 드라이브를 사용할 때는 로컬에 임시 저장 후 배치 업로드하는 전략이 유리하다.
| # | 점검 항목 | 권장 설정·조치 | 검증 방법 |
|---|---|---|---|
| 1 | 파일 형식 | XLSB 저장 | 저장 시간 비교 |
| 2 | UsedRange | 빈 서식 제거 | 파일 크기 감소 확인 |
| 3 | 계산 모드 | 작업 중 수동, 종료 시 재계산 | 상태표시줄 확인 |
| 4 | 휘발성 함수 | INDEX, 구조화 참조로 대체 | 재계산 시간 측정 |
| 5 | 조건부 서식 | 규칙 통합 및 범위 축소 | 서식 관리자 점검 |
| 6 | Power Query | 접힘 유지, 불필요 열 제거 | 미리 보기 단계 성능 체크 |
| 7 | 피벗 캐시 | 공유 캐시 사용 | 피벗 옵션 확인 |
| 8 | VBA 처리 | 배열 읽기·쓰기, 화면 갱신 Off | 실행 시간 로깅 |
| 9 | 데이터 모델 | 관계형 모델로 적재 | 피벗 응답속도 확인 |
| 10 | 하드웨어 | 64비트 엑셀, SSD, 충분한 RAM | 작업관리자·자원 모니터 |
최적화는 측정과 함께 진행해야 한다.
'실행 시간 측정 유틸리티 Function Tick() As Double Tick = Timer End Function
Sub ProfiledCalc()
Dim t As Double: t = Tick
Application.CalculateFull
Debug.Print "Recalc sec:", Format(Tick - t, "0.00")
End Sub
'UsedRange 축소용 포맷 제거 Sub TrimFormats() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.UsedRange ws.Cells.ClearFormats ws.UsedRange Next ws End Sub '조건부 서식 규칙 범위 통일 Sub CF_Consolidate(ByVal wsName As String, ByVal addr As String) Dim ws As Worksheet: Set ws = Worksheets(wsName) Dim fr As FormatCondition For Each fr In ws.Cells.FormatConditions fr.ModifyAppliesToRange ws.Range(addr) Next fr End Sub 파일을 XLSB로 저장하고 계산 모드를 수동으로 바꾼 뒤 UsedRange 정리와 조건부 서식 규칙 통합을 수행하는 것이 우선이다.
반드시 제거하지는 않으나 병목의 주요 원인이므로 사용 위치를 제한하고 대체 함수를 우선 고려해야 한다.
데이터 변환에는 Power Query가 적합하며 집계·분석에는 데이터 모델이 효율적이다.
재계산 중 메모리 부족 경고가 발생하거나 디스크 페이징이 빈번하면 64비트 엑셀과 RAM 증설이 필요하다.
대량 반복 변환은 VBA 배열 처리 또는 Power Query가 빠르며 집계는 수식이나 데이터 모델이 간결하다.