INDEX-MATCH vs VLOOKUP
위대한 논쟁: INDEX-MATCH vs. VLOOKUP
VLOOKUP은 엑셀에서 가장 유명한 조회 함수이고, INDEX-MATCH는 더 강력하고 더 유연한 경쟁자입니다. 이 논쟁은 10년 이상 엑셀 포럼에서 치열하게 이어져 왔으며, 그럴 만한 이유가 있습니다: 올바른 조회 방법 선택은 스프레드시트의 신뢰성, 유연성 및 성능에 직접적인 영향을 미칩니다.
스포일러: Excel 2021 또는 365를 사용 중이라면 XLOOKUP이 두 방법을 대부분 대체합니다. 하지만 수백만 명의 사용자가 여전히 구버전을 사용하고 있으며, INDEX-MATCH에서 배우는 원리는 모든 엑셀 함수에 적용됩니다. XLOOKUP 사용자조차 기본 메커니즘을 이해하면 도움이 됩니다.
단계별 가이드: VLOOKUP을 INDEX-MATCH로 변환하기
시나리오: D열에 제품 ID가 있고 A열에 가격이 있는 제품 테이블이 있습니다. 조회 열이 반환 열의 오른쪽에 있기 때문에 VLOOKUP이 실패합니다. INDEX-MATCH가 필요합니다.
1단계 — INDEX-MATCH 구조 이해하기
- 수식 구조:
=INDEX(return_range, MATCH(lookup_value, lookup_range, 0)) - INDEX(range, row_number) — 특정 행 위치에서 범위의 값을 반환합니다.
- MATCH(value, range, 0) — 범위에서 값의 위치를 찾습니다. 0은 "정확히 일치"를 의미합니다.
- 함께 사용 시: MATCH가 행 번호를 찾고, INDEX가 반환 열의 해당 행에서 값을 반환합니다.
2단계 — 수식을 단계별로 작성하기
- 빈 셀에서 MATCH만 먼저 테스트하여 작동을 확인하세요:
=MATCH(A2, D:D, 0). A2의 제품 ID가 D열에서 발견된 행 번호를 반환해야 합니다. - 이제 INDEX로 감싸서 가격을 가져옵니다:
=INDEX(A:A, MATCH(A2, D:D, 0)). MATCH가 찾은 행에서 A열의 가격을 반환합니다. - 실제 사용 시 범위를 고정하세요:
=INDEX($A$2:$A$1000, MATCH(A2, $D$2:$D$1000, 0)). 느린 계산을 즐기지 않는 한 전체 열 범위(A:A)를 사용하지 마세요.
3단계 — #N/A 오류를 우아하게 처리하기
- 전체 수식을 IFERROR로 감싸세요:
=IFERROR(INDEX($A$2:$A$1000, MATCH(A2, $D$2:$D$1000, 0)), "찾을 수 없음"). - 이제 제품 ID가 조회 테이블에 없으면 보기 흉한 오류 대신 "찾을 수 없음"이 표시됩니다.
- 대시보드의 경우 더 깔끔한 모양을 위해 "찾을 수 없음" 대신 ""(빈 문자열)을 사용하세요.
VLOOKUP이 유리한 경우
- 단순함과 가독성. 하나의 VLOOKUP 수식은 INDEX-MATCH 조합보다 읽고 가르치기 쉽습니다. 조회 열이 왼쪽에 있는 간단한 조회의 경우 VLOOKUP이 작성하기 빠르고 동료들이 이해하기 쉽습니다.
- 빠른 임시 조회. 일회성 조회가 필요하고 데이터가 이미 조회 열이 먼저 오도록 구성된 경우, VLOOKUP이 가장 저항이 적은 경로입니다. 입력하고 넘어가세요.
- 근사 일치 시나리오. 숫자 구간(세금 구간, 수수료 대역, 등급 척도)의 경우, 네 번째 인수로 TRUE를 사용하는 VLOOKUP이 직관적이고 잘 문서화되어 있습니다.
INDEX-MATCH가 유리한 경우
- 조회 열이 반환 열의 오른쪽에 있는 경우. VLOOKUP은 왼쪽에서 오른쪽으로만 검색합니다. INDEX-MATCH는 열 순서에 구애받지 않습니다.
- 열 삽입 또는 삭제 시. VLOOKUP의 col_index_num은 하드코딩되어 있습니다. 열을 삽입하면 오른쪽 열을 참조하는 모든 VLOOKUP이 깨집니다. INDEX-MATCH는 실제 열 참조를 사용하여 올바르게 조정됩니다.
- 대규모 데이터셋에서의 성능. INDEX-MATCH는 전체 테이블 배열을 스캔하는 대신 단일 열로 조회를 제한할 수 있어 더 빠를 수 있습니다. 50,000행 이상에서 차이가 눈에 띄게 나타납니다.
- 양방향(매트릭스) 조회. INDEX-MATCH-MATCH는 기본 기능입니다:
=INDEX(data_range, MATCH(row_value, row_headers, 0), MATCH(col_value, col_headers, 0)).
흔한 실수
- VLOOKUP이 왼쪽을 조회할 수 없다는 것을 잊음. 이것이 가장 큰 좌절 요인입니다. VLOOKUP을 작동시키기 위해 열을 재배열하고 있다면 잘못된 싸움을 하고 있는 것입니다 — INDEX-MATCH로 전환하세요.
- VLOOKUP이 실수로 근사 일치를 사용. 네 번째 인수는 생략 시 기본값이 TRUE입니다. FALSE를 추가하는 것을 잊으면 올바르게 보이지만 미묘하게 잘못된 "충분히 가까운" 결과가 생성됩니다. 항상 FALSE를 명시적으로 작성하세요.
- INDEX-MATCH에서 MATCH 범위를 고정하지 않음.
=INDEX(D:D, MATCH(A2, B:B, 0))은 취약합니다. 범위를 고정하세요:=INDEX($D$2:$D$100, MATCH(A2, $B$2:$B$100, 0)). - INDEX-MATCH가 항상 더 빠르다고 가정. 작은 데이터셋(1,000행 미만)에서는 성능 차이가 무시할 만합니다. 단순함이 미미한 속도 향상보다 나은 경우가 많습니다.
고급 팁
- 동적 열 선택을 위한 INDEX-MATCH-MATCH: 열 이름에 대한 드롭다운을 만들고
=INDEX(data, MATCH(row_val, row_col, 0), MATCH(dropdown, headers, 0))를 사용하세요. 하나의 수식이 셀프 서비스 조회 도구가 됩니다. - 마지막 발생을 위한 INDEX-MATCH:
=INDEX(return_range, MATCH(2, 1/(lookup_range=value), 1))는 첫 번째가 아닌 마지막 일치 항목을 반환합니다. 고객의 가장 최근 거래를 찾는 데 유용합니다. - 다중 조건을 위한 배열 INDEX-MATCH:
=INDEX(return_range, MATCH(1, (range1=A2)*(range2=B2), 0))를 Ctrl+Shift+Enter로 입력합니다. 보조 열 없이 여러 조건과 일치하는 첫 번째 행을 반환합니다.