상품 코드는 목록에 없는데 가격은 채워졌어요. #N/A가 뜨지도 않았으니 조회가 끝났다고 생각하기 쉽습니다. VLOOKUP의 마지막 인수를 생략하면 이런 결과가 나올 수 있어요. 생략한 자리는 자동으로 정확 일치가 되지 않고, TRUE에 해당하는 근사값 조회로 동작합니다.1
정확한 코드를 찾으려면 FALSE를 씁니다. 컴활 함수 문제에서 TRUE와 FALSE를 구별할 때도, ‘값이 나오는 수식’을 고르는 데서 멈추면 안 돼요. 어떤 행의 값을 돌려주는지까지 봐야 합니다.1
정렬된 표인데 왜 다른 상품의 가격이 나올까요?
정렬은 근사값 조회가 올바르게 동작하기 위한 조건이에요. 정확히 같은 코드만 찾도록 바꾸지는 않습니다.2 아래는 A1:C4에 입력했다고 가정한 연습용 상품표입니다. 코드와 가격은 설명을 위해 직접 만든 값이에요.
| 행 | A열: 상품 코드 | B열: 상품명 | C열: 가격 |
|---|---|---|---|
| 2 | 100 | 볼펜 | 800 |
| 3 | 120 | 노트 | 1,800 |
| 4 | 130 | 파일 | 2,500 |
이 표에서 없는 코드인 129를 찾아봅시다.
=VLOOKUP(129,$A$2:$C$4,3)
반환되는 값은 노트 가격인 1,800이에요. 근사값 조회는 오름차순 숫자표에서 정확한 값이 없으면 조회값보다 작은 값 중 가장 큰 기준을 선택합니다.2 예시의 129보다 작은 코드 중에서는 120이 가장 커요. 그 행의 가격을 가져온 것입니다.
수치상 더 가까운 코드는 130이지만, 그 행으로 가지 않습니다. 이 숫자표의 근사값 조회는 위아래 숫자와의 거리를 비교해 고르는 방식이 아니에요. 코드 120이 상품 129와 비슷한 물건인지를 판단한 것도 아닙니다.
같은 표와 같은 조회값에 FALSE를 넣으면 결과는 달라집니다.
=VLOOKUP(129,$A$2:$C$4,3,FALSE)
이번에는 #N/A예요. 정확히 같은 코드가 없기 때문입니다. 이 표에서는 엑셀이 망가진 것이 아니라, 찾으라고 한 상품이 없다는 사실이 드러났어요.1
수식의 3은 범위 안에서 반환할 열 번호입니다. 예시에서는 A열이 첫 열, B열이 다음 열, C열이 가격 열이에요. 조회 범위를 B열부터 잡으면 더는 A열의 상품 코드를 찾지 않으므로, FALSE를 붙이는 것만으로는 원하는 조회가 되지 않습니다.1
하한 기준표에서는 TRUE가 맞습니다
이번에는 코드 대신 점수에 따른 이름표를 붙여봅시다. 아래는 D1:E5에 넣는 가상 기준표예요. 실제 시험의 등급이나 합격 기준이 아닙니다.
D열: 시작 점수 E열: 표시
1 시작 점수 표시
2 0 재학습
3 60 보충
4 80 통과
5 90 우수
예시에서 ‘보충’은 60점 이상 80점 미만, ‘통과’는 80점 이상 90점 미만에 붙이려는 이름입니다. 표에는 각 구간이 시작되는 점수만 적었어요. 모든 점수를 코드처럼 하나씩 입력한 표가 아닙니다.
=VLOOKUP(79,$D$2:$E$5,2,TRUE)
79 이하의 시작 점수 중 가장 큰 값은 60이므로 ‘보충’이 나옵니다. 같은 표에서 80을 넣으면 80 행을 찾아 ‘통과’가 돼요. 89도 ‘통과’, 90은 ‘우수’입니다. 상품표에서 잘못 붙었던 값과 같은 규칙이 여기서는 원하는 구간을 찾아줍니다.2
이 표에서 FALSE로 79를 찾으면 #N/A가 됩니다. 시작 점수 열에 정확히 같은 값이 없으니까요. 상품 코드에는 필요했던 ‘없으면 찾지 않기’가 구간 조회에서는 목적과 맞지 않는 셈입니다.
TRUE를 쓰려면 시작 점수를 오름차순으로 놓아야 합니다. 내림차순이나 임의 순서인 표의 결과를 올바른 구간으로 믿을 수는 없어요.2 같은 표에 ‘80점까지 보충’이라는 규칙을 적용하려면 경계 조건도 달라집니다. 지금 표는 80점부터 통과라는 가정으로 만든 표예요.
경계 밖 입력도 생각해야 해요. 이 연습표에 -1을 넣으면 가장 작은 시작 점수보다 작아서 #N/A가 됩니다.1 반면 105를 넣으면 마지막 시작 점수인 90을 기준으로 ‘우수’가 나와요. 점수를 0점 이상 100점 이하로만 받으려는 상황이라면 그 입력 범위를 따로 검사해야 합니다. 구간을 찾는 수식이 점수의 유효성까지 보장하는 것은 아니에요.
FALSE인데도 안 맞는다면
FALSE를 넣었는데 #N/A가 남아 있다면 먼저 조회값과 기준표의 값이 같은 종류인지 봅니다. 숫자와 텍스트가 섞이거나 앞뒤 공백이 붙어 있으면, 화면에서 비슷하게 보여도 정확 조회가 실패할 수 있어요.3
예를 들어 숫자 120과 텍스트로 입력한 ‘120’을 섞어놓은 연습 자료를 생각해보세요. 코드가 00120이라면 앞자리 0도 의미가 있을 수 있습니다. 검색이 안 된다는 이유로 코드 열 전체를 숫자로 바꾸면 다른 코드를 만들어버릴 수 있어요. 먼저 숫자로 계산할 항목인지, 문자로 유지할 식별자인지 정하고 맞춰야 합니다.
자료형까지 맞는데 다른 상품이 나온다면 중복된 코드를 볼 차례예요. 정확히 일치하는 값이 여러 개면 VLOOKUP은 처음 찾은 일치 행을 사용합니다.2 FALSE를 썼다고 코드의 중복까지 검사한 것은 아니에요.
앞의 연습표에 코드 120인 다른 상품을 추가했다면, FALSE를 썼다는 이유만으로 그중 원하는 상품을 구별할 수는 없어요. 상품을 나누는 별도 코드가 필요한지, 기준표에서 중복 기록을 정리해야 하는지 판단해야 합니다.
아래로 복사한 결과만 틀린 경우에는 조회 범위가 움직였는지도 살펴봅니다. 예제의 $A$2:$C$4는 기준표를 고정한 주소예요. 찾을 코드는 행마다 바뀌어도 상품표는 그대로 읽게 하려는 것입니다. 고정할 위치가 헷갈리면 엑셀 절대참조 예제에서 복사 후 주소의 변화를 함께 볼 수 있어요.
IFERROR를 붙여도 다른 상품의 가격은 남아요
IFERROR는 수식이 오류를 반환하면 지정한 값을 대신 표시하고, 오류가 아니면 원래 결과를 돌려줍니다.4 다른 상품의 가격이 정상 값으로 반환됐다면, IFERROR는 그 가격을 그대로 내보냅니다.
앞의 상품표에서 이 수식을 비교해보세요. ‘코드 확인’은 오류일 때 보이도록 정한 예시 문구입니다.
=IFERROR(VLOOKUP(129,$A$2:$C$4,3),"코드 확인")
결과는 여전히 1,800입니다. 근사값 조회가 노트 가격을 반환했으므로 IFERROR가 바꿀 오류가 없어요. 129라는 상품 코드가 실제로 존재하는지는 검사하지 않은 수식입니다.
=IFERROR(VLOOKUP(129,$A$2:$C$4,3,FALSE),"코드 확인")
이 수식에서는 정확한 코드가 없어 생긴 #N/A가 ‘코드 확인’으로 바뀝니다. 다만 IFERROR가 잡는 것은 #N/A만이 아니라 다른 오류도 포함하므로, 이 문구만 보고 모든 원인을 코드 누락으로 단정할 수는 없어요.4
첫 수식은 없는 코드 129에 노트 가격 1,800을 붙였고, 다음 수식은 같은 코드에 ‘코드 확인’을 표시했어요. 가격이 채워졌다는 이유로 조회가 끝났다고 보기 어려운 차이입니다.
Footnotes
-
Microsoft Support 「VLOOKUP 함수」의 인수 표에서 range_lookup 생략 시 TRUE 방식, FALSE의 정확 일치, 범위 첫 열의 조회값과 범위 기준 반환 열 번호를 확인했다. ‘일반적인 문제’의 #N/A 항목에서 TRUE의 최소 기준값 미만과 FALSE의 일치값 부재도 확인했다. 본문의 표와 수식 입력값은 자체 연습 예시다. VLOOKUP 함수 안내 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn 「WorksheetFunction.VLookup method (Excel)」의 Remarks에서 TRUE 또는 생략 시 오름차순을 전제로 정확값이 없으면 조회값보다 작은 값 중 가장 큰 값을 사용하며, FALSE에서 중복 일치가 있으면 처음 찾은 행을 사용하는 설명을 확인했다. VBA 메서드 문서의 조회 규칙을 워크시트 함수의 Support 설명과 대조했고, 상품·점수 예시는 직접 구성했다. 조회 규칙과 중복 일치 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Support 「# N/A 오류를 수정하는 방법」의 ‘잘못된 값 형식’과 ‘셀에 공백이 있음’에서 조회값·원본의 숫자/텍스트 불일치와 앞뒤 공백을 확인했다. 코드 00120은 식별자 정리 시 주의할 조건을 설명하는 자체 예시다. 정확 조회가 실패하는 조건 ↩
-
Microsoft Support 「IFERROR function」의 도입 설명에서 오류이면 대체값, 아니면 원래 수식 결과를 반환하는 동작을 확인했다. Syntax의 value_if_error 설명에는 #N/A 외의 #VALUE!, #REF! 등의 오류도 포함된다. IFERROR의 처리 범위 ↩ ↩2