콘텐츠 대표 이미지 - 엑셀 성능 최적화와 대용량 파일 처리 기법
📊 Excel Mastery

엑셀 성능 최적화와 대용량 파일 처리 기법

느려터진 엑셀, 이제 로켓처럼 빠르게 만들어보자 🚀

⚠ 최적화 전 45초 38초 52초 41초 60초 🐌 처리 속도: 느림 최적화! ✨ 마법 적용 ✅ 최적화 후 2초 3초 2초 3초 4초 🚀 처리 속도: 초고속 엑셀 성능 최적화 — 처리 시간 최대 95% 단축 가능
🤔 왜 내 엑셀은 이렇게 느린 걸까?

엑셀 파일을 열었는데 커피 한 잔 마시고 와도 아직 로딩 중... 😭 이런 경험 한 번쯤은 있지? 특히 수만 행짜리 데이터를 다루거나, 복잡한 수식이 잔뜩 들어간 파일을 열 때 엑셀이 마치 1990년대 컴퓨터처럼 굴기 시작하면 정말 답답하잖아.

엑셀이 느려지는 데는 명확한 이유가 있어. 그냥 "컴퓨터가 느려서"가 아니라, 파일 구조와 수식 설계, 데이터 관리 방식에서 비롯된 문제야. 원인을 알면 해결책도 보이거든!

📌 엑셀 성능 저하의 주요 원인
1
휘발성 함수(Volatile Function)의 남용
NOW(), TODAY(), RAND(), OFFSET(), INDIRECT() 같은 함수들은 셀 하나만 바뀌어도 시트 전체를 재계산해버려. 이게 수천 개 있으면? 지옥이지.
2
과도한 조건부 서식(Conditional Formatting)
조건부 서식이 수만 행에 걸쳐 적용되어 있으면 렌더링 부하가 엄청나. 특히 복사-붙여넣기를 반복하면 규칙이 중복으로 쌓여서 파일 크기가 폭발적으로 늘어나.
3
전체 열/행 참조
=VLOOKUP(A1, B:B, 1, 0) 처럼 열 전체를 참조하면 엑셀은 100만 개 이상의 셀을 전부 뒤져. 필요한 범위만 딱 지정하는 게 훨씬 효율적이야.
4
불필요한 빈 셀에 서식 적용
데이터는 A1:A100에만 있는데 서식이 A1:A1048576 전체에 적용되어 있으면 파일 크기가 수십 MB로 뻥튀기돼.
5
중첩 수식과 배열 수식 과다 사용
IF 안에 IF 안에 IF... 이런 중첩 구조나 구형 배열 수식(Ctrl+Shift+Enter)은 계산 비용이 매우 높아.
6
외부 링크와 연결된 수식
다른 파일을 참조하는 수식이 있으면 파일을 열 때마다 외부 파일을 찾아 연결하려 해서 로딩이 엄청 느려져.
💡 핵심 포인트: 엑셀의 계산 엔진은 기본적으로 자동 계산(Automatic Calculation) 모드야. 셀 하나를 수정할 때마다 연결된 모든 수식을 다시 계산해. 이 메커니즘을 이해하는 게 최적화의 출발점이야!
⚙️ 계산 설정 최적화 — 첫 번째 마법

엑셀 최적화의 가장 빠르고 효과적인 방법 중 하나는 계산 모드를 수동으로 전환하는 거야. 특히 대용량 파일 작업 시 이것만으로도 체감 속도가 확 달라져.

🔧 자동 계산 → 수동 계산 전환

수식 탭 → 계산 옵션 → 수동(Manual) 선택
단축키: Ctrl + Alt + F9 (전체 재계산)
또는 VBA로 제어:

' 수동 계산 모드로 전환
Application.Calculation = xlCalculationManual

' 작업 수행 (수식 재계산 없이 빠르게 처리)
' ... 데이터 처리 코드 ...

' 다시 자동 계산으로 복원
Application.Calculation = xlCalculationAutomatic
Application.Calculate ' 한 번만 재계산
⚠️ 주의! 수동 계산 모드로 작업 후 저장하면 다음에 파일을 열 때도 수동 모드가 유지돼. 작업 완료 후 반드시 자동 계산으로 복원하거나, 저장 전에 F9로 전체 재계산을 실행해줘.
🚀 VBA 성능 최적화 3종 세트

