=INDIRECT(E2)는 E2에 텍스트로 적힌 주소의 셀을 읽습니다. E2에 C4라고 적혀 있으면 수식은 C4의 값을 반환합니다. 주소는 조각을 이어 붙여 만들 수도 있습니다. =INDIRECT("C"&E3)는 C열의 E3번째 행을 읽습니다.
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Address | Value | |
| 2 | Apple | Fruit | $1.20 | C4 | $0.80 | |
| 3 | Pear | Fruit | $1.50 | 6 | $1.10 | |
| 4 | Carrot | Vegetable | $0.80 | |||
| 5 | Bread | Bakery | $2.40 | |||
| 6 | Milk | Dairy | $1.10 |
F2는 Carrot의 가격이 있는 C4를 읽어 $0.80을 냅니다. E2를 C3이나 B5로 바꾸면 F2가 따라 바뀝니다. F3은 "C"와 E3의 6을 이어 주소 C6을 만들고 $1.10을 반환합니다. E3을 2로 바꾸면 Apple의 가격이 나옵니다.
INDIRECT 구문
=INDIRECT(ref_text, [a1])
ref_text: 참조를 나타내는 텍스트입니다:"C4","B2:B6","Prices!A2","'Price list'!A2:B9".a1: A1 스타일 주소이면TRUE또는 생략합니다.FALSE는 R1C1 스타일로 읽으며,"R4C3"은 4행 3열을 뜻합니다. 행과 열이 모두 숫자일 때 잘 맞습니다.
텍스트가 올바른 주소가 아니면 결과는 #REF!입니다. INDIRECT는 실제 참조를 반환하므로 SUM, COUNTIF, VLOOKUP 등 범위를 받는 모든 함수 안에서 동작합니다.
숫자로 범위 만들기
주소는 범위 전체일 수도 있습니다. 숫자를 이어 붙이면 셀 값에 따라 크기가 정해지는 범위가 됩니다.
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Month | Sales | Rows | Total | ||
| 2 | Jan | 4,200 | 3 | 12,900 | ||
| 3 | Feb | 3,900 | ||||
| 4 | Mar | 4,800 | ||||
| 5 | Apr | 5,100 | ||||
| 6 | May | 4,600 | ||||
| 7 | Jun | 5,300 |
E2가 3이면 텍스트는 B2:B4가 되고, F2는 Jan부터 Mar까지 더해 12,900을 냅니다. E2를 6으로 바꾸면 반기 합계 27,900이 나옵니다. 데이터가 2행에서 시작하므로 1+E2를 씁니다. 같은 합계를 INDIRECT 없이 =SUM(B2:INDEX(B2:B7,E2))로 쓸 수도 있으며, 이쪽은 휘발성이 아닙니다. 방법들은 OFFSET 페이지에서 비교합니다.
셀에 적힌 이름의 시트 참조하기
시트 이름도 셀에서 가져올 수 있습니다. 그러면 요약 수식 하나가 여러 시트를 조회하게 됩니다. 각 행이 A열에 적힌 이름의 시트를 읽습니다. 이름을 작은따옴표로 감싸면 공백이 든 이름에서도 동작합니다.
| A | B | |
|---|---|---|
| 1 | Month | Total |
| 2 | Jan | 12,500 |
| 3 | Feb | 12,200 |
| 4 | Mar | 13,700 |
B2는 텍스트 'Jan'!B2:B4를 만들어 합계 12,500을 냅니다. B3과 B4는 아래로 채운 같은 수식이라 Feb(12,200)와 Mar(13,700)를 읽습니다. Feb 탭을 열어 숫자를 바꾸면 요약이 따라 바뀝니다. A2의 Jan을 Feb로 덮어쓰면 B2가 이제 Feb의 합계를 냅니다. 따옴표 안의 B2:B4는 텍스트이므로 수식을 아래로 채워도 바뀌지 않고, A2 참조만 바뀝니다.
종속 드롭다운 목록
첫 번째 드롭다운에 따라 항목이 달라지는 두 번째 드롭다운은 INDIRECT의 대표적인 쓰임입니다. 엑셀에서 흔히 쓰는 설정은 다음과 같습니다:
- 범주마다 항목을 한 열에 두고, 각 범위에 범주 이름을 붙입니다. 머리글을 포함해 열들을 선택하고 수식 > 선택 영역에서 만들기 > 첫 행을 씁니다. 그러면
Fruit,Vegetable,Dairy라는 이름이 만들어집니다. - A2에 범주 목록을 설정합니다: 데이터 > 데이터 유효성 검사 > 제한 대상: 목록, 원본
Fruit,Vegetable,Dairy. - B2에 원본이
=INDIRECT(A2)인 목록을 설정합니다. A2가 Fruit이면 목록이 Fruit이라는 이름의 범위를 읽습니다.
아래 시트는 이름 있는 범위 대신 범주마다 시트를 두어 같은 것을 만듭니다. D2는 INDIRECT로 A2에 적힌 시트의 항목을 분산하고, B2의 목록은 D2:D4를 읽습니다.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Category | Item | Items for the category | |
| 2 | Fruit | Apple | Apple | |
| 3 | Pear | |||
| 4 | Plum |
A2에서 Dairy를 고르면 D2:D4가 Milk, Butter, Cheese로 바뀌고, B2의 선택지도 바뀝니다. B2는 새 값을 고를 때까지 이전 값을 유지합니다. 엑셀도 똑같이 동작하므로 양식에는 흔히 항목 옆에 =COUNTIF(D2:D4,B2)>0 같은 검사를 덧붙입니다. Excel 365에서는 이름 있는 범위 없이 두 번째 목록이 분산된 수식을 가리키게 할 수 있습니다. 예를 들어 도우미 셀에 =INDIRECT("'"&A2&"'!A2:A4")를 두고 원본에 =D2#을 씁니다. 나머지 설정은 드롭다운 목록 페이지에 있습니다.
INDIRECT는 휘발성이고 삽입된 행을 무시합니다
INDIRECT가 참조 대신 텍스트를 읽기 때문에 생기는 부작용이 두 가지 있습니다:
- 변경이 있을 때마다 다시 계산됩니다. 엑셀은 텍스트가 어떤 셀을 가리킬지 알 수 없으므로, 통합 문서 어디에서든 편집이 있으면 모든 INDIRECT를 다시 계산합니다. 수십 개는 해가 없지만, 수만 개면 키를 누를 때마다 느려집니다. 행 번호를 쓰는 INDEX(
=INDEX(C:C,E3))는=INDIRECT("C"&E3)와 같은 결과를 내면서 입력이 바뀔 때만 다시 계산됩니다. - 주소가 움직이지 않습니다. 4행 위에 행을 삽입하면
=C4는=C5가 되지만,=INDIRECT("C4")는 여전히 C4를 읽고, 그 행은 이제 다른 행입니다. 시트에 무슨 일이 생기든 고정된 셀에 머물러야 하는 참조라면 이것이 바로 목적일 때도 있습니다. 하지만 누군가 행을 삽입하기만 기다리는 버그일 때가 더 많습니다.
다른 통합 문서를 가리키는 INDIRECT는 그 통합 문서가 열려 있을 때만 동작하며, 닫혀 있으면 #REF!를 반환합니다.
연습: 행 번호로 가격 가져오기
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Product | Category | Price | Row | Price | |
| 2 | Apple | Fruit | $1.20 | 5 | ||
| 3 | Pear | Fruit | $1.50 | |||
| 4 | Carrot | Vegetable | $0.80 | |||
| 5 | Bread | Bakery | $2.40 | |||
| 6 | Milk | Dairy | $1.10 |
직접 해 보세요: F2에서 INDIRECT를 써서 E2에 적힌 행 번호의 C열 가격을 반환하세요.
자주 묻는 질문
엑셀 INDIRECT는 무엇을 하나요?
텍스트를 참조로 바꿉니다. =INDIRECT("C4")는 C4의 값을, =INDIRECT(E2)는 E2에 적힌 셀 주소의 값을 반환합니다. 주소는 &로 만들 수 있으므로 =INDIRECT("C"&E2)는 C열의 E2번째 행을 읽습니다.
셀에 이름이 적힌 다른 시트를 참조하려면 어떻게 하나요?
시트 이름을 작은따옴표로 감싸 주소를 만듭니다: =INDIRECT("'"&A2&"'!B2"). 따옴표가 있으면 공백이 든 이름에서도 동작합니다. =SUM(INDIRECT("'"&A2&"'!B2:B4"))는 그 시트의 범위 합계를 냅니다.
INDIRECT가 #REF!를 반환하는 이유는 무엇인가요?
텍스트가 올바른 주소가 아니거나, 없는 시트를 가리키거나, 닫혀 있는 다른 통합 문서를 가리키기 때문입니다. INDIRECT 없이 같은 식만 셀에 넣어 수식이 만드는 텍스트를 확인해 보세요.
INDIRECT는 휘발성 함수인가요?
그렇습니다. 텍스트가 어떤 셀을 가리킬지 미리 알 수 없기 때문에, 엑셀은 통합 문서 어디에서든 변경이 생길 때마다 모든 INDIRECT를 다시 계산합니다. 몇 개는 문제없지만 수천 개면 통합 문서가 느려집니다. INDEX가 휘발성 없이 같은 일을 하는 경우가 많습니다.