- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 발생하는
#VALUE!
오류의 근본 원인을 체계적으로 진단하고, 재발을 예방할 수 있는 표준 절차와 실무 팁을 제공하는 것이다.
1. #VALUE! 오류의 의미와 발생 메커니즘
#VALUE!
오류는 함수가 기대하는 데이터 유형이나 구조가 입력과 맞지 않을 때 발생하는 일반적 계산 실패 상태를 뜻한다. 대표적으로 텍스트와 숫자 혼합, 숨은 제어문자, 잘못된 날짜·시간, 배열 치수 불일치, 지역 설정 불일치, 범위의 누락 값 등이 원인이 된다. 엑셀은 내부적으로 각 인수의 데이터 유형 검사와 암묵적 변환을 수행하나, 변환 불가능하거나 손실 위험이 있으면
#VALUE!
로 중단한다.
2. 실무 표준 진단 플로우(5단계)
| 단계 | 점검 항목 | 확인 방법 | 결과 조치 |
|---|---|---|---|
| 1. 유형 확인 | 숫자·텍스트·논리·날짜 유형 |
ISTEXT
,
ISNUMBER
,
ISLOGICAL
,
ISBLANK
로 점검한다
|
유형 불일치 시 표준 변환 절차 수행한다 |
| 2. 숨은 문자 | 공백·줄바꿈·비가시 제어문자 |
LEN
과
LEN(TRIM())
차이를 비교한다
|
TRIM
·
CLEAN
·
SUBSTITUTE
로 정제한다
|
| 3. 구분자·로케일 | 소수점·천 단위·날짜 구분 |
샘플 값에
VALUE
·
DATEVALUE
적용 테스트를 한다
|
로케일 표기 변환 또는 옵션 변경을 한다 |
| 4. 범위·배열 | 치수 불일치·누락 셀 |
스필 범위 테두리 확인 및
ROWS
·
COLUMNS
검사한다
|
치수 정렬 또는 동적 배열 함수로 교체한다 |
| 5. 함수 인수 | 필수 인수 누락·잘못된 순서 | 함수 입력 마법사(Fx)로 각 인수 미리보기 확인을 한다 | 인수 유형·순서·옵션을 교정한다 |
3. 원인별 즉치(즉시 조치) 매뉴얼
3.1 텍스트 숫자 혼합
숫자처럼 보이는 텍스트가 포함될 때 산술 연산이 실패한다. 다음 절차를 따른다.
=LET( r, A2:A100, n, --SUBSTITUTE(SUBSTITUTE(TRIM(r), ",", ""), " ", ""), n )
위 식은 공백·쉼표 제거 후 이중 단항부호
--
로 숫자 변환을 수행한다. 로케일에 따라 소수점이 콤마(
,
)로 들어온 경우 다음과 같이 치환한다.
=--SUBSTITUTE(A2, ",", ".")
SUBSTITUTE
로 제거한 뒤 변환해야 한다.
3.2 숨은 제어문자·불가시 공백
웹·ERP에서 복사한 데이터에는 비표준 공백(예:
CHAR(160)
)과 줄바꿈(
CHAR(10)
)이 섞여 있다.
=LET( s, A2, clean1, TRIM(CLEAN(s)), clean2, SUBSTITUTE(clean1, CHAR(160), ""), clean2 )
문자 길이 진단으로 잔여 문자를 확인한다.
=LEN(A2) & " / " & LEN(TRIM(CLEAN(SUBSTITUTE(A2,CHAR(160),""))))
3.3 날짜·시간 텍스트
텍스트 날짜를 연산하려면 직렬값으로 변환해야 한다.
=DATEVALUE(SUBSTITUTE(A2,".","/")) + TIMEVALUE(A2)
여러 포맷이 혼재하면 패턴 정규화 후 변환한다.
=LET( s, TRIM(A2), s1, SUBSTITUTE(SUBSTITUTE(s,"-","/"),".","/"), DATEVALUE(s1) )
3.4 배열 치수 불일치·스필 충돌
동적 배열 수식에서 스필 대상 범위에 값이 있거나 결과 치수가 참조 범위와 다르면
#VALUE!
가 발생한다.
ROWS
·
COLUMNS
로 치수를 맞추고, 스필 충돌 셀을 비운다.
=INDEX(B2:B100, SEQUENCE(COUNTA(A2:A100)))
행·열이 바뀌어 들어오는 경우
TOROW
,
TOCOL
로 정규화한다.
=SUM(--TOCOL(B2:F100,
1))
3.5 논리값·오류값 섞임
SUM
·
AVERAGE
는 오류를 무시하지 않는다. 오류를 0으로 치환한다.
=SUM(IFERROR(B2:B100,
0))
논리값 포함 여부를 명시하려면
N
함수를 사용한다.
=SUM(N(B2:B100))
3.6 텍스트 연결 연산자 사용
수식 내
&
로 텍스트를 만들 때, 숫자 변환이 필요한 위치에서는 먼저 변환 후 연결한다.
=TEXT(--B2, "0.00") & " kg"
3.7 사용자 함수·가져오기(파워쿼리·외부 데이터)
파워쿼리에서 데이터 유형이 텍스트로 로드되면 본문 수식에서
#VALUE!
가 유발된다. 쿼리 단계에서 형식을 지정한다.
// 파워쿼리 M = Table.TransformColumnTypes(Source,{{"Qty", Int64.Type},{"UnitPrice", type number}})
3.8 지역 설정 불일치(소수점·천 단위)
시스템 소수점이
.
인데 데이터는
,
를 쓰는 경우가 흔하다. 변환 전용 헬퍼 열을 만든다.
=LET(s,A2, --SUBSTITUTE(SUBSTITUTE(s,".",""),",","."))
또는 파일 옵션에서 고급 > 시스템 구분 기호 사용 체크를 해제하고 원하는 구분 기호를 지정한다.
3.9 범위 참조의 부분 텍스트 포함
예를 들어
SUM(A2:A10)
범위에 텍스트 "N/A"가 섞이면 오류가 발생하지 않지만, 텍스트를 산술 인수로 직접 전달하는 특정 사용자 정의 함수·행 단위 계산에서
#VALUE!
가 발생할 수 있다. 안정화를 위해 정규화한 범위를 사용한다.
=SUMPRODUCT(--ISNUMBER(A2:A100), A2:A100)
3.10 행·열 방향 불일치
두 범위를 요소별 연산할 때 치수가 같아야 한다.
=SUMPRODUCT( A2:A100 * TRANSPOSE(B2:B100) )
또는 동적 배열을 이용한다.
=SUM( A2:A100 * B2:B100 )
4. 함수별 대표 사례와 해결책
4.1 SUM, AVERAGE, PRODUCT
- 원인: 범위 내 오류값 포함, 텍스트 숫자 혼합이다.
-
해결:
IFERROR로 오류 차단, 텍스트 숫자 정규화이다.
=SUM(IFERROR(--SUBSTITUTE(A2:A100,",",""),0))
4.2 VLOOKUP/XLOOKUP
- 원인: 조회키 유형 불일치(텍스트 "123" vs 숫자 123), 정렬 옵션 오류이다.
- 해결: 양측 키를 동일 유형으로 강제한다.
=XLOOKUP(--A2, --Table1[Key], Table1[Value], "없음")
4.3 DATE, DATEDIF, NETWORKDAYS
- 원인: 달·일 인수에 텍스트 포함, 잘못된 범위 또는 음수 날짜이다.
-
해결:
VALUE또는DATEVALUE로 변환 후 전달한다.
=DATE( VALUE(YEAR(A2)), VALUE(MONTH(A2)), VALUE(DAY(A2)) )
4.4 TEXT, VALUE
- 원인: 포맷 문자열 오류 또는 변환 불가능한 문자 포함이다.
- 해결: 포맷 문자열을 표준 패턴으로 교체하고, 원본을 정제한다.
=VALUE(SUBSTITUTE(SUBSTITUTE(A2,"원",""),",",""))
4.5 LEFT/RIGHT/MID + 숫자 변환
부분 문자열 추출 후 바로 산술 연산 시 실패한다. 추출 후 변환한다.
=--MID(SUBSTITUTE(A2,",",""),2,5)
4.6 SUMIFS/COUNTIFS
- 원인: 조건식에 배열 길이 불일치 또는 비교 연산자 포함 텍스트 결합 형식 오류이다.
- 해결: 조건 문자열을 올바르게 구성한다.
=SUMIFS(C:C, A:A, ">=" & F1, A:A, "<" & F2)
4.7 INDIRECT, OFFSET
문자열 주소가 유효하지 않거나 외부 통합문서가 닫혀 있으면
#REF!
또는
#VALUE!
가 발생한다. 동적 배열과 구조화 참조로 대체를 검토한다.
5. 데이터 정제 레시피 모음
5.1 숫자·통화·단위 혼합 정제
=LET( s, A2, s1, SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(s,"원",""),",","")," KRW",""), --TRIM(s1) )
5.2 다중 공백·개행 제거
=TEXTJOIN(" ", TRUE, FILTERXML("<t>" & SUBSTITUTE(TRIM(A2)," ", "</t><t>") & "</t>","//t"))
5.3 숫자 검증과 변환 파이프라인
=LET( s, A2:A100, cleaned, TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(s,CHAR(160),""),",","")," ","")), nums, IFERROR(--SUBSTITUTE(cleaned,".","."), NA()), nums )
5.4 한글·영문 혼합 제품코드 추출
=TEXTJOIN("",TRUE,IFERROR(MID(A2,SEQUENCE(LEN(A2)),1)*1,""))
수식은 각 문자에 대해 숫자만 추출하여
#VALUE!
를 방지한다.
6. 재발 방지: 설계 원칙과 표준
6.1 입력 검증 계층 도입
원시 데이터 범위에 데이터 유효성 검사와 오류 차단 래퍼를 둔다.
=LET(x, A2, IF(ISTEXT(x), IFERROR(--SUBSTITUTE(x,",",""), NA()), x))
6.2 오류 전파 차단 인터페이스
보고용 시트에는
IFERROR
한 단계만 허용하고, 핵심 계산 시트에서는 오류 원인을 로깅한다.
=IFERROR(Core!B2, "입력오류:" & Core!A2)
6.3 표준화된 변환 함수 캡슐화(LAMBDA)
=LAMBDA(s, LET( t, TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(s,CHAR(160),""),","," "),CHAR(10)," ")), IFERROR(--SUBSTITUTE(t," ",""), NA()) ))
이 람다를 이름 관리자에 등록하여 재사용한다.
6.4 동적 배열 우선 설계
행·열 치수 불일치를 방지하기 위해
TOCOL
·
TOROW
·
WRAPROWS
·
WRAPCOLS
를 적극 활용한다.
7. 현장 체크리스트
| 항목 | 체크 방법 | 합격 기준 | 주기 |
|---|---|---|---|
| 숫자 유형 통일 |
ISNUMBER
로 샘플 30건 검사
|
불일치 ≤ 1% | 매 파일 수집 시 |
| 숨은 문자 제거 |
LEN
vs
LEN(TRIM(CLEAN()))
|
차이 0 | 매 수집 시 |
| 로케일 확인 | 소수점·천 단위 확인표 작성 | 문서 표준과 일치 | 분기 1회 |
| 스필 충돌 | 스필 테두리 확인 | 충돌 없음 | 수식 수정 시 |
| 오류 로깅 | 오류 카운트 시트 자동 생성 |
#VALUE!
0건
|
매 배포 시 |
8. 워크시트 설계 예시
다음은 원시 데이터 정제, 계산, 보고의 3계층 구조 샘플이다.
시트 Raw: 외부에서 가져온 원본을 그대로 보관한다 시트 Staging: 정제·표준화 전용 수식을 둔다 시트 Report: 사용자 표시용으로 오류 메시지를 숨긴다
// Staging 시트 예시 =LET( rng, Raw!A2:C1000, qty, IFERROR(--SUBSTITUTE(INDEX(rng,,1),",",""), NA()), unit, TRIM(CLEAN(INDEX(rng,,2))), prc, IFERROR(--SUBSTITUTE(INDEX(rng,,3),",",""), NA()), HSTACK(qty, unit, prc) )
9. 자동화와 품질 통제
9.1 조건부 서식으로 위험 포인트 강조
수식: =ISTEXT(A2) 서식: 연한 빨강 채우기
9.2 데이터 유효성 검사
허용: 정수 데이터: 0보다 큼 오류 경고: "정수만 입력한다"
9.3 오류 대시보드
=LET(r,Staging!A2:C1000, "VALUE오류", COUNTIF(r,"#VALUE!"), "텍스트숫자", SUM(--ISTEXT(INDEX(r,,1))), "숨은문자", SUM(--(LEN(INDEX(r,,2))<>LEN(TRIM(CLEAN(INDEX(r,,2)))))) )
10. CSV·TXT·웹데이터 수집 시 주의점
- 인코딩을 명확히 지정한다(예: UTF-8, EUC-KR)이다.
- 구분자를 고정한다(쉼표·탭·세미콜론)이다.
- 소수점·천 단위 구분자를 문서 표준으로 통일한다이다.
- 헤더 행 유무를 명시하고, 열 데이터 유형을 사전에 정의한다이다.
// 텍스트 가져오기 시 마법사 권장 설정 원본 파일: 65001 UTF-8 구분 기호: 쉼표 텍스트 한정자: " 열 데이터 형식: 수량=일반, 단가=일반, 날짜=YMD
CHAR(160)
은 미리 제거하지 않으면 일괄 변환이 실패한다.
11. 에러 핸들링 패턴 모음
11.1 수식 실패를 예측하고 안전값 제공
=IFERROR( TargetFormula, 0 )
11.2 원인 메시지 동시 출력
=IFERROR(TargetFormula, "형식오류:" & A2)
11.3 TRY·CATCH 패턴(LET로 가독성 향상)
=LET( result, IFERROR(--SUBSTITUTE(A2,",",""), NA()), IF(ISNA(result), "변환실패", result) )
12. VBA로 대량 정제(선택)
반복 데이터 정제가 잦다면 매크로로 표준화한다.
Sub CleanNumbers() Dim rng As Range For Each rng In Selection If Not IsEmpty(rng.Value) Then Dim s As String s = CStr(rng.Value) s = Replace(s, Chr(160), "") s = Replace(s, ",", "") s = Application.WorksheetFunction.Trim(WorksheetFunction.Clean(s)) If IsNumeric(s) Then rng.Value = CDbl(s) End If Next rng End Sub
13. 케이스 스터디: 생산원가 리포트 #VALUE! 제거
상황: ERP에서 월간 원가 CSV를 내려받아 요약 피벗과 KPI를 만든다. 오류 원인은 단가 열의 비가시 공백과 콤마 소수점이었다. 조치: 파워쿼리에서 단가 열 유형을
number
로 지정하고,
Replace Values
로
.
제거·
,
를
.
로 치환하였다. 정제 후 동적 배열 수식으로 합계를 재계산하고 보고 시트에서는
IFERROR
를 제거하였다. 결과: 계산 속도 38% 개선,
#VALUE!
0건, 검증 시간 30분 단축이다.
14. 빠른 참조 표
| 증상 | 가능 원인 | 테스트 | 해결 |
|---|---|---|---|
| 합계 수식에서 #VALUE! | 텍스트 숫자·오류값 섞임 |
ISTEXT
·
ISNUMBER
|
IFERROR
·정제 후
--
변환
|
| 날짜 계산 실패 | 텍스트 날짜·로케일 불일치 |
DATEVALUE
·
TEXTSPLIT
|
포맷 정규화 후 변환 |
| VLOOKUP 오동작 | 키 유형 불일치 |
양측
ISTEXT/ISNUMBER
|
양측 동일 유형 강제 |
| 스필 불가 | 스필 영역 점유 | 스필 표시 확인 | 영역 비우기 |
| 가져오기 후 계산 실패 | 열 유형 미지정 | 파워쿼리 미리보기 | 열 형식 명시 |
15. 최종 점검 루틴(복사·붙여넣기 가능)
1) 샘플 30건 유형 검사: =ISTEXT(), =ISNUMBER()
2) 숨은 문자 제거: TRIM+CLEAN+SUBSTITUTE
3) 로케일 검증: 소수점·천 단위·날짜 구분 확인
4) 배열 치수 확인: ROWS/COLUMNS, 스필 충돌 제거
5) 오류 대시보드 확인: COUNTIF("#VALUE!") == 0
FAQ
#VALUE!와 #N/A의 차이는 무엇인가?
#VALUE!
는 데이터 유형·구조의 문제이고,
#N/A
는 조회 실패이다.
XLOOKUP
의 네 번째 인수로 대체값을 지정하면
#N/A
만 처리한다.
텍스트 숫자를 자동으로 숫자로 바꾸는 가장 안전한 방법은 무엇인가?
원본 보존을 위해 헬퍼 열에서
TRIM
·
CLEAN
·
SUBSTITUTE
후
--
로 변환하고, 검증 후 원본 대체를 권장한다.
CSV에서 가져올 때 매번 #VALUE!가 생긴다. 어떻게 예방하나?
파워쿼리를 기본 경로로 사용하고, 인코딩·구분자·열 형식을 고정한다. 월별 파일 구조가 동일하도록 템플릿을 강제한다.
IFERROR로 모두 감싸면 끝인가?
보고 단계에서는 가능하지만, 계산 단계에서는 원인을 은폐한다. 오류 로깅을 병행하고 원인을 제거하는 것이 원칙이다.
동적 배열 도입이 도움이 되나?
치수 불일치와 보조열 과다 문제를 줄인다. 다만 스필 충돌 관리가 필요하다.