VBA 매크로를 실행할 때 이 세 가지를 항상 함께 써줘. 체감 속도가 5~20배 빨라지는 마법이야:

Sub 성능최적화_시작()
    Application.ScreenUpdating = False    ' 화면 갱신 중지
    Application.Calculation = xlCalculationManual  ' 자동계산 중지
    Application.EnableEvents = False      ' 이벤트 처리 중지
    Application.DisplayStatusBar = False  ' 상태바 업데이트 중지
End Sub

Sub 성능최적화_종료()
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayStatusBar = True
    Application.Calculate
End Sub
💡 ScreenUpdating = False가 특히 강력해. 화면을 그리는 작업이 없어지니까 루프 처리 속도가 극적으로 향상돼. 10만 행 처리 시 이것만으로 수십 초를 절약할 수 있어.
📊 계산 모드별 성능 비교
계산 모드 특징 권장 상황
자동(Automatic) 셀 변경 시 즉시 재계산 일반 업무, 소규모 파일
테이블 제외 자동 표(Table) 제외하고 자동 계산 표가 많은 중간 규모 파일
수동(Manual) F9 누를 때만 재계산 대용량 파일, VBA 작업 시
📐 수식 최적화 — 똑똑하게 계산하기

수식 하나하나의 효율이 모이면 전체 파일 성능이 완전히 달라져. 같은 결과를 내더라도 어떤 함수를 쓰느냐에 따라 계산 속도가 수십 배 차이 날 수 있어!

⚡ VLOOKUP vs INDEX+MATCH vs XLOOKUP

가장 많이 쓰는 조회 함수들의 성능 차이를 알아보자:

🐢
VLOOKUP
왼쪽→오른쪽만 가능
열 삽입 시 오류 위험
대용량에서 느림
🐇
INDEX+MATCH
양방향 조회 가능
열 삽입에 안전
VLOOKUP보다 빠름
🚀
XLOOKUP
Excel 2019+ 지원
가장 직관적
성능도 우수
' 느린 방식 (전체 열 참조)
=VLOOKUP(A1, B:D, 2, 0)

' 빠른 방식 (범위 지정)
=VLOOKUP(A1, $B$1:$D$10000, 2, 0)

' 더 빠른 방식 (INDEX+MATCH)
=INDEX($C$1:$C$10000, MATCH(A1, $B$1:$B$10000, 0))

' 가장 현대적인 방식 (XLOOKUP, Excel 365/2019+)
=XLOOKUP(A1, $B$1:$B$10000, $C$1:$C$10000)
🔥 휘발성 함수 대체 전략

앞서 말한 휘발성 함수들을 비휘발성 대안으로 교체하는 게 중요해:

휘발성 함수 (느림) 대체 방법 (빠름)
OFFSET() INDEX() 사용 — 동일한 동적 참조 가능
INDIRECT() 직접 참조 또는 구조화된 참조 사용
NOW(), TODAY() 값으로 붙여넣기 후 필요시만 갱신
RAND(), RANDBETWEEN() 생성 후 값으로 붙여넣기(Ctrl+Shift+V)
💡 SUMIF vs SUMPRODUCT 선택 기준

조건부 합계를 구할 때 어떤 함수가 더 빠를까?

' 단순 조건 합계 → SUMIF가 빠름
=SUMIF($A$1:$A$10000, "서울", $B$1:$B$10000)

' 복합 조건 합계 → SUMIFS 사용
=SUMIFS($B$1:$B$10000, $A$1:$A$10000, "서울", $C$1:$C$10000, ">100")

' 복잡한 계산식 조건 → SUMPRODUCT (단, 느릴 수 있음)
=SUMPRODUCT(($A$1:$A$10000="서울")*($C$1:$C$10000>100)*$B$1:$B$10000)
💡 SUMPRODUCT는 강력하지만 배열 전체를 메모리에 올려서 계산하기 때문에 대용량 데이터에서는 SUMIFS보다 느릴 수 있어. 조건이 단순하다면 SUMIFS를 우선 사용해!
🎯 동적 배열 함수 활용 (Excel 365)

