
엑셀 INDIRECT 함수 한계까지 쓰는 법: 시트·범위·드롭다운까지 “동적 참조” 완전정복
엑셀 INDIRECT 함수는 “문자(텍스트)로 적힌 주소를 진짜 셀 참조로 바꿔” 수식이 시트/범위/열 선택에 따라 자동으로 바뀌게 만들어 줍니다. 하지만 잘못 쓰면 #REF! 오류와 성능 저하(volatile)로 파일이 급격히 느려질 수 있습니다. 이 글은 실무에서 안 깨지고 빠르게 돌아가도록 INDIRECT를 끝까지 활용하는 패턴을 정리합니다.
빠른 해결(Quick Fix): 바로 복붙 8패턴
드롭다운으로 시트명 바꿔서 값 가져오기
=INDIRECT("'"&$B$1&"'!B2")범위를 SUM
=SUM(INDIRECT("'"&$B$1&"'!B2:B100"))R1C1 스타일(상대 위치)
=INDIRECT("R[0]C[-1]", FALSE)ADDRESS로 주소 만들고 INDIRECT로 실행
=INDIRECT(ADDRESS($E$2,$F$2))헤더 선택 → 해당 열 값 가져오기(개념형)
=LET(hdr,$B$1, col,MATCH(hdr,Sales!$1:$1,0), row,MATCH($A4,Sales!$A:$A,0), INDIRECT("Sales!"&ADDRESS(row,col)))종속 드롭다운(카테고리→상품)
=INDIRECT(SUBSTITUTE($A$2," ","_"))외부 통합문서(닫힌 파일) 참조는 원칙적으로 불가 (닫혀 있으면 #REF!)
느리면: 테이블 + INDEX/MATCH 중심 설계로 전환
엑셀 INDIRECT 함수가 막히는 진짜 이유
“텍스트 참조”의 정체
INDIRECT(ref_text, [a1])는 ref_text(문자열) 안의 주소를 실제 참조로 바꿉니다. 즉, “문자열 → 참조” 변환기입니다.
A1 vs R1C1
- a1=TRUE(기본): A1 스타일 (예: B2)
- a1=FALSE: R1C1 스타일 (예: R[1]C[-1])
volatile(재계산) 때문에 느려지는 구조
INDIRECT는 volatile 함수라 재계산 트리거가 커질 수 있습니다. 대용량 파일에서 INDIRECT가 많아지면 체감 성능이 급격히 떨어질 수 있습니다.
실무 패턴 1: 시트 이름을 셀에서 바꿔서 가져오기(월별 시트)
상황: Jan/Feb 같은 월별 시트에서, Summary 시트의 B1(드롭다운) 선택에 따라 값이 바뀌는 템플릿.
샘플 데이터
| 시트 | Item | Qty | Price |
|---|---|---|---|
| Jan | T001 | 2 | 19000 |
| Jan | T002 | 1 | 25000 |
| Feb | T001 | 3 | 19000 |
| Feb | T002 | 2 | 25000 |
Qty 가져오기
=INDEX(INDIRECT("'"&$B$1&"'!A:C"), MATCH($A4, INDIRECT("'"&$B$1&"'!A:A"), 0), 2)
Price 가져오기
=INDEX(INDIRECT("'"&$B$1&"'!A:C"), MATCH($A4, INDIRECT("'"&$B$1&"'!A:A"), 0), 3)
Amount
=B4*C4
실무 패턴 2: ADDRESS+MATCH+INDIRECT로 “열/행을 선택”하는 보고서 만들기
상황: 헤더(예: 2025-01, 2025-02)를 드롭다운으로 선택하면 해당 열의 값을 자동 조회.
=LET(
hdr, $B$1,
col, MATCH(hdr, Sales!$1:$1, 0),
row, MATCH($A4, Sales!$A:$A, 0),
INDIRECT("Sales!"&ADDRESS(row, col))
)
드롭다운 클릭 경로: Report 시트 B1 선택 → 데이터 탭 → 데이터 유효성 검사 → 목록(List) → 원본: Sales!$C$1:$D$1
실무 패턴 3: 가변 범위(끝까지 자동) 만들기 — 합계/평균/차트까지
(A) INDIRECT 버전
=SUM(INDIRECT("B2:B"&COUNTA(B:B)))
(B) 추천 대체(비휘발): INDEX 버전
=SUM(B2:INDEX(B:B, COUNTA(B:B)))
실무 패턴 4: 종속 드롭다운(데이터 유효성 검사)에서 INDIRECT
핵심: 이름 관리자에서 Shoes, Tops 같은 “목록 범위 이름”을 만들고, B2 목록 원본에 INDIRECT를 씁니다.
카테고리(A2) 목록 원본: Shoes,Tops
상품(B2) 목록 원본:
=INDIRECT($A$2)
공백 대응(실무형)
=INDIRECT(SUBSTITUTE($A$2," ","_"))
대체 방법/최적화 체크리스트
- INDIRECT가 많아지면 파일이 느려질 수 있습니다(volatile).
- 가능하면 테이블(구조화 참조) + INDEX/MATCH로 “참조를 텍스트로 만들지 않는” 설계가 안전합니다.
- 외부 통합문서(닫힌 파일)는 INDIRECT로 직접 참조가 제한됩니다(#REF!).
Troubleshooting
| 증상 | 원인 | 해결 |
|---|---|---|
| #REF! | 시트명 오타/따옴표 누락/범위 없음 | 먼저 문자열을 셀에 출력해 눈으로 검증 |
| #REF! (외부 파일) | 원본 통합문서가 닫혀 있음 | 원본 열기 또는 Power Query로 가져오기 전환 |
| #VALUE! | MATCH 실패 | MATCH를 0(정확일치)로, 키 값 공백/형식 점검 |
| #NAME? | 이름 정의 불일치 | SUBSTITUTE로 정규화 후 이름 정의 일치 |
| 느림 | volatile 누적 | 가변 범위는 INDEX로, 구조는 테이블로 전환 |
관련 글(내부 링크)
- 깨지지 않는 조회 수식: INDEX MATCH 가이드
- VLOOKUP vs XLOOKUP 차이·활용·오류 해결
- VLOOKUP + OFFSET로 이동 범위(가변 범위) 만들기
- 엑셀 IF 함수 한계까지: LET 최적화
- TEXTSPLIT로 텍스트 분해 자동화