- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 #N/A 오류가 발생하는 핵심 원인을 체계적으로 분류하고, 현장에서 즉시 적용 가능한 진단 순서·검증 수식·예방 설계를 제시하여 재발을 방지하는 것이다.
#N/A 오류의 의미와 발생 함수
#N/A는 “해당 없음”을 뜻하며 주로 조회·검색 함수에서 검색값을 찾지 못할 때 발생한다. 대표적으로 VLOOKUP, HLOOKUP, XLOOKUP, LOOKUP, INDEX/MATCH, XMATCH, MATCH, GETPIVOTDATA, XLOOKUP을 사용하는 FILTER 래핑에서 빈 결과 처리 시 나타난다. 피벗, 파워쿼리 병합 결과를 시트로 반환할 때 키 불일치가 있으면 동일 증상이 나타난다.
#N/A 주요 원인 분류
| 분류 | 전형적 증상 | 핵심 해결책 |
|---|---|---|
| 정확히 일치 항목 부재 | 검색값이 참조 범위에 실제로 없음 | 원천 데이터 품질 점검, COUNTIF/XMATCH로 존재성 검사, 소스 정규화 |
| 공백·숨은 문자 | 눈에 보이는 값은 같으나 매칭 실패 | TRIM, CLEAN, SUBSTITUTE(CHAR(160))로 정리, 데이터 입력 규칙 강화 |
| 데이터 형식 불일치 | 숫자↔텍스트 혼용, 앞자리 0 보존 문제 | ISTEXT/ISNUMBER 진단, VALUE/TEXT로 통일, 사용자 지정 서식 구분 |
| 열 인덱스·범위 지정 오류 | VLOOKUP col_index_num 잘못, 범위 누락 | 구조화 참조 사용, XLOOKUP 권장, 범위 잠금($) 점검 |
| 근사값 옵션 오사용 | VLOOKUP의 TRUE 또는 미지정, 정렬 안 된 표 | 정확히 일치(FALSE)로 바꾸거나, 오름차순 정렬 |
| 다중키 조인 누락 | 단일 키로는 유일식별이 안 됨 | HSTACK/VSTACK 또는 텍스트 연결로 복합키 생성 후 매칭 |
| 지역·코드 페이지 차이 | 비분리 공백(160), 유니코드 유사문자, 구분기호 상이 | CODE/UNICODE 비교, SUBSTITUTE로 통일, 가져오기 인코딩 지정 |
| 날짜 직렬값 불일치 | 형태 같아 보여도 매칭 실패 | DATEVALUE, TEXT로 표준화, 원천을 값으로 고정 |
| 동적 배열 스필 영향 | FILTER, UNIQUE 결과가 빈 배열 | IFERROR·IFNA로 사용자 메시지 처리, 사전 존재성 검사 |
| 피벗/파워쿼리 키 어긋남 | 병합 후 일부 행만 매칭 | 조인 형식(Left/Inner) 재검토, 키 정규화, 데이터 프로파일링 |
재현·진단을 위한 표준 점검 흐름(현장용 체크리스트)
- 검색값 존재성 검사부터 한다.
=COUNTIF(참조범위, 검색값) >= 1 =ISNUMBER(XMATCH(검색값, 참조범위,
0))
- 양쪽 데이터 형식을 확인한다.
=ISTEXT(검색값) =ISNUMBER(검색값) =ISTEXT(INDEX(참조범위,1)) =ISNUMBER(INDEX(참조범위,1))
- 공백·숨은 문자 제거 후 재검사한다.
=LEN(셀), =LEN(TRIM(셀)) =CODE(MID(셀, ROW(INDIRECT("1:"&LEN(셀))),
1)) '배열수식 =SUBSTITUTE(SUBSTITUTE(TRIM(CLEAN(셀)), CHAR(160), " "), " ", " ")
- 정확히 일치 옵션을 강제한다.
=VLOOKUP(값, 범위, 2, FALSE) =XLOOKUP(값, 조회범위, 반환범위, "#N/A",
0)
- 열 인덱스·범위 고정($)을 검토한다.
=VLOOKUP($A2, $D:$F, 2, FALSE) =INDEX($F:$F, MATCH($A2, $D:$D,
0))
- 복합키가 필요한지 확인한다.
=XLOOKUP(A2&"|"&B2, 조회키1&"|"&조회키2, 반환범위, "#N/A",
0) =LET(k, A2&"|"&B2, XLOOKUP(k, HSTACK(키1, 키2), 반환범위, "#N/A",
0))
- 날짜·시간은 직렬값으로 정규화한다.
=DATEVALUE(TEXT(원천셀, "yyyy-mm-dd")) =TEXT(원천셀, "yyyy-mm-dd")
- 인코딩·유니코드 유사문자를 의심한다.
=UNICODE(MID(셀, n,
1)) 'U+00A0 비분리 공백 등 탐지 =SUBSTITUTE(셀, UNICHAR(160), " ")
- 근사값 모드를 사용했는지 확인한다.
=VLOOKUP(값, 범위, 2, TRUE) '정렬된 표에서만 =XMATCH(값, 범위,
1) '근사 상승, 정렬 필수
- 결과 표시 정책을 정의한다.
=IFNA(XLOOKUP(값, 조회, 반환), "미등록") =IFERROR(수식, "확인 필요")
원인별 심층 해설과 실무 처방
1) 정확히 일치 항목 부재
발주코드·사번 등 키 값이 참조범위에 존재하지 않으면 #N/A가 정상이다. 가장 빠른 검사는 COUNTIF 또는 XMATCH로 존재성을 확인하고, 마스터 테이블이 최신인지 점검한다. 운영에서는 신규 코드 등록 SLA를 정의하고, 입력 데이터 유효성 검사(데이터 유효성 검사 목록·드롭다운)로 오탈자를 방지한다.
=IF(COUNTIF(마스터[코드], A2)=0, "미등록", XLOOKUP(A2, 마스터[코드], 마스터[명칭],,0))
2) 공백·숨은 문자 혼입
웹·ERP 복사 시 비분리 공백(U+00A0), 제어문자(U+0007 등), 줄바꿈이 포함되어 매칭이 실패한다. TRIM은 연속 공백을 하나로 줄일 뿐 비분리 공백은 제거하지 못한다. CLEAN은 인쇄 불가 문자만 제거한다. 두 함수와 SUBSTITUTE를 병행하여 정규화한다.
=LET(s, A2, t, TRIM(CLEAN(SUBSTITUTE(s, CHAR(160), " "))), t)
3) 데이터 형식 불일치(숫자처럼 보이는 텍스트)
텍스트 "123"과 숫자 123은 다른 값이다. 조회 키의 양쪽 형식을 통일해야 한다. 숫자형을 강제하려면 VALUE, 텍스트형을 강제하려면 TEXT를 사용한다. 앞자리 0이 중요한 품목코드·우편번호는 숫자 변환 금지이며, 텍스트 유지가 원칙이다.
=XLOOKUP(TEXT(A2,"@"), TEXT(마스터[코드],"@"), 마스터[명칭],,0) =XLOOKUP(VALUE(A2), VALUE(마스터[품번]), 마스터[명칭],,0) '보조열 권장
4) VLOOKUP 열 인덱스·범위 지정 오류
col_index_num을 잘못 주거나, 참조 범위를 이동/삽입으로 어긋나게 하면 #N/A 또는 엉뚱한 값이 나온다. 구조화 참조(테이블) 또는 XLOOKUP으로 전환하면 열 이동에도 안전하다.
=XLOOKUP(A2, 테이블[키], 테이블[반환열], "미등록",
0)
5) 근사값 옵션 오사용
VLOOKUP 네 번째 인수를 생략하면 근사값(TRUE)로 동작한다. 표가 오름차순 정렬이 아니면 잘못된 값이 반환되거나 #N/A가 발생한다. 정확히 일치가 기본인 XLOOKUP을 권장한다.
=VLOOKUP(A2, 범위, 2, FALSE) '정확히 일치 =XMATCH(A2, 범위,
0) '정확히 일치
6) 복합키 필요
일자+거래처+품목처럼 단일열로 유일식별이 불가하면 복합키를 만들어 매칭해야 한다. HSTACK/VSTACK 또는 & 연결로 키를 생성하고 동일한 방식으로 비교한다.
=LET(k, TEXT(A2,"yyyymmdd")&"|"&B2&"|"&C2, XLOOKUP(k, HSTACK(TEXT(표[일자],"yyyymmdd"), 표[거래처], 표[품목]), 표[수량], "미존재",
0))
7) 지역·인코딩 이슈
CSV/TSV 가져오기에서 인코딩을 잘못 지정하면 유사문자(예: 전각/반각, 한글 유사자모)나 비분리 공백이 혼입된다. 텍스트 가져오기 마법사 또는 Power Query에서 UTF-8/65001을 명시하고, 구분 기호·소수점 기호(쉼표/점)·천 단위 구분(공백)을 확인한다.
=SUBSTITUTE(SUBSTITUTE(셀, UNICHAR(65279), ""), UNICHAR(160), " ") 'BOM, NBSP 제거
8) 날짜 직렬값 정규화
표시 형식은 같아 보여도 하나는 텍스트, 하나는 날짜일 수 있다. 날짜는 직렬값(정수)로 통일한다.
=DATEVALUE(TEXT(A2,"yyyy-mm-dd")) =--TEXT(A2,"yyyymmdd")
9) 동적 배열 함수와 빈 결과
FILTER 결과가 빈 배열이면 후속 XLOOKUP이 #N/A를 낸다. 사용자 메시지를 설계한다.
=LET(r, FILTER(표[수량], 표[품목]=E2), IFERROR(r, "조건에 맞는 데이터 없음"))
10) 피벗·파워쿼리 키 불일치
Power Query 병합에서 공백·형식 불일치가 있으면 Inner Join 결과가 누락된다. 병합 전 “변환 > 열 자르기/공백잘라내기/데이터 형식 변경”을 일괄 적용하고, 병합 후 “일치하지 않는 행”을 따로 검증한다.
'Power Query M 예시(개념) Table.TransformColumns(소스, { "코드", Text.Trim }) Table.TransformColumnTypes(소스, {{"코드", type text}})
현장 즉용 진단 템플릿(붙여넣기용)
'1) 존재 여부 =IF(COUNTIF(마스터[키], A2)=0, "#N/A: 미등록", "OK")
'2) 공백·제어문자 정리
=LET(s,A2, TRIM(CLEAN(SUBSTITUTE(s, CHAR(160), " "))))
'3) 형식 강제(앞자리 0 보존 시 텍스트 유지)
=TEXT(A2, "@")
'4) 표준 조회(정확히 일치)
=IFNA(XLOOKUP(A2, 마스터[키], 마스터[반환],), "#N/A: 키 확인")
'5) 복합키 조회
=LET(k, A2&"|"&B2, IFNA(XLOOKUP(k, 마스터[키1]&"|"&마스터[키2], 마스터[반환],), "#N/A: 복합키"))
함수별 #N/A 발생 조건 요약
| 함수 | 발생 조건 | 예방 설계 |
|---|---|---|
| VLOOKUP | 미존재, 근사값옵션(TRUE)·비정렬, 열 인덱스 오류 | FALSE 고정, 테이블·구조화 참조, XLOOKUP 전환 |
| XLOOKUP/XMATCH | 미존재, 비교모드 설정 오류 | match_mode=0, search_mode 기본, IFNA로 사용자 메시지 |
| INDEX/MATCH | MATCH 0 실패, 범위 불일치(행·열 길이 상이) | 범위 길이 동일, MATCH 0 사용, 보조열로 형식 통일 |
| LOOKUP | 정렬 불량 시 오동작 | 사용 지양, XLOOKUP 대체 |
| GETPIVOTDATA | 피벗 필드에 항목 부재 | 피벗 새로고침, 항목 존재 여부 사전 검사 |
| FILTER | 조건 불일치로 빈 배열 | IFERROR로 안내문, 조건 사전 검증 |
데이터 정규화 패턴 모음
다음 패턴을 네임드 수식 또는 보조열로 표준화하면 재발을 크게 줄일 수 있다.
'비분리 공백, BOM, 제어문자 제거 =LET(s, A2, s1, SUBSTITUTE(s, CHAR(160), " "), s2, SUBSTITUTE(s1, UNICHAR(65279), ""), TRIM(CLEAN(s2)))
'숫자·텍스트 양쪽 호환 키(앞자리 0 유지)
=TEXT(A2, REPT("0", MAX(6, LEN(A2)))) '최소 6자리 예시
'대소문자 구분 정확 비교(필요 시)
=EXACT(정규화(A2), 정규화(B2))
품질보증을 위한 설계 원칙
- 조회는 항상 “정확히 일치” 모드로 시작한다.
- 조회 키는 입력 단계에서 데이터 유효성 검사로 강제한다.
- 정규화 함수(공백·형식 통일)를 보조열에 상시 적용한다.
- 복합키가 의심되면 설계 초기에 결정한다.
- 오류 은폐(IFERROR)는 로그와 함께 사용한다.
사례: #N/A를 낳는 미세 공백 탐지
'A2가 눈에 보이기엔 "ACME-01"인데 매칭 실패 =LEN(A2) '예: 7이 아니라 8 =CODE(MID(A2,7,1)) '160(NBSP) 탐지 =SUBSTITUTE(A2, CHAR(160), " ") '정규화 후 매칭 성공
사례: 파워쿼리 병합 후 일부만 누락
원인: 키 열 하나는 숫자, 다른 하나는 텍스트. 조치: 병합 전 형식을 텍스트로 통일하고 Trim·Clean을 일괄 적용한다. 병합 유형을 Left Outer로 두고, 병합 후 일치하지 않는 행을 별도 쿼리로 추출해 재처리한다.
보고·감사 대응을 위한 로그 설계
'오류 발생 시 로그에 기록 =LET(val, A2, res, IFNA(XLOOKUP(val, 키, 반환,,0), "#N/A"), IF(res="#N/A", VSTACK("미등록", val, NOW()), res))
FAQ
VLOOKUP을 XLOOKUP으로 바꾸면 #N/A가 사라지나?
근본 원인이 데이터 불일치라면 동일하게 #N/A가 나온다. 다만 XLOOKUP은 기본이 정확히 일치이며 반환열 이동에도 안전하다는 이점이 있다.
IFERROR로 “없음”을 표시해도 되나?
가능하다. 그러나 데이터 품질 관리가 필요한 환경에서는 IFNA로 범위를 좁히고, 오류 발생 건을 별도 시트에 기록해야 한다.
숫자·텍스트 혼용을 한 번에 통일하는 가장 안전한 방법은?
원천 시스템에서 데이터 형식을 사전 정의하는 것이 최선이다. 시트 레벨에서는 보조열로 TEXT 또는 VALUE를 적용하고, 조회는 보조열 기준으로 수행한다.
근사값 모드는 언제 사용하나?
구간 매핑(세율표, 등급표)처럼 범위 기반 검색에만 사용한다. 이때 참조표를 오름차순 정렬해야 한다.
날짜 매칭이 실패한다. 표시 형식은 같은데 왜 그런가?
하나는 텍스트, 하나는 날짜 직렬값일 가능성이 높다. DATEVALUE 또는 -- 연산으로 직렬값으로 통일한다.