Excel 365에서 도입된 동적 배열 함수들은 기존 배열 수식(Ctrl+Shift+Enter)보다 훨씬 효율적이야:

' 구형 배열 수식 (느림, Ctrl+Shift+Enter 필요)
{=SUM(IF($A$1:$A$1000="서울", $B$1:$B$1000, 0))}

' 신형 동적 배열 (빠름, Enter만 누르면 됨)
=FILTER($B$1:$B$1000, $A$1:$A$1000="서울")
=SORT(데이터범위, 정렬열번호, 1)
=UNIQUE(범위)  ' 중복 제거
=SEQUENCE(행수, 열수, 시작값, 증가값)
수식 성능 비교 차트 100만 행 기준 처리 시간 (낮을수록 좋음) 0 20 40 60 75초 75초 VLOOKUP (전체 열) 50초 VLOOKUP (범위 지정) 30초 INDEX +MATCH 20초 XLOOKUP (365/2019+) 16초 SUMIFS (조건 합계) 7초 동적 배열 (FILTER 등) 느림 빠름 ※ 실제 성능은 데이터 구조, 하드웨어 환경에 따라 다를 수 있음
📦 파일 크기 최적화 — 다이어트 시켜보자

엑셀 파일이 100MB를 넘어가면 열기도 전에 지쳐버리지. 파일 크기를 줄이는 건 성능 향상과 직결돼. 실제로 파일 크기를 80% 이상 줄이는 것도 가능해!

🗑️ 불필요한 서식 제거

파일 크기를 가장 많이 잡아먹는 주범 중 하나가 바로 사용하지 않는 범위의 서식이야.

' 사용 범위 확인 (Ctrl+End로 마지막 셀 확인)
' 실제 데이터가 A1:Z1000에만 있는데
' 서식이 A1:Z1048576 전체에 적용된 경우

' VBA로 사용 범위 외 서식 제거
Sub 서식정리()
    Dim ws As Worksheet
    Dim lastRow As Long, lastCol As Long
    
    For Each ws In ThisWorkbook.Worksheets
        lastRow = ws.UsedRange.Rows.Count
        lastCol = ws.UsedRange.Columns.Count
        
        ' 마지막 행 이후 서식 제거
        If lastRow < ws.Rows.Count Then
            ws.Rows(lastRow + 1 & ":" & ws.Rows.Count).ClearFormats
        End If
        
        ' 마지막 열 이후 서식 제거
        If lastCol < ws.Columns.Count Then
            ws.Columns(lastCol + 1).Resize(, ws.Columns.Count - lastCol).ClearFormats
        End If
    Next ws
    
    MsgBox "서식 정리 완료!"
End Sub
🎨 조건부 서식 최적화
중복 규칙 제거: 홈 → 조건부 서식 → 규칙 관리에서 중복된 규칙 삭제
범위 최소화: 전체 열 대신 실제 데이터 범위만 지정
규칙 수 제한: 한 시트에 조건부 서식 규칙은 최대 50개 이하로 유지
💾 파일 형식 선택의 중요성
파일 형식 특징 권장 용도
.xlsx 표준 형식, XML 기반 압축 일반 업무 파일
.xlsb 바이너리 형식, 가장 작고 빠름 대용량 데이터 파일 ⭐
.xlsm 매크로 포함 형식 VBA 매크로 포함 파일
.xls 구형 형식, 비효율적 사용 지양 ❌
꿀팁! .xlsx 파일을 .xlsb(Excel Binary Workbook)로 저장하면 파일 크기가 50~75% 감소하고 열기/저장 속도도 크게 향상돼. 단, 일부 XML 기반 기능(Power Query 등)은 제한될 수 있어.
🖼️ 이미지 최적화

엑셀에 삽입된 이미지가 파일 크기를 엄청나게 키울 수 있어. 이미지 압축은 필수야!

