
VLOOKUP, XLOOKUP 한계를 넘는 INDEX MATCH function 완전 정복
VLOOKUP과 XLOOKUP은 이미 너무 유명한 조회 함수죠. 하지만 실제 업무에서 쓰다 보면 왼쪽 열을 못 가져온다, 열을 하나만 삽입해도 수식이 다 깨진다, 구버전에서는 XLOOKUP이 없다 같은 불편이 한두 가지가 아닙니다.
이 글에서는 INDEX MATCH function 조합으로 이런 한계를 깨는 방법을, 실무 예제와 함께 단계별로 정리합니다. 끝까지 따라오시면 “조회가 조금 불편한 파일”을 유연하고 튼튼한 조회 엔진으로 바꾸는 감각을 얻을 수 있을 거예요.
빠른 해결(Quick Fix): VLOOKUP에서 INDEX MATCH function으로 갈아타기
먼저 “이론은 나중에, 당장 갈아탈 수식부터” 보겠습니다.
가장 흔한 VLOOKUP 패턴을 예로 들면:
=VLOOKUP($G$2, $A$2:$D$101, 4, FALSE)
위 수식은 G2에 있는 상품코드를 A열에서 찾고, 4번째 열(D열)의 값을 가져옵니다. 이걸 INDEX MATCH function 조합으로 바꾸면:
=INDEX($D$2:$D$101, MATCH($G$2, $A$2:$A$101, 0))
바뀐 점은 단 두 가지입니다.
- INDEX(가져올_열범위, 행번호)
- MATCH(찾을값, 찾을_열범위, 0) → 행번호를 계산해서 INDEX에 전달
이 구조만 이해하면 이후 모든 예제가 같은 패턴으로 확장됩니다.
Quick Fix 단계 요약
- 기존 VLOOKUP 수식에서
table_array범위 → 찾는 열만 따로 떼서INDEX의 첫 번째 인수lookup_value와 첫 번째 열 →MATCH의 인수로 사용
col_index_num은 더 이상 필요 없음 → 행 번호는 MATCH가, 열은 INDEX의 범위가 결정- 새 수식을 몇 행 복사해 확인한 뒤, 원래 VLOOKUP 수식을 한 번에 교체
이렇게 갈아타면 열을 삽입하거나 순서를 바꿔도 수식이 깨지지 않는 튼튼한 구조를 얻을 수 있습니다.
왜 VLOOKUP과 XLOOKUP만으로는 부족할까?
VLOOKUP의 구조적 한계
VLOOKUP은 편하지만, 내부 구조 때문에 근본적인 제약이 있습니다.
- 좌측 열 조회 불가
lookup 열은 항상table_array의 가장 왼쪽에 있어야 합니다. - 열 삽입/삭제 시 수식 깨짐
col_index_num이 “몇 번째 열인지 숫자”라서, 열이 하나 추가되면 인덱스가 전부 틀어집니다. - 하나의 열만 반환 가능
같은 조건으로 여러 열의 값을 가져오려면 수식을 여러 개 써야 합니다. - 대용량에서 느려질 수 있음
불필요한 열까지 포함한 넓은 범위를 계속 스캔합니다. - 255자 이상의 긴 텍스트 조회 제한
일부 시나리오에서 긴 문자열을 다루기 까다롭습니다.
XLOOKUP의 한계
XLOOKUP은 VLOOKUP의 많은 문제를 해결하지만, “완벽한 답”은 아닙니다.
- 버전 제한
Excel 2021 / 365 이상에서만 사용 가능 → 회사 전체가 최신 버전이 아닐 수 있음. - 항상 전체 배열을 스캔
매우 큰 범위에서 수천 개의 XLOOKUP이 돌아가면 계산 시간이 꽤 늘어날 수 있습니다. - 비연속 열을 한 번에 반환하기 어려움
여러 개의 떨어진 열을 한 번에 가져오려면 CHOOSE, FILTER 등을 섞어야 하고, 수식이 길어집니다. - INDEX처럼 “행/열 전체를 참조”하여 다른 함수에 넘기기에는 덜 직관적
INDEX와 MATCH 함수 개념 정리
MATCH: “위치를 찾는 함수”로 이해하기
MATCH(찾을값, 찾을범위, [일치유형])
MATCH("P001", A2:A101, 0)
A2:A101 범위에서"P001"이 몇 번째 위치인지 반환 (예: 7)
즉, MATCH는 값이 아니라 “행 번호”를 돌려주는 함수입니다.
INDEX: “행/열 번호로 값을 꺼내는 함수”
INDEX(범위, 행번호, [열번호])
INDEX(D2:D101, 7)
D2:D101 범위의 7번째 행 값을 반환INDEX(B2:D101, 7, 2)
B2:D101 범위에서 7행 2열의 값을 가져옴
두 함수를 합치면 조회 엔진이 된다
MATCH로 “몇 번째 행인지”를 구하고, INDEX에 그 번호를 넘겨주면?
=INDEX(반환할_열범위, MATCH(찾을값, 찾을_열범위, 0))
이 구조가 바로 INDEX MATCH function 조합입니다.
기본 예제: 상품코드로 가격·색상·재고까지 유연하게 조회하기
1) 샘플 데이터 만들기
아래와 같은 데이터가 A1:E11 범위에 있다고 가정해볼게요.
| A(코드) | B(상품명) | C(색상) | D(사이즈) | E(가격) |
|---|---|---|---|---|
| P001 | 기본 티셔츠 | White | S | 9,900 |
| P002 | 기본 티셔츠 | White | M | 9,900 |
| P003 | 기본 티셔츠 | Black | M | 9,900 |
1. A1:E11을 선택
2. Ctrl+T → “표로 서식 지정”
3. 헤더 포함 체크 후 확인
2) 단일 조건 INDEX MATCH
G2에 조회할 상품코드를 입력했다고 할 때, 해당 코드의 가격을 가져오는 수식:
=INDEX($E$2:$E$11, MATCH($G$2, $A$2:$A$11, 0))
3) 열 머리글+MATCH로 동적 열 선택
G2: 조회할 코드, H1: 가져올 열 제목(“가격”, “색상” 등)일 때:
=INDEX($B$2:$E$11,
MATCH($G$2, $A$2:$A$11, 0),
MATCH($H$1, $B$1:$E$1, 0))
이렇게 하면 H1에 적힌 제목에 따라 색상/가격 등을 자동으로 가져올 수 있습니다.
VLOOKUP/XLOOKUP 한계를 넘는 실전 패턴 5가지
패턴 1: 좌측 열 조회(Reverse lookup) 해결
B열에 상품명, A열에 코드가 있을 때:
=INDEX($A$2:$A$11, MATCH($G$2, $B$2:$B$11, 0))
포인트: 찾는 열과 반환 열을 완전히 분리할 수 있습니다.
패턴 2: 열 삽입에도 절대 안 깨지는 동적 열 참조
VLOOKUP에서는 열 삽입 시 col_index_num이 틀어지지만, INDEX MATCH는 반환 열 범위만 지정하므로 안전합니다.
=INDEX($E$2:$E$11, MATCH($G$2, $A$2:$A$11, 0))
패턴 3: 다중 조건 조회(색상+사이즈+매장 등)
조건: G2 코드, G3 색상, G4 사이즈, G5 매장
=INDEX($E$2:$E$11,
MATCH(1,
($A$2:$A$11=$G$2) *
($B$2:$B$11=$G$3) *
($C$2:$C$11=$G$4) *
($D$2:$D$11=$G$5),
0))
Excel 2019 이하는 배열 수식(Ctrl+Shift+Enter)이 필요합니다.
패턴 4: 255자 넘는 긴 텍스트·코멘트 조회
A열에 긴 텍스트, F2에 찾을 긴 문자열이 있을 때, 작성자(B열)를 찾는 예:
=INDEX($B$2:$B$4,
MATCH(TRUE, $A$2:$A$4=$F$2, 0))
패턴 5: 대용량 데이터에서 더 빠르게 계산하기
헬퍼 열에 MATCH 결과를 한 번만 계산하고, INDEX로 재사용하는 패턴:
=MATCH(코드셀, 코드범위, 0) '예: H2
=INDEX(가격범위, $H2)
=INDEX(재고범위, $H2)
MATCH는 한 번만, INDEX는 단순 참조만 하므로 대용량에서도 더 빠르게 동작합니다.
실무 예제: 일별 판매 데이터에서 “마지막 판매가”와 “조건 매출” 찾기
1) 마지막 판매일의 단가 찾기
G2: 코드 (P001)
=MAX(IF($B$2:$B$1001=$G$2, ROW($B$2:$B$1001)))
이 결과를 이용해 단가(E열)를 가져옵니다.
=INDEX($E$2:$E$1001,
MAX(IF($B$2:$B$1001=$G$2, ROW($B$2:$B$1001))) - ROW($E$2) + 1)
2) 상품+매장 조합의 마지막 매출액
=LET(
코드범위, $B$2:$B$1001,
매장범위, $C$2:$C$1001,
금액범위, $D$2:$D$1001*$E$2:$E$1001,
마지막행, MAX(IF((코드범위=$G$2)*(매장범위=$G$3), ROW(코드범위))),
INDEX(금액범위, 마지막행-ROW($B$2)+1)
)
오류·디버깅 가이드: INDEX MATCH가 말해 주는 신호 해석하기
자주 보는 오류 코드 정리
| 증상 | 원인 | 해결법 |
|---|---|---|
| #N/A | 찾을값이 범위에 없음 / 공백·오타·숨은 문자 | TRIM, CLEAN, UPPER/LOWER로 문자열 정리, 범위 재확인 |
| #VALUE! | 배열 수식인데 Ctrl+Shift+Enter 미입력(구버전) | 365가 아니면 배열 수식으로 입력하거나 수식 구조 변경 |
| #REF! | 참조 범위가 삭제됨 | 삭제된 행/열 여부 확인 후 범위 다시 지정 |
| 엉뚱한 값 반환 | match_type을 0이 아닌 값으로 사용 |
항상 0(정확히 일치) 사용 권장 |
디버깅 체크리스트
- MATCH 부분만 따로 계산해 보기
수식에서 MATCH만 남겨 결과 확인 - 행/열 번호가 INDEX 범위 안에 있는지 확인
- 공백·숨은 문자 제거
=TRIM(CLEAN(셀))으로 정리한 보조열 활용 - 텍스트 vs 숫자 타입 확인
필요시--셀또는VALUE(셀)로 숫자 변환
마무리: 언제 INDEX MATCH, 언제 XLOOKUP을 쓸까?
- INDEX MATCH function이 더 좋은 경우
- 구버전 Excel(2016/2019) 사용자가 많을 때
- 열 추가·삭제가 잦아 “수식이 자주 깨지는” 파일을 관리할 때
- 다중 조건, 긴 텍스트, 대용량 데이터 등 복잡한 시나리오를 다룰 때
- MAX, SUM, FILTER 등 다른 함수와 조합해 행/열 단위로 유연하게 계산할 때
- XLOOKUP이 편한 경우
- 신규 프로젝트이며 버전이 모두 365/2021 이상일 때
- 단순 조회 수식이 많고,
if_not_found같은 내장 에러 처리가 필요할 때 - 역방향 조회, 근사값 등 기본 시나리오 위주로 사용할 때
실무에서는 둘 중 하나만 고집하기보다, 프로젝트 특성에 맞게 섞어 쓰는 것이 좋습니다. 다만, 레거시 파일 정리·성능 최적화·복잡한 다중 조건 조회까지 고려하면 “기본 무기”는 여전히 INDEX MATCH function 쪽에 손을 들어주게 될 거예요.
VLOOKUP 기본기는 이미 알고 있다고 가정합니다. 아직이라면 VLOOKUP 기본 사용법부터 먼저 확인해 주세요.