DiffMate

블로그로 돌아가기

스프레드시트에서 오류를 빠르게 찾는 방법

2025년 4월 10일

스프레드시트 오류는 비즈니스에 심각한 영향을 미칠 수 있습니다. 단순한 오타 하나가 수백만 달러의 손실로 이어지거나, 잘못된 정책 결정의 근거가 되기도 합니다. 이 글에서는 실제 사례를 통해 스프레드시트 오류의 위험성을 살펴보고, 이를 빠르게 찾아내는 실전 기법들을 상세히 다룹니다.

실제 스프레드시트 재앙 사례

JP모건의 런던 웨일 사건은 가장 잘 알려진 스프레드시트 오류 사례입니다. 2012년, 리스크 관리 모델을 엑셀로 구축하는 과정에서 복사-붙여넣기 오류가 발생했고, 이로 인해 VaR(Value at Risk) 계산이 실제 위험을 과소평가했습니다. 결과적으로 60억 달러 이상의 트레이딩 손실이 발생했습니다.

하버드 대학의 경제학자 카르멘 라인하트와 케네스 로고프의 논문도 유명한 사례입니다. 2010년 발표된 “국가 부채 비율이 GDP의 90%를 넘으면 경제 성장이 급격히 둔화된다”는 주장은 전 세계 긴축 재정 정책의 핵심 근거가 되었습니다. 그런데 2013년, 매사추세츠 대학의 대학원생 토마스 헌든이 이 논문의 엑셀 파일을 검증하면서 심각한 문제를 발견했습니다. AVERAGE 수식의 범위가 잘못 설정되어 뉴질랜드, 호주, 캐나다, 벨기에, 오스트리아 5개국의 데이터가 누락되었던 것입니다. 올바른 데이터로 재계산하면 90% 임계값에서의 GDP 성장률 하락은 훨씬 완만했으며, 원래 주장된 마이너스 성장이 아닌 약 2.2%의 양의 성장률이 유지되는 것으로 나타났습니다. 셀 범위 하나의 오류가 전 세계 경제 정책에 영향을 미친 셈입니다.

바클레이스의 리먼 브라더스 인수 사건도 주목할 만합니다. 2008년 리먼 브라더스 파산 시, 바클레이스가 인수할 계약 목록을 엑셀로 작성했습니다. 그런데 숨겨진 행(hidden rows)에 포함된 179개의 계약이 PDF 변환 과정에서 함께 포함되면서, 바클레이스는 의도하지 않았던 계약까지 인수하게 되었습니다. 엑셀의 숨긴 행 기능이 법적 분쟁의 원인이 된 사례입니다.

TransAlta라는 캐나다 전력 회사에서는 2003년에 엑셀 복사-붙여넣기 오류로 헤지 계약의 입찰 가격이 잘못 입력되어 2,400만 달러의 손실이 발생했습니다. 이처럼 스프레드시트 오류는 산업과 규모를 가리지 않고 발생합니다. 실제로 여러 연구에 따르면 대규모 스프레드시트의 약 90%에 하나 이상의 중대한 오류가 포함되어 있다고 합니다.

흔한 스프레드시트 오류 유형

스프레드시트 오류는 크게 입력 오류, 수식 오류, 참조 오류, 포맷 오류, 논리 오류로 나눌 수 있습니다.

**입력 오류**는 가장 흔한 유형입니다. 숫자 오타(10000을 100000으로 입력), 행 누락, 중복 입력, 잘못된 셀에 데이터 입력 등이 포함됩니다. 특히 대량의 데이터를 수동으로 입력할 때 발생 빈도가 높습니다. 연구에 따르면 수동 데이터 입력의 오류율은 약 1~5%에 달합니다.

**수식 오류**는 =SUM 범위가 잘못되었거나, 새 행을 추가했는데 수식 범위에 포함되지 않는 경우가 대표적입니다. 또한 절대참조($A$1)와 상대참조(A1)를 혼동하여 수식을 복사할 때 참조가 의도치 않게 이동하는 경우도 빈번합니다.