1
이미지 선택 → 그림 형식 탭 → 그림 압축 클릭
2
전자 메일(96ppi) 또는 웹(150ppi) 해상도 선택
3
"이 통합 문서의 모든 그림에 적용" 체크
🏋️ 대용량 데이터 처리 기법

수십만, 수백만 행의 데이터를 엑셀에서 다뤄야 할 때 어떻게 해야 할까? 그냥 붙여넣기 했다가는 엑셀이 뻗어버리거나 몇 시간이 걸릴 수도 있어. 스마트하게 처리하는 방법을 알아보자!

📊 파워 쿼리(Power Query) — 대용량의 구세주

파워 쿼리는 엑셀에서 대용량 데이터를 처리하는 가장 강력한 도구야. 데이터 탭 → 데이터 가져오기 및 변환에서 접근할 수 있어.

지연 로딩
필요한 데이터만 메모리에 로드해서 처리
🔄
자동 새로고침
원본 데이터 변경 시 한 번에 업데이트
🗜️
열 선택 로드
필요한 열만 선택해서 메모리 절약
🔗
다중 소스
CSV, DB, 웹 등 다양한 소스 연결
💡 파워 쿼리 핵심 팁: 쿼리 편집기에서 "연결만 만들기"로 설정하면 데이터를 시트에 올리지 않고 메모리에서만 처리할 수 있어. 피벗 테이블의 데이터 원본으로 사용하면 엄청난 성능 향상을 경험할 수 있어!
🔢 VBA 배열 처리 — 루프 최적화의 핵심

셀을 하나씩 읽고 쓰는 것은 엑셀에서 가장 느린 작업이야. 대신 배열에 한 번에 읽어서 처리하는 방식을 써야 해:

' ❌ 느린 방식: 셀을 하나씩 읽고 쓰기
Sub 느린방식()
    Dim i As Long
    For i = 1 To 100000
        If Cells(i, 1).Value > 100 Then
            Cells(i, 2).Value = Cells(i, 1).Value * 2
        End If
    Next i
End Sub

' ✅ 빠른 방식: 배열에 한 번에 읽고 처리 후 한 번에 쓰기
Sub 빠른방식()
    Dim arrInput As Variant
    Dim arrOutput() As Variant
    Dim i As Long
    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    ' 한 번에 배열로 읽기 (셀 접근 1회)
    arrInput = Range("A1:A" & lastRow).Value
    ReDim arrOutput(1 To lastRow, 1 To 1)
    
    ' 메모리에서 처리 (셀 접근 없음)
    For i = 1 To lastRow
        If arrInput(i, 1) > 100 Then
            arrOutput(i, 1) = arrInput(i, 1) * 2
        End If
    Next i
    
    ' 한 번에 쓰기 (셀 접근 1회)
    Range("B1:B" & lastRow).Value = arrOutput
End Sub
⚠️ 성능 차이: 10만 행 기준으로 셀 하나씩 처리하면 약 30~60초, 배열 방식으로 처리하면 1~3초야. 약 20~30배 차이! 이게 바로 배열 처리의 위력이야.
📋 피벗 테이블 최적화

피벗 테이블은 대용량 데이터 분석의 핵심 도구지만, 잘못 사용하면 오히려 성능을 잡아먹어:

1
피벗 캐시 공유: 같은 원본 데이터를 사용하는 피벗 테이블은 캐시를 공유하도록 설정해. 메모리 사용량이 크게 줄어들어.
2
자동 새로고침 비활성화: 파일 열 때마다 자동 새로고침하면 느려져. 필요할 때만 수동으로 새로고침해.
3
원본 데이터 저장 해제: 피벗 테이블 옵션 → 데이터 탭 → "원본 데이터를 파일과 함께 저장" 체크 해제로 파일 크기 절감.
4
데이터 모델 활용: 수백만 행 데이터는 파워 피벗(Power Pivot)의 데이터 모델을 사용하면 일반 피벗 테이블보다 훨씬 빠르게 처리돼.
VBA 처리 방식 비교 — 셀 접근 vs 배열 처리 ❌ 느린 방식 (셀 직접 접근) For i = 1 To 100,000 Cells(i,1).Value 읽기 ← 셀 접근! 처리 로직 수행 Cells(i,2).Value 쓰기 ← 셀 접근! Next i (100,000번 반복) ⏱ 처리 시간: ~45초 셀 접근 횟수: 200,000회 ✅ 빠른 방식 (배열 처리) Range("A1:A100000").Value → 배열 (1회) For i = 1 To 100,000 (메모리에서!) arrInput(i,1) 읽기 ← 메모리 접근! arrOutput(i,1) 저장 ← 메모리 저장! Range("B1:B100000").Value = arrOutput (1회) ⚡ 처리 시간: ~2초 셀 접근 횟수: 2회 (읽기 1 + 쓰기 1)
🧠 메모리 관리와 리소스 최적화

