VLOOKUP #N/A 원인 진단: 공백·문자와 숫자·중복 키부터 확인하세요
주문 코드가 상품표에 있는 것 같은데 단가를 못 찾는다면, 오류를 0으로 바꾸기 전에 실제 코드 값·조회 범위·자료형을 확인하세요. 중복 코드도 함께 점검해야 합니다. 중복 자체가 반드시 #N/A를 만드는 것은 아니지만, 값이 나와도 잘못된 가격을 선택할 수 있기 때문입니다.
원인
정확 일치 조회에서 찾는 값이 없으면 #N/A가 날 수 있습니다. 앞뒤 공백이 붙거나 숫자와 문자의 실제 자료형이 다르면 눈에 같은 코드처럼 보여도 조회가 실패할 수 있습니다. 기준표가 복사 과정에서 이동하거나, 정확 일치 대신 근사 일치를 사용한 경우도 별도로 확인해야 합니다. Microsoft #N/A 진단
CSV는 Excel 통합문서의 셀 자료형을 보관하지 않습니다. CSV 도우미에서 원문 00123을 확인할 수 있어도, 이미 열어 둔 Excel 셀이 숫자형인지 문자형인지는 도구가 알 수 없습니다. Excel 쪽에서 실제 값과 유형을 확인해야 합니다.
재현: 원문 값부터 비교하기
합성 상품표에는 아래 코드와 가격이 있습니다. 실제 고객 자료는 아닙니다.
code,item,price
A100,Mug,12000
B200,Notebook,3500
C300,Pen,900
A100,Mug revised,15000
00123,Label,700
합성 주문표의 코드 순서는 A100, A100 , X999, 00123, 123, A100입니다. 두 번째 코드에는 ASCII 공백 한 개가 끝에 붙어 있습니다. 파일과 같은 폴더에서 다음 Python 코드를 실행합니다.
import csv
with open('guide-06-products.csv', encoding='utf-8', newline='') as f:
products = list(csv.DictReader(f, strict=True))
with open('guide-06-orders.csv', encoding='utf-8', newline='') as f:
orders = list(csv.DictReader(f, strict=True))
for row in orders:
key = row['code']
matches = [p['price'] for p in products if p['code'] == key]
print(repr(key), len(key), matches)
예상 출력은 다음과 같습니다.
'A100' 4 ['12000', '15000']
'A100 ' 5 []
'X999' 4 []
'00123' 5 ['700']
'123' 3 []
'A100' 4 ['12000', '15000']
이 코드는 문자열이 같은 상품 코드와 모든 일치 가격을 찾는 진단입니다. Excel의 VLOOKUP 구현이나 수식 실행 결과가 아닙니다. 대소문자·와일드카드·자료형 처리까지 VLOOKUP을 재현한 것으로 해석하지 마세요. Python csv 공식 문서
해결 1: 공백을 확인하되 원본을 일괄 수정하지 않기
CSV 도우미의 CSV 검사기에서 파일을 고르고, 인코딩·구분자의 판별 결과와 열 구조를 확인합니다. 하지만 현재 검사기는 모든 셀의 앞뒤 공백을 자동 경고하거나 눈에 보이는 기호로 표시하지 않습니다. 미리보기만으로 공백이 없다고 결론 내리지 마세요. 위 코드의 repr()·길이 비교나 읽기 전용 편집기로 실제 문자를 확인합니다.
중복 행 제거에 합성 주문표를 넣고 머리글을 켠 뒤 기준 열을 code만 선택합니다. 다음 두 설정을 비교하되, 진단 단계에서는 결과를 내려받아 원본을 대체하지 않습니다.
- 앞뒤 공백 무시 끔:
A100두 건만 같은 키로 판단하여 6개 데이터 중 5개 유지·1개 제외 대상입니다. - 앞뒤 공백 무시 켬:
A100도 같은 비교 키로 판단하여 4개 유지·2개 제외 대상입니다.
이는 공백에 따라 비교 결과가 달라짐을 확인하는 방법입니다. 이 옵션은 비교할 때만 공백을 무시하며, 남기는 셀의 공백을 제거해 주는 정리 기능은 아닙니다. 의미 있는 공백인지 자료 담당자와 정하고, 수정이 필요하면 별도 사본에서 처리하세요. 다른 열의 값이 달라 전체 행 기준 중복은 0건인 이 예제에서도 키 기준 중복은 존재합니다.
해결 2: 문자·숫자 문제는 CSV 원문과 Excel을 나누어 확인하기
검사기는 이 합성 파일의 00123을 0으로 시작하는 숫자 모양 값으로 경고합니다. 이는 Excel 등에서 숫자로 가져오면 앞의 0을 잃을 수 있다는 안내이며 현재 셀의 숫자형 판정이 아닙니다.
code = orders[3]['code']
print(repr(code), type(code).__name__)
print(str(int(code)))
출력은 '00123' str, 123입니다. 숫자로 강제 변환하면 식별자가 달라지는 Python 모의 실험이지 Excel 가져오기 시험은 아닙니다. 코드가 식별자라면 양쪽 자료를 같은 문자 규칙으로 유지하는 방안을 먼저 검토합니다. 00123과 123을 업무상 같은 코드로 정했는지는 별도 문제입니다.
Excel에서는 찾을 값과 기준표 코드 열의 실제 자료형·수식·가져오기 설정을 확인합니다. 표시 형식을 바꾸는 것만으로 기존 값의 자료형이 반드시 변환됐다고 가정하지 마세요. 이미 사라진 앞의 0이나 손상된 긴 숫자는 원본 없이 복원할 수 없습니다. 인코딩 변환기도 이 손실을 복구하지 않습니다.
해결 3: 중복 키는 오류가 없어도 확인하기
합성 상품표에는 A100이 두 번 있고 가격이 12000과 15000으로 다릅니다. 중복 행 제거 도구에서 code만 기준으로 고르면 두 A100이 같은 키로 잡힙니다. 아무 열도 고르지 않은 전체 행 비교에서는 품명과 가격이 달라 같은 행으로 잡히지 않습니다.
정확 일치 VLOOKUP은 여러 일치를 발견해도 업무상 ‘최신’ 가격을 골라 주지 않습니다. 첫 일치가 반환되는 동작과 어떤 행을 남겨야 하는지는 별개입니다. 최신 가격표·적용일·승인 자료 등 근거를 먼저 정하세요. Microsoft VLookup 설명
‘중복 행 제거’는 첫 행을 남기는 도구입니다. 삭제 제안을 검토하지 않고 내려받으면 실제 필요한 주문이나 가격 이력을 잃을 수 있습니다. 주문표의 반복 주문은 정상일 수도 있습니다. 중복 발견과 삭제 결정은 다릅니다.
Excel로 돌아가 확인할 것
찾을 코드가 검색 범위의 첫 열에 있는지, 범위가 의도대로 고정돼 있는지, 정확 일치가 필요한 업무에서 FALSE를 지정했는지 확인합니다. 다음 수식은 예시이며 실제 대상 Excel에서 확인해야 합니다.
=VLOOKUP(A2,Products!$A$2:$C$4,3,FALSE)
위 주소는 상품 3개짜리 기본 상품표 배치용입니다. 이 글의 합성 상품표는 5개 상품 행이므로 같은 범위를 복사하면 뒤쪽 행이 빠집니다. 이 글의 전체 표를 Products 시트 A1:C6에 가져온다면 범위는 $A$2:$C$6인지 확인해야 합니다. Microsoft VLOOKUP
IFERROR로 ‘확인 필요’ 같은 안내를 표시할 수 있지만 원인을 고치는 기능은 아닙니다. 0으로 바꾸면 실제 단가 0과 오류를 구별하기 어려워집니다. 다른 오류까지 감출 수 있으므로 원본 오류와 검토 기록을 보존합니다.
한계
이 글의 검증은 Python의 CSV 문자열 비교와 현재 사이트 라이브러리의 검사·중복 비교 결과까지입니다. 실제 Excel 수식 계산·Excel 화면·브라우저 버튼 조작은 실행하지 않았습니다. Excel의 숫자/문자 불일치 결과를 실측했다는 뜻이 아닙니다.
닫히지 않은 따옴표·깨진 인코딩·누락 열 등 파일 구조 문제부터 해결해야 할 수 있습니다. 공백 무시는 JavaScript의 문자열 정리 규칙을 쓰므로 Excel TRIM과 모든 문자에서 같다고 가정하지 않습니다. 이 예제는 끝의 ASCII 공백만 다룹니다. 도구는 통합문서 수식·외부 참조·실제 셀 자료형을 분석하거나 VLOOKUP을 복구하지 않습니다.
검토일: 2026-10-18. 합성 CSV·본문 Python 코드·원본 보존·공백 비교·앞자리 0 모의 변환·코드별 모든 일치 가격·사이트 라이브러리 비교를 검증했습니다.
AI 보조 작성: AI로 원고와 합성 예제를 작성하고 로컬 실행 결과·공식 자료를 대조했습니다. 실제 고객 파일은 사용하지 않았습니다.