**참조 오류**는 다른 시트나 파일을 참조할 때 발생합니다. 원본 파일이 이동되거나 삭제되면 #REF! 에러가 발생합니다. 외부 파일 참조가 많은 스프레드시트는 특히 이 문제에 취약합니다.

**포맷 오류**는 눈에 잘 보이지 않아 위험합니다. 숫자가 텍스트로 저장되어 SUM에 포함되지 않거나, 날짜 형식이 지역 설정에 따라 달라지는 경우가 대표적입니다. 2023/01/02가 미국식(1월 2일)인지 유럽식(2월 1일)인지에 따라 데이터 분석 결과가 완전히 달라질 수 있습니다. 또한 CSV 파일을 가져올 때 우편번호 등의 앞자리 0이 자동으로 삭제되는 문제도 흔히 발생합니다.

**논리 오류**는 수식 자체는 에러 없이 작동하지만 비즈니스 로직이 잘못된 경우입니다. 예를 들어 할인율을 곱해야 하는데 더하거나, 세전 금액과 세후 금액을 혼동하는 경우가 이에 해당합니다.

복사-붙여넣기 오류 패턴과 탐지법

복사-붙여넣기는 스프레드시트에서 가장 흔한 작업이자 가장 위험한 작업입니다. 대표적인 오류 패턴을 살펴보겠습니다.

**범위 이탈 오류**: A1:A10을 복사하여 B1에 붙여넣으려 했는데, 실수로 B2에 붙여넣어 한 행씩 어긋나는 경우입니다. 이 오류는 데이터가 많으면 육안으로 발견하기 매우 어렵습니다. 옆 열의 합계와 교차 검증하거나, 원본과 복사본의 행 수를 COUNTA 함수로 비교하면 발견할 수 있습니다.

**부분 선택 오류**: 필터링된 상태에서 복사할 때 보이는 셀만 복사되는 것을 모르고 전체가 복사되었다고 착각하는 경우입니다. Alt+;(보이는 셀만 선택) 단축키를 명시적으로 사용하거나, 필터를 해제한 후 결과를 확인해야 합니다.

**수식/값 혼동**: 수식이 포함된 셀을 복사할 때 “값으로 붙여넣기”를 해야 하는 상황에서 수식 그대로 붙여넣거나, 반대로 수식을 유지해야 하는데 값만 붙여넣는 실수가 빈번합니다.

오류 탐지 방법 1: 조건부 서식 활용

엑셀의 조건부 서식을 사용하면 특정 조건에 맞는 셀을 시각적으로 강조할 수 있습니다. 오류 탐지에 활용할 수 있는 구체적인 방법들을 소개합니다.

**이상값 탐지**: 평균에서 표준편차의 2배 이상 벗어난 값을 강조할 수 있습니다. 조건부 서식의 수식 옵션에서 =ABS(A1-AVERAGE($A:$A))>2*STDEV($A:$A) 같은 수식을 사용합니다.

**중복 값 탐지**: “홈 → 조건부 서식 → 셀 강조 규칙 → 중복 값”으로 빠르게 확인할 수 있습니다. ID 컬럼이나 고유해야 하는 필드에 적용하면 데이터 무결성을 쉽게 확인할 수 있습니다.

**빈 셀 탐지**: =ISBLANK(A1) 조건을 적용하여 비어있으면 안 되는 필수 필드의 누락을 시각적으로 확인할 수 있습니다.

**데이터 유형 불일치**: =ISTEXT(A1) 조건을 숫자 열에 적용하면 실수로 텍스트가 입력된 셀을 찾을 수 있습니다.

오류 탐지 방법 2: 데이터 유효성 검사

데이터가 입력될 때부터 오류를 방지하는 것이 가장 효과적입니다. “데이터 → 데이터 유효성 검사”에서 입력 가능한 값의 범위, 유형, 목록을 미리 설정할 수 있습니다.

예를 들어 수량 열에는 0 이상의 정수만, 날짜 열에는 2020년 이후의 날짜만, 부서명 열에는 드롭다운 목록의 값만 입력되도록 제한할 수 있습니다. 기존 데이터에 대해서도 “데이터 → 데이터 유효성 검사 → 오류 표시”를 통해 규칙에 맞지 않는 셀을 원으로 표시하여 찾을 수 있습니다.