엑셀은 생각보다 메모리를 많이 먹어. 특히 32비트 엑셀은 최대 2GB까지만 사용할 수 있어서 대용량 작업 시 메모리 부족 오류가 자주 발생해. 64비트 엑셀을 사용하면 이 제한이 없어지지만, 그래도 메모리 관리는 중요해!

🔧 VBA 메모리 관리 베스트 프랙티스
' 1. 객체 변수 해제 (메모리 누수 방지)
Sub 메모리관리_예시()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim rng As Range
    
    Set wb = Workbooks.Open("C:\data\bigfile.xlsx")
    Set ws = wb.Worksheets(1)
    Set rng = ws.Range("A1:Z100000")
    
    ' 작업 수행
    ' ...
    
    ' 반드시 객체 해제!
    Set rng = Nothing
    Set ws = Nothing
    wb.Close SaveChanges:=False
    Set wb = Nothing
End Sub

' 2. 대용량 배열 처리 후 메모리 해제
Sub 배열메모리해제()
    Dim bigArray() As Variant
    
    ' 대용량 배열 사용
    ReDim bigArray(1 To 1000000, 1 To 10)
    
    ' 작업 수행...
    
    ' 배열 메모리 해제
    Erase bigArray
End Sub
💡 엑셀 32비트 vs 64비트
구분 32비트 엑셀 64비트 엑셀
최대 메모리 약 2GB 시스템 RAM 전체 활용
대용량 처리 메모리 부족 오류 위험 안정적 처리 가능
VBA 호환성 구형 DLL 호환 좋음 일부 구형 코드 수정 필요
권장 상황 구형 매크로 사용 시 대용량 데이터 작업 시 ⭐
🚀 병렬 처리와 멀티스레딩

엑셀 2007부터 멀티스레드 계산(Multi-threaded Calculation)을 지원해. 기본적으로 활성화되어 있지만 확인하고 최적화할 수 있어:

1
파일 → 옵션 → 고급 → "수식" 섹션
2
"멀티 스레드 계산 사용" 체크 확인
3
프로세서 수를 "이 컴퓨터의 모든 프로세서 사용"으로 설정
💡 멀티스레드 계산은 독립적인 수식들을 병렬로 계산해. 단, 수식 간에 의존성이 있으면 순차 계산이 필요해서 효과가 제한될 수 있어. 수식 구조를 독립적으로 설계하면 멀티스레딩 효과를 극대화할 수 있어!
🎯 실전 대용량 파일 처리 전략

이론은 충분히 배웠으니 이제 실전에서 바로 쓸 수 있는 전략들을 정리해볼게. 재능넷 같은 플랫폼에서 데이터 분석 서비스를 제공하는 분들이라면 이 부분이 특히 유용할 거야!

📁 대용량 CSV 파일 처리 전략

수백만 행의 CSV 파일을 엑셀에서 처리해야 할 때 사용하는 전략이야:

