# Google Sheets 함수 마스터하기 (4/10): INDEX-MATCH 콤보 - VLOOKUP의 강력한 대안 ## 이전 편 복습 3편에서 MATCH 함수가 값의 **위치**를 반환한다는 것을 배웠습니다. 이제 INDEX와 MATCH를 결합하여 VLOOKUP의 모든 한계를 극복해 봅시다! --- ## INDEX-MATCH란? INDEX-MATCH는 두 함수를 결합한 조회 패턴입니다: 1. **MATCH**: 검색값의 위치를 찾음 2. **INDEX**: 그 위치의 값을 반환 ### 기본 공식 ``` =INDEX(반환범위, MATCH(검색값, 검색범위, 0)) ``` --- ## VLOOKUP vs INDEX-MATCH 비교 ### 예제 데이터 (A1:D5) | 사번 | 이름 | 부서 | 급여 | |------|------|------|------| | E001 | 김철수 | 개발 | 5000000 | | E002 | 이영희 | 마케팅 | 4500000 | | E003 | 박민수 | 인사 | 4200000 | | E004 | 정수진 | 개발 | 5500000 | ### 사번으로 급여 조회 **VLOOKUP 방식**: ``` =VLOOKUP("E002", A2:D5, 4, FALSE) ``` **INDEX-MATCH 방식**: ``` =INDEX(D2:D5, MATCH("E002", A2:A5, 0)) ``` **결과**: 둘 다 4500000 --- ## INDEX-MATCH가 VLOOKUP보다 우수한 이유 ### 1. 왼쪽으로 조회 가능 VLOOKUP의 가장 큰 한계: 검색 열이 반드시 첫 번째 열이어야 함 **이름으로 사번 찾기 (왼쪽 방향)** VLOOKUP으로는 불가능! INDEX-MATCH는 가능: ``` =INDEX(A2:A5, MATCH("이영희", B2:B5, 0)) ``` **결과**: E002 --- ### 2. 열 삽입/삭제에 안전 **VLOOKUP의 문제**: ``` =VLOOKUP("E001", A:D, 4, FALSE) // 급여는 4번째 열 ``` 만약 C열과 D열 사이에 새 열을 추가하면? → 수식이 틀린 값을 반환! **INDEX-MATCH의 해결**: ``` =INDEX(D:D, MATCH("E001", A:A, 0)) ``` 열 전체를 참조하므로 열 추가/삭제에도 안전! --- ### 3. 더 나은 성능 대용량 데이터에서 INDEX-MATCH가 VLOOKUP보다 빠릅니다: - **VLOOKUP**: 범위 전체를 메모리에 로드 - **INDEX-MATCH**: 필요한 열만 처리 특히 열이 많은 테이블에서 차이가 큽니다. --- ### 4. 유연한 방향 검색 **가로 방향 검색**: ``` =INDEX(2:2, MATCH("3월", 1:1, 0)) ``` **세로 방향 검색**: ``` =INDEX(A:A, MATCH("개발", B:B, 0)) ``` VLOOKUP/HLOOKUP을 따로 기억할 필요 없이 하나의 패턴으로 모든 방향 해결! --- ## 실전 예제 ### 예제 1: 제품 관리 시스템 #### 제품 테이블 (A1:E6) | 카테고리 | 제품코드 | 제품명 | 재고 | 가격 | |----------|----------|--------|------|------| | 전자제품 | P001 | 노트북 | 50 | 1500000 | | 전자제품 | P002 | 마우스 | 200 | 35000 | | 가구 | P003 | 책상 | 30 | 450000 | | 가구 | P004 | 의자 | 80 | 280000 | | 전자제품 | P005 | 키보드 | 150 | 89000 | #### 제품명으로 가격 찾기 ``` =INDEX(E2:E6, MATCH("책상", C2:C6, 0)) ``` **결과**: 450000 #### 제품코드로 카테고리 찾기 (왼쪽 조회!) ``` =INDEX(A2:A6, MATCH("P003", B2:B6, 0)) ``` **결과**: 가구 --- ### 예제 2: 월별 매출 대시보드 #### 매출 데이터 (A1:M3) | 구분 | 1월 | 2월 | 3월 | 4월 | 5월 | 6월 | 7월 | 8월 | 9월 | 10월 | 11월 | 12월 | |------|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|------|------| | 매출 | 100 | 120 | 150 | 130 | 140 | 160 | 180 | 170 | 150 | 160 | 190 | 220 | | 비용 | 80 | 90 | 100 | 95 | 100 | 110 | 120 | 115 | 100 | 110 | 130 | 150 | #### 특정 월의 매출 조회 G1셀에 "6월"이 입력되어 있다면: ``` =INDEX(A2:M2, MATCH(G1, A1:M1, 0)) ``` **결과**: 160 #### 2차원 조회: 특정 월의 특정 구분 G1에 "8월", G2에 "비용"이 있다면: ``` =INDEX(A2:M3, MATCH(G2, A2:A3, 0), MATCH(G1, A1:M1, 0)) ``` **결과**: 115 --- ### 예제 3: 다중 조건 조회 #### 프로젝트 데이터 (A1:D6) | 부서 | 프로젝트 | 담당자 | 예산 | |------|----------|--------|------| | 개발 | 웹사이트 | 김철수 | 5000 | | 개발 | 앱개발 | 이영희 | 8000 | | 마케팅 | 캠페인A | 박민수 | 3000 | | 마케팅 | 캠페인B | 정수진 | 4000 | | 영업 | 신규영업 | 최동훈 | 2000 | #### 부서+프로젝트로 예산 조회 "마케팅" 부서의 "캠페인B" 예산: ``` =INDEX(D2:D6, MATCH("마케팅"&"캠페인B", A2:A6&B2:B6, 0)) ``` **결과**: 4000 **참고**: 이 수식은 `Ctrl+Shift+Enter` 또는 자동으로 배열 처리됩니다. --- ## INDEX-MATCH 변형 패턴 ### 패턴 1: 마지막 일치 값 찾기 중복 값이 있을 때 마지막으로 나타나는 항목: ``` =INDEX(B2:B100, MAX(IF(A2:A100="개발", ROW(A2:A100)-ROW(A2)+1))) ``` ### 패턴 2: 조건부 첫 번째 값 특정 조건을 만족하는 첫 번째 값: ``` =INDEX(B2:B100, MATCH(TRUE, A2:A100>1000, 0)) ``` ### 패턴 3: 가장 가까운 값 찾기 ``` =INDEX(A2:A100, MATCH(MIN(ABS(B2:B100-목표값)), ABS(B2:B100-목표값), 0)) ``` --- ## 2차원 INDEX-MATCH 행과 열 모두 동적으로 조회: ``` =INDEX(데이터범위, MATCH(행검색값, 행헤더범위, 0), MATCH(열검색값, 열헤더범위, 0)) ``` ### 실전 예제: 가격표 #### 가격 매트릭스 (A1:E5) | | 소형 | 중형 | 대형 | 특대형 | |--|------|------|------|--------| | 기본 | 10000 | 15000 | 20000 | 25000 | | 표준 | 15000 | 22000 | 30000 | 38000 | | 프리미엄 | 25000 | 35000 | 45000 | 55000 | | VIP | 40000 | 55000 | 70000 | 85000 | G1에 "프리미엄", G2에 "대형"이 있다면: ``` =INDEX(B2:E5, MATCH(G1, A2:A5, 0), MATCH(G2, B1:E1, 0)) ``` **결과**: 45000 --- ## 에러 처리 모범 사례 ### 기본 에러 처리 ``` =IFERROR(INDEX(B2:B100, MATCH(A1, A2:A100, 0)), "없음") ``` ### 값 없음을 빈 셀로 처리 ``` =IFERROR(INDEX(B2:B100, MATCH(A1, A2:A100, 0)), "") ``` ### 에러 유형별 처리 ``` =IFNA(INDEX(B2:B100, MATCH(A1, A2:A100, 0)), "검색 결과 없음") ``` IFNA는 #N/A 에러만 처리 (다른 에러는 그대로 표시) --- ## 성능 최적화 팁 ### 1. 정확한 범위 지정 ``` // 느림 - 전체 열 참조 =INDEX(B:B, MATCH(A1, A:A, 0)) // 빠름 - 필요한 범위만 =INDEX(B2:B1000, MATCH(A1, A2:A1000, 0)) ``` ### 2. 반복 조회 시 MATCH 재사용 여러 열을 조회할 때: ``` // 비효율적 - MATCH 3번 실행 =INDEX(B:B, MATCH(A1, A:A, 0)) =INDEX(C:C, MATCH(A1, A:A, 0)) =INDEX(D:D, MATCH(A1, A:A, 0)) // 효율적 - 헬퍼 셀에 MATCH 저장 셀 Z1: =MATCH(A1, A:A, 0) 셀 B1: =INDEX(B:B, $Z$1) 셀 C1: =INDEX(C:C, $Z$1) 셀 D1: =INDEX(D:D, $Z$1) ``` --- ## INDEX-MATCH vs VLOOKUP 최종 비교 | 기능 | VLOOKUP | INDEX-MATCH | |------|---------|-------------| | 왼쪽 조회 | X | O | | 열 삽입 안전 | X | O | | 성능 (대용량) | 보통 | 좋음 | | 수식 길이 | 짧음 | 김 | | 학습 난이도 | 쉬움 | 중간 | | 2차원 조회 | X | O | | 다중 조건 | X | O | --- ## 정리 | 상황 | 수식 | |------|------| | 기본 조회 | `=INDEX(반환열, MATCH(검색값, 검색열, 0))` | | 왼쪽 조회 | `=INDEX(왼쪽열, MATCH(값, 오른쪽열, 0))` | | 2차원 조회 | `=INDEX(범위, MATCH(행값, 행헤더, 0), MATCH(열값, 열헤더, 0))` | | 다중 조건 | `=INDEX(반환열, MATCH(조건1&조건2, 열1&열2, 0))` | | 에러 처리 | `=IFERROR(INDEX(..., MATCH(...)), "없음")` | --- ## 핵심 포인트 1. **INDEX-MATCH는 VLOOKUP의 상위 호환** 2. **왼쪽 조회가 가능**하다는 것이 가장 큰 장점 3. **열 삽입/삭제에 안전** 4. **대용량 데이터에서 더 빠름** 5. **2차원 조회와 다중 조건**도 가능 --- ## 다음 편 예고 **[5편: XLOOKUP]**에서는 Google Sheets의 최신 조회 함수 XLOOKUP을 배웁니다. VLOOKUP과 INDEX-MATCH의 장점을 모두 갖춘 강력한 함수입니다! --- *이 글이 도움이 되셨다면 시리즈의 다른 글도 확인해 보세요!*