오류 탐지 방법 3: 수식 감사 도구 활용

엑셀에는 수식 오류를 찾기 위한 강력한 감사 도구가 내장되어 있습니다.

**F2 키를 활용한 수식 확인**: 셀을 선택하고 F2를 누르면 편집 모드로 전환되며, 해당 수식이 참조하는 셀 범위가 색상으로 표시됩니다. SUM 범위가 올바른지, 참조가 의도한 셀을 가리키는지 빠르게 확인할 수 있습니다.

**수식 표시 모드(Show Formulas)**: Ctrl+` (백틱) 키를 누르면 모든 셀의 수식이 결과값 대신 표시됩니다. 이 모드에서는 값으로 하드코딩된 셀과 수식이 있는 셀을 한눈에 구분할 수 있으며, 수식 패턴의 일관성을 확인하기 좋습니다. 한 열의 수식이 모두 =B2*C2 패턴인데 중간에 =B5*D5처럼 다른 패턴이 있다면 오류를 의심해볼 수 있습니다.

**참조 추적(Trace Precedents/Dependents)**: “수식 → 참조 추적 → 참조되는 셀 추적”을 클릭하면 선택된 셀에 입력값을 제공하는 셀들이 화살표로 표시됩니다. 반대로 “종속 셀 추적”은 현재 셀의 값이 어디에서 사용되는지 보여줍니다. 복잡한 수식 체인에서 의도치 않은 참조를 발견하는 데 필수적인 도구입니다.

**오류 검사 도구**: “수식 → 오류 검사”를 실행하면 현재 시트의 모든 오류(#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)를 순차적으로 찾아줍니다.

오류 탐지 방법 4: IFERROR를 활용한 방어적 수식 작성

수식에서 발생할 수 있는 에러를 사전에 감싸서 처리하면 스프레드시트의 안정성이 크게 향상됩니다.

**#DIV/0! 방지**: =A1/B1 대신 =IFERROR(A1/B1, 0) 또는 =IF(B1=0, “N/A”, A1/B1)을 사용합니다. 나누는 값이 0이 될 수 있는 상황을 미리 처리하는 것입니다.

**#REF! 방지**: VLOOKUP이나 INDEX/MATCH에서 찾는 값이 없을 때 #N/A가 반환됩니다. =IFERROR(VLOOKUP(A1, Sheet2!A:B, 2, FALSE), “미발견”)처럼 감싸면 에러 대신 의미 있는 메시지를 표시할 수 있습니다.

**#VALUE! 방지**: 텍스트와 숫자를 연산할 때 발생하는 #VALUE! 에러는 =IFERROR(VALUE(A1)*B1, 0)으로 처리할 수 있습니다.

단, IFERROR를 무분별하게 사용하면 오히려 오류를 숨기는 역효과가 있습니다. 오류가 발생했을 때 “0”이나 빈 문자열로 대체하면, 잘못된 데이터가 정상 데이터처럼 보여 더 큰 문제를 야기할 수 있습니다. 오류 처리용 별도 열을 만들어 =ISERROR(원래수식) 으로 에러 발생 여부를 모니터링하는 것이 바람직합니다.

오류 탐지 방법 5: 이전 버전과 비교

가장 확실한 오류 탐지 방법은 이전 정상 버전과 현재 버전을 비교하는 것입니다. 의도하지 않은 변경을 빠르게 발견할 수 있습니다.

DiffMate를 사용하면 두 엑셀 파일의 셀 단위 차이를 시각적으로 확인할 수 있습니다. 변경된 셀, 추가된 행, 삭제된 행이 색상으로 구분되어 오류를 빠르게 발견할 수 있습니다. 특히 수식이 결과값으로 대체되었거나, 특정 영역의 데이터가 통째로 밀려난 경우를 즉시 파악할 수 있습니다.

오류 탐지 방법 6: 데이터 프로파일링 기법

데이터 프로파일링은 데이터의 전체적인 특성을 분석하여 이상을 감지하는 방법입니다.

**분포 분석**: 숫자 데이터의 최솟값, 최댓값, 평균, 중앙값, 표준편차를 확인합니다. MIN, MAX, AVERAGE, MEDIAN, STDEV 함수를 요약 행에 배치해두면 데이터가 변경될 때 이상을 즉시 감지할 수 있습니다. 예를 들어 급여 데이터의 최댓값이 갑자기 10배 뛰었다면 입력 오류를 의심해야 합니다.

**이상값(Outlier) 탐지**: IQR(사분위 범위) 방법을 활용합니다. Q1(25번째 백분위수)과 Q3(75번째 백분위수)를 구한 후, Q1-1.5*IQR 미만이거나 Q3+1.5*IQR 초과인 값을 이상값으로 분류합니다. QUARTILE 함수와 조건부 서식을 결합하면 자동으로 이상값을 강조할 수 있습니다.

**카테고리 분석**: 텍스트 데이터의 경우 COUNTIF를 사용하여 각 카테고리별 개수를 확인합니다. “서울”, “서 울”, “Seoul”처럼 같은 값의 변형이 섞여 있는지 확인할 수 있습니다.

오류 탐지 방법 7: 피벗 테이블 교차 검증

피벗 테이블은 대량의 데이터를 요약하고 교차 검증하는 데 매우 효과적인 도구입니다.

원본 데이터의 행 수와 피벗 테이블의 총합계가 일치하는지 확인합니다. 불일치가 있다면 빈 셀이나 텍스트 형식의 숫자 등이 원인일 수 있습니다. 또한 같은 데이터에서 서로 다른 기준으로 피벗 테이블을 두 개 만들고, 총합이 동일한지 비교하면 데이터 무결성을 확인할 수 있습니다.

피벗 테이블의 필터 드롭다운을 열어 예상치 못한 값(오타, 공백 포함 문자열 등)이 카테고리에 포함되어 있는지도 확인해야 합니다.

이름 범위(Named Ranges)로 안전한 수식 관리

셀 주소 대신 이름 범위를 사용하면 수식의 가독성과 안정성이 크게 향상됩니다.

=VLOOKUP(A1, Sheet2!$A$1:$D$500, 3, FALSE) 같은 수식은 참조 범위가 명확하지 않아 실수하기 쉽습니다. 대신 Sheet2!$A$1:$D$500에 “제품목록”이라는 이름을 부여하면 =VLOOKUP(A1, 제품목록, 3, FALSE)로 작성할 수 있어 수식의 의도가 명확해집니다.

이름 범위는 “수식 → 이름 관리자”에서 관리할 수 있으며, 동적 이름 범위를 설정하면 데이터가 추가될 때 범위가 자동으로 확장됩니다. =OFFSET(Sheet1!$A$1, 0, 0, COUNTA(Sheet1!$A:$A), 1)과 같은 수식으로 동적 범위를 정의할 수 있습니다.

INDIRECT와 OFFSET 수식의 위험성

INDIRECT와 OFFSET 함수는 강력하지만 감사하기 어려운 수식을 만들어낼 수 있습니다.

INDIRECT 함수는 텍스트 문자열을 셀 참조로 변환합니다. =INDIRECT(“A”&B1)처럼 사용하면 B1의 값에 따라 참조가 동적으로 바뀝니다. 문제는 이 참조가 “참조 추적” 도구에 표시되지 않는다는 것입니다. 시트 이름이 바뀌거나 열이 삽입되어도 수식은 에러 없이 잘못된 셀을 참조하게 됩니다.

OFFSET 함수도 마찬가지로 휘발성 함수(volatile function)이며, 참조 추적이 작동하지 않습니다. 가능하면 INDEX/MATCH 조합으로 대체하는 것이 감사 가능성과 성능 모두에서 유리합니다.

합계 검증과 체크섬 기법

데이터의 합계, 개수, 평균 등의 요약 통계를 별도로 관리하고, 데이터가 변경될 때마다 이 값들이 예상 범위 내인지 확인합니다.

예를 들어 전월 매출 합계가 1억인데 당월이 10억이라면 입력 오류를 의심할 수 있습니다. 행 수가 갑자기 줄었다면 데이터가 삭제되었을 가능성이 있습니다. 이러한 체크섬을 시트 상단이나 별도 시트에 대시보드 형태로 구성해두면 매일 수초 내에 데이터 무결성을 확인할 수 있습니다.

스프레드시트 감사 도구

내장 기능 외에도 스프레드시트 감사를 도와주는 전문 도구들이 있습니다.

**Spreadsheet Detective**: 셀 간 참조 관계를 시각적 맵으로 보여주는 도구입니다. 복잡한 스프레드시트의 데이터 흐름을 한눈에 파악할 수 있습니다.

**Excel의 Inquire 추가 기능**: Excel 365에서는 Inquire 추가 기능으로 통합 문서 구조를 분석하고, 수식 불일치를 탐지하며, 두 통합 문서 버전을 나란히 비교할 수 있습니다.

**PerfectXL**: 스프레드시트의 구조적 문제, 숨겨진 리스크, 수식 복잡도를 분석하는 전문 도구입니다. 감사 보고서를 자동으로 생성해줍니다.

대규모 금융 스프레드시트를 다루는 조직에서는 이러한 전문 도구의 도입을 검토할 가치가 있습니다. 특히 규정 준수가 요구되는 금융 기관에서는 이러한 도구를 활용한 정기적인 감사가 필수적입니다.

오류에 강한 스프레드시트 템플릿 만들기

처음부터 오류에 강한 템플릿을 설계하면 나중에 오류를 찾는 수고를 크게 줄일 수 있습니다.

**입력 영역과 계산 영역 분리**: 사용자가 데이터를 입력하는 영역(흰 배경)과 수식이 계산하는 영역(회색 배경)을 시각적으로 분리합니다. 계산 영역은 시트 보호로 수정을 방지합니다.

**검증 행 추가**: 데이터 하단에 검증용 행을 배치합니다. 행 수 카운트(=COUNTA), 합계 검증(=SUM과 별도 계산의 일치 여부), 빈 셀 수(=COUNTBLANK) 등을 자동으로 계산하게 합니다.

**버전 정보 기록**: 시트 상단이나 별도 시트에 최종 수정일, 수정자, 변경 내용을 기록하는 영역을 만들어 관리합니다.

**색상 코드 규칙**: 입력 셀은 노란색, 수식 셀은 회색, 참조 셀은 파란색 등의 규칙을 팀 내에서 통일하면 실수로 수식을 덮어쓰는 일을 방지할 수 있습니다.

오류 예방 팁

  • 중요한 스프레드시트는 수정 전 반드시 백업
  • 여러 사람이 편집하는 파일은 수정 이력 관리
  • 수식이 많은 시트는 시트 보호 기능 활용
  • 정기적으로 이전 버전과 비교하여 의도치 않은 변경 확인
  • 데이터 입력 규칙을 문서화하고 팀과 공유
  • 하드코딩된 숫자 대신 이름 범위나 별도 참조 셀 사용
  • 월 1회 이상 수식 감사(Ctrl+` 모드) 실시
  • 대시보드에 체크섬을 배치하여 일일 검증 루틴 수립

결론

스프레드시트 오류를 완전히 막을 수는 없지만, 체계적인 방법으로 빠르게 발견할 수 있습니다. 조건부 서식, 데이터 유효성 검사, 수식 감사 도구, IFERROR 방어 패턴, 데이터 프로파일링, 피벗 테이블 교차 검증, 이름 범위 활용, 그리고 이전 버전과의 비교까지 — 이러한 기법들을 조합하면 대부분의 오류를 조기에 발견할 수 있습니다. 특히 DiffMate로 정기적으로 파일을 비교하는 습관을 들이면 의도치 않은 변경을 즉시 감지하여 데이터 품질을 크게 높일 수 있습니다.

DiffMate로 스프레드시트 비교하기