' 대용량 CSV를 청크(Chunk) 단위로 처리하는 VBA
Sub CSV_청크처리()
    Dim fileNum As Integer
    Dim lineData As String
    Dim chunkSize As Long
    Dim lineCount As Long
    Dim dataArray() As String
    Dim chunkArray() As Variant
    Dim i As Long
    
    chunkSize = 10000  ' 한 번에 처리할 행 수
    fileNum = FreeFile
    
    Open "C:\data\bigdata.csv" For Input As #fileNum
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    lineCount = 0
    ReDim chunkArray(1 To chunkSize, 1 To 10)
    
    Do While Not EOF(fileNum)
        Line Input #fileNum, lineData
        lineCount = lineCount + 1
        
        dataArray = Split(lineData, ",")
        
        Dim j As Integer
        For j = 0 To UBound(dataArray)
            If j < 10 Then
                chunkArray(lineCount Mod chunkSize + 1, j + 1) = dataArray(j)
            End If
        Next j
        
        ' 청크가 가득 차면 시트에 쓰기
        If lineCount Mod chunkSize = 0 Then
            Dim startRow As Long
            startRow = lineCount - chunkSize + 1
            Sheets(1).Range("A" & startRow).Resize(chunkSize, 10).Value = chunkArray
            ReDim chunkArray(1 To chunkSize, 1 To 10)
            DoEvents  ' UI 응답성 유지
        End If
    Loop
    
    Close #fileNum
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
    MsgBox "처리 완료! 총 " & lineCount & "행 처리됨"
End Sub
🔄 데이터 분할 처리 전략

엑셀의 최대 행 수는 1,048,576행이야. 이를 초과하는 데이터는 반드시 분할 처리해야 해:

1
시트 분할: 100만 행 초과 시 여러 시트로 나눠서 저장
2
파일 분할: 데이터를 날짜, 지역, 카테고리 등으로 분류해서 별도 파일로 저장
3
파워 쿼리 + 피벗: 원본 데이터는 CSV로 유지하고 파워 쿼리로 연결, 피벗 테이블로 분석
4
데이터베이스 연동: 진짜 대용량(수천만 행)은 SQL Server, MySQL 등 DB와 연동해서 엑셀은 분석 도구로만 활용
⚡ 수식을 값으로 변환하는 전략

계산이 완료된 수식은 값으로 변환해서 저장하면 파일 크기와 계산 부하를 크게 줄일 수 있어:

' 선택 범위의 수식을 값으로 변환
Sub 수식을값으로변환()
    Dim rng As Range
    
    ' 현재 선택 범위 또는 특정 범위 지정
    Set rng = Selection  ' 또는 Range("A1:Z10000")
    
    ' 복사 후 값으로 붙여넣기
    rng.Copy
    rng.PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    
    MsgBox "수식이 값으로 변환되었습니다!"
End Sub

' 시트 전체의 수식을 값으로 변환
Sub 시트전체_값변환()
    With ActiveSheet.UsedRange
        .Value = .Value
    End With
End Sub
실전 팁: 매월 마감 후 해당 월의 데이터는 수식을 값으로 변환해서 저장해. 이렇게 하면 과거 데이터가 재계산되지 않아서 파일 성능이 크게 향상돼!
🔬 고급 최적화 기법

기본 최적화를 마스터했다면 이제 한 단계 더 나아가보자. 이 기법들은 엑셀 파워 유저들이 실제로 사용하는 고급 테크닉이야!

🏗️ 엑셀 테이블(Table) 구조 활용

일반 범위 대신 엑셀 테이블(Ctrl+T)을 사용하면 여러 성능상 이점이 있어:

📌
구조화된 참조
[@열이름] 형식으로 명확한 참조 가능
🔄
자동 확장
새 데이터 추가 시 수식 자동 적용
필터 최적화
내장 필터가 일반 범위보다 빠름
🎯 Named Range(이름 정의) 최적화

이름 정의를 잘 활용하면 수식 가독성과 성능을 동시에 높일 수 있어:

' 동적 이름 정의 (데이터 범위가 변해도 자동 추적)
' 수식 탭 → 이름 관리자 → 새로 만들기

' 동적 범위 수식 예시 (OFFSET 대신 INDEX 사용 - 비휘발성!)
' 이름: 동적데이터범위
' 참조 대상: =Sheet1!$A$1:INDEX(Sheet1!$A:$A, COUNTA(Sheet1!$A:$A))

' VBA에서 이름 정의 생성
Sub 이름정의_생성()
    ' 동적 범위 이름 정의
    ThisWorkbook.Names.Add _
        Name:="동적데이터", _
        RefersToR1C1:="=Sheet1!R1C1:INDEX(Sheet1!C1,COUNTA(Sheet1!C1))"
