Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 발생하는 #NUM! 오류의 의미와 대표 원인을 정확히 진단하고, 함수별·상황별 해결 절차를 단계적으로 제시하여 현장에서 즉시 문제를 재현·수정할 수 있도록 돕는 것이다.
#NUM! 오류는 “계산 가능한 숫자 결과 자체가 유효 범위를 벗어났거나”, “수학적으로 해가 존재하지 않거나”, “반복 계산이 수렴하지 못한” 경우에 발생하는 오류이다. 텍스트·형식 문제로 생기는 #VALUE! 또는 참조 문제로 생기는 #REF!와 구분해야 한다.
실무에서 빠르게 원인을 좁히려면 다음 순서로 점검한다.
| 원인 유형 | 전형적 증상 | 핵심 점검·해결 |
|---|---|---|
| 정의역 위반(수학함수) | SQRT 음수, LOG·LN 입력≤0, POWER의 음수 밑과 유리수 지수 조합 등에서 #NUM! 발생 | 입력 범위 사전 필터링, IF·MAX·ABS로 정의역 강제, 예외 분기 설계 |
| 반복 계산 미수렴(금융·해 찾기) | IRR/XIRR, RATE, NPER 등에서 “추정값에 따라 결과 다름”, “일부 케이스만 실패” | 초기 추정값 조정, 현금흐름 부호 변화 조건 검토, 범위 이분법 구현, 최대 반복·허용오차 설정 |
| 비현실적 스케일(오버플로·언더플로) | 거듭제곱·팩토리얼 등에서 값이 너무 커서 내부 한계 초과 | 로그 스케일로 변환, Stirling 근사 등 수치 안정화, 단위 재설정 |
| 날짜·시간 논리 위반 | DATEDIF에서 종료일<시작일일 때 #NUM!, 일부 시간 함수 음수 또는 범위 초과 | 시작·종료 역전 방지, 음수 시간 처리 로직, 기준일·일반수 포맷으로 검증 |
| 순차 계산 중간값 붕괴 | 중간 계산은 정상처럼 보이나 특정 분기에서 급격히 발산하여 최종 단계에서 #NUM! | 중간 단계 캐시(헬퍼 열)로 각 단계의 최대·최소·부호 검사, 경계값 클리핑 |
정의역을 명확히 통제하면 대부분 해결된다.
/* 음수 입력 시 제곱근을 0으로 클리핑 */ =SQRT(MAX(0, A2))
/* log(0) 또는 음수 방지 */
=IF(A2>0, LN(A2), NA())
/* 음수 밑의 유리수 지수 방지: 분모가 짝수면 실수해가 없음 */
=LET(
base, A2, p, B2, q, C2,
IF(AND(base<0, ISEVEN(q)), NA(), base^(p/q))
)
내부적으로 해 찾기(뉴턴, 이분 탐색 등) 반복이 수행되며, 다음 조건에서 #NUM!이 발생한다.
대응 절차는 다음과 같다.
/* XIRR가 #NUM!일 때 이분 탐색으로 수렴을 유도하는 패턴 */ =LET( cf, C2:C25, dt, B2:B25, f, LAMBDA(r, SUM( cf / (1+r)^((dt-INDEX(dt,1))/365) ) ), lo, -0.9, hi, 1.0, tol, 1E-7, maxit, 200, LAMBDA(lo0,hi0,i, IF(i>maxit, NA(), LET(m, (lo0+hi0)/2, IF(ABS(f(m))<tol, m, IF(f(lo0)*f(m)<0, RECURSE(lo0,m,i+1), RECURSE(m,hi0,i+1)) ) ) ) )(lo,hi,0) ) =IF(B2>=A2, DATEDIF(A2,B2,"D"), NA()) /* 또는 무조건 양수 일수 */ =DATEDIF(MIN(A2,B2), MAX(A2,B2), "D") =LET(h, A2, m, B2, s, C2, TIME(MOD(h,24), MOD(m,60), MOD(s,60))) 극단적 파라미터에서 오버플로가 발생하면 #NUM!이 나타난다. 로그-도메인으로 변환하거나 근사를 활용한다.
/* 큰 값 곱셈을 로그 합으로 변환 후 지수화 */ =EXP(SUM(LOG(A2:A100))) =ERROR.TYPE(E2) /* 6이면 #NUM! */ =LET(x, A2, IF(x>0, LN(x), NA())) =MAP(A2:A100, LAMBDA(z, IF(z<0, NA(), SQRT(z)))) 일부 모델은 순환 참조나 해 찾기 로직을 의도적으로 사용한다. 이때 다음 설정을 적용한다.
경계값 처리는 #NUM! 예방의 최전선이다.
/* 하한·상한 클리핑 */ =LET(x, A2, MIN(MAX(x, lower), upper))
/* 0 또는 음수 입력 방지 */
=LET(x, A2, IF(x<=0, NA(), LN(x)))
/* 제어된 예외 처리 /
=IFERROR(formula, NA()) / 차트에서 결측으로 처리되어 단절됨 */
| 날짜 | 현금흐름 | 비고 |
|---|---|---|
| 2025-01-01 | -100,000 | 투자 |
| 2025-02-01 | 20,000 | 회수 |
| 2025-03-01 | 20,000 | 회수 |
| 2025-04-01 | 20,000 | 회수 |
| 2025-05-01 | 20,000 | 회수 |
| 2025-06-01 | 20,000 | 회수 |
XIRR이 #NUM!을 반환하는 경우가 있다. 원인은 날짜 정렬·중복, 부호 변화 조건 미충족, 추정값 문제 등이다.
다음 패턴으로 #NUM!을 자동 태깅하고 원인을 요약할 수 있다.
/* E열: 최종 수식 결과, A~D열: 입력 */ =LET( val, E2, cause, IF(ERROR.TYPE(val)=6, SWITCH(TRUE, OR(A2<0, B2<=0), "정의역", ISBLANK(C2), "데이터누락", ABS(E2)>1E307, "오버플로", "반복미수렴" ), "정상" ), cause ) | 함수·상황 | #NUM! 발생 조건 | 즉시 해결책 |
|---|---|---|
| SQRT(x) | x<0 | =SQRT(MAX(0,x)) 또는 예외 분기 |
| LN/LOG(x) | x≤0 | =IF(x>0,LN(x),NA()) |
| POWER(a,b) | a<0, b가 유리수이며 분모 짝수 | 짝수 분모 케이스 예외 처리, 정수 지수만 허용 |
| IRR, XIRR | 부호 변화 부재, 데이터 불량, 추정값 불량 | 데이터 정렬, 추정값 스윕, 이분 탐색 |
| RATE, NPER | 해가 존재하지 않거나 수렴 실패 | 초기값 조정, 허용오차·반복 증가, 범위 제한 |
| DATEDIF | 종료일<시작일 | 시작·종료 역전 방지 또는 ABS 처리 |
| TIME(h,m,s) | 음수·범위 초과 파라미터 | MOD로 범위 강제 |
| 대규모 곱·팩토리얼 등 | 오버플로 | 로그-도메인 변환, 근사식 사용 |
#NUM!은 숫자 계산 자체가 불능일 때이며, #VALUE!는 보통 타입 불일치나 텍스트 혼입 등이다. 정의역 위반·수렴 실패는 #NUM!로 귀결되는 경우가 많다.
현금흐름 부호 변화, 날짜 정렬, 중복·공란, 추정값의 차이 때문이다. 데이터를 오름차순으로 정리하고 추정값을 여러 값으로 시도한다.
아니다. 반복 계산은 수렴 문제에만 영향을 준다. 정의역 위반이나 오버플로는 별도의 방어 로직이 필요하다.
IFERROR로 NA()를 반환하게 하면 선형 차트에서 해당 점이 그려지지 않는다.
중간 곱을 LOG로 전환해 합으로 누적하고, 마지막에 EXP로 복원한다. 또한 값의 크기를 요약해 최대치가 비현실적이면 단위를 조정한다.