End Sub
🔍 VLOOKUP 대신 Dictionary 객체 활용

수십만 건의 데이터에서 반복적인 조회가 필요할 때 VBA의 Dictionary 객체를 사용하면 VLOOKUP보다 훨씬 빠른 조회가 가능해:

' Dictionary를 활용한 초고속 조회
Sub Dictionary_조회예시()
    Dim dict As Object
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long
    Dim lookupData As Variant
    Dim resultData As Variant
    
    Set dict = CreateObject("Scripting.Dictionary")
    Set ws = ThisWorkbook.Sheets(1)
    
    ' 참조 테이블을 Dictionary에 로드 (1회만 실행)
    lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
    Dim refData As Variant
    refData = ws.Range("D1:E" & lastRow).Value
    
    For i = 1 To UBound(refData, 1)
        If Not dict.Exists(refData(i, 1)) Then
            dict.Add refData(i, 1), refData(i, 2)
        End If
    Next i
    
    ' 조회 데이터 배열로 읽기
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    lookupData = ws.Range("A1:A" & lastRow).Value
    ReDim resultData(1 To lastRow, 1 To 1)
    
    ' Dictionary로 초고속 조회 (해시 테이블 기반)
    For i = 1 To lastRow
        If dict.Exists(lookupData(i, 1)) Then
            resultData(i, 1) = dict(lookupData(i, 1))
        Else
            resultData(i, 1) = "없음"
        End If
    Next i
    
    ' 결과 한 번에 쓰기
    ws.Range("B1:B" & lastRow).Value = resultData
    
    Set dict = Nothing
    MsgBox "완료! Dictionary 조회는 VLOOKUP보다 10~50배 빠릅니다!"
End Sub
💡 Dictionary vs VLOOKUP 성능: 10만 건 조회 기준으로 VLOOKUP은 약 30~60초, Dictionary는 1~3초야. Dictionary는 해시 테이블 기반이라 O(1) 시간 복잡도로 조회하기 때문이야. 대용량 조회 작업에서 게임 체인저야!
📊 파워 피벗(Power Pivot) 활용

일반 엑셀의 한계를 넘어서는 대용량 데이터 분석이 필요하다면 파워 피벗이 답이야:

1
수억 행 처리 가능: 파워 피벗의 xVelocity 엔진은 컬럼 기반 압축 저장으로 수억 행도 처리 가능
2
DAX 수식: Data Analysis Expressions로 복잡한 비즈니스 로직을 효율적으로 표현
3
관계형 데이터 모델: 여러 테이블을 관계로 연결해서 JOIN 없이 분석 가능
4
메모리 내 처리: 데이터를 메모리에 압축 저장해서 디스크 I/O 없이 빠른 분석
🔍 성능 진단과 모니터링

최적화를 하려면 먼저 어디가 병목인지 알아야 해. 엑셀에는 성능을 진단할 수 있는 도구들이 있어!

⏱️ 계산 시간 측정
' 수식/코드 실행 시간 측정
Sub 실행시간측정()
    Dim startTime As Double
    Dim endTime As Double
    
    startTime = Timer  ' 시작 시간 기록
    
    ' 측정할 코드 실행
    ' ... 여기에 코드 ...
    
    endTime = Timer  ' 종료 시간 기록
    
    MsgBox "실행 시간: " & Format(endTime - startTime, "0.000") & "초"
End Sub

' 더 정밀한 측정 (밀리초 단위)
Sub 정밀시간측정()
    Dim startTime As Long
    
    startTime = GetTickCount()  ' Windows API 활용
    
    ' 측정할 코드
    
    MsgBox "실행 시간: " & (GetTickCount() - startTime) & "ms"
End Sub

' Windows API 선언 (모듈 상단에 추가)
#If VBA7 Then
    Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
    Private Declare Function GetTickCount Lib "kernel32" () As Long
#End If
🔎 엑셀 내장 진단 도구
1
파일 → 정보 → 통합 문서 검사: 숨겨진 데이터, 개인 정보, 호환성 문제 등을 진단
2
수식 탭 → 수식 분석: 수식 추적, 오류 검사, 수식 계산 단계별 확인
3
Ctrl+End: 실제 사용 범위의 마지막 셀 확인 (예상보다 훨씬 아래에 있다면 불필요한 서식이 있는 것)
4
파일 크기 모니터링: 저장 전후 파일 크기를 비교해서 최적화 효과 확인
📋 성능 최적화 체크리스트
휘발성 함수(OFFSET, INDIRECT, NOW, TODAY, RAND) 최소화
전체 열/행 참조 대신 정확한 범위 지정
조건부 서식 규칙 수 최소화 및 범위 최적화
불필요한 빈 셀 서식 제거 (Ctrl+End로 확인)
완료된 수식은 값으로 변환
이미지 압축 적용
대용량 파일은 .xlsb 형식으로 저장
VBA 사용 시 ScreenUpdating, Calculation, EnableEvents 제어
VBA 루프에서 배열 처리 방식 사용
외부 링크 최소화 및 관리
64비트 엑셀 사용 (대용량 작업 시)
멀티스레드 계산 활성화 확인
엑셀 성능 최적화 — 효과 크기 한눈에 보기 배열 처리 (VBA) 효과: 매우 높음 (10~30배) ScreenUpdating 비활성화 효과: 높음 (5~20배) 수동 계산 모드 효과: 높음 (3~10배) 휘발성 함수 제거 효과: 중간 (2~5배) xlsb 형식 저장 효과: 중간 (파일 크기 50~75%↓) 이미지 압축 효과: 낮음 (파일 크기 감소) 💡 최적화 우선순위 🥇 1순위: VBA 배열 처리 셀 직접 접근을 배열로 대체 🥈 2순위: 화면/계산 제어 ScreenUpdating + Calculation 조합 🥉 3순위: 수식 구조 개선 휘발성 함수 제거, 범위 최적화 4순위: 파일 형식 변경 .xlsx → .xlsb 변환 5순위: 서식 정리 불필요한 서식, 조건부 서식 제거 6순위: 이미지 최적화 삽입 이미지 압축 적용
🎉 마무리 — 엑셀 최적화 마스터가 되는 길

지금까지 엑셀 성능 최적화와 대용량 파일 처리에 대한 핵심 기법들을 살펴봤어. 처음에는 복잡해 보일 수 있지만, 하나씩 적용해나가다 보면 엑셀이 완전히 다른 도구처럼 느껴질 거야! 🚀

📌 핵심 요약
1
원인 파악이 먼저: 휘발성 함수, 전체 열 참조, 과도한 조건부 서식이 주요 원인
2
VBA 3종 세트: ScreenUpdating, Calculation, EnableEvents를 항상 함께 제어
3
배열 처리: 셀 직접 접근 대신 배열로 한 번에 읽고 쓰기 — 20~30배 속도 향상
4
파일 형식: 대용량 파일은 .xlsb로 저장해서 크기와 속도 동시 개선
5
파워 쿼리/피벗: 진짜 대용량 데이터는 파워 쿼리와 파워 피벗으로 처리
6
Dictionary 활용: 대량 조회 작업에서 VLOOKUP 대신 Dictionary 객체 사용

엑셀 최적화는 한 번에 모든 걸 바꾸려 하기보다 가장 효과가 큰 것부터 하나씩 적용하는 게 좋아. 특히 VBA 배열 처리와 ScreenUpdating 제어는 투자 대비 효과가 가장 크니까 이것부터 시작해봐!

엑셀 관련 스킬을 더 발전시키고 싶다면 재능넷에서 엑셀 전문가들의 강의나 서비스를 찾아보는 것도 좋은 방법이야. 다양한 실무 경험을 가진 전문가들이 맞춤형 도움을 줄 수 있거든!

최종 목표: 느려터진 엑셀 파일을 로켓처럼 빠르게 만들어서, 커피 마시러 갔다 와도 아직 로딩 중인 상황을 영원히 없애버리자! ☕→🚀
댓글 작성

이 글에 대한 여러분의 생각을 들려주세요

댓글 0