AI 업무 활용

AI가 제안한 Excel 수식을 빈칸, 0, 텍스트, 날짜로 테스트하는 방법

정상 데이터 한두 줄에서만 맞는다고 AI가 제안한 Excel 수식을 바로 사용하면 안 됩니다. 작은 합성 시트에서 빈칸, 0, 텍스트, 날짜를 테스트하고 Python으로 의도한 결과를 다시 확인합니다.

목차 보기

이런 분께AI 채팅 도우미로 Excel 수식을 만들고, 실제 업무 파일에 적용하기 전에 예외 입력까지 테스트하려는 실무자를 위한 글입니다.

준비사항
  • Excel 또는 일반적인 Excel 수식을 지원하는 스프레드시트 프로그램
  • Python 3.12

01한 행에서 맞는 수식도 전체 데이터에서는 틀릴 수 있는 이유

AI 채팅 도우미가 제안한 Excel 수식은 일반적인 데이터에서는 정상적으로 작동해 보여도, 셀이 비어 있거나 분모가 0이거나 숫자가 들어가야 할 곳에 텍스트가 있거나 날짜가 Excel 일련번호로 저장된 경우에는 전혀 다른 결과를 낼 수 있습니다. 이런 경우는 #DIV/0!이나 #VALUE!처럼 눈에 띄는 오류로만 나타나는 것이 아닙니다. 겉보기에는 그럴듯한 숫자가 나오지만 논리적으로는 잘못된 경우도 있습니다.

아래 예시는 합성 예제입니다. A열에는 이전 값, B열에는 새 값이 있고, C열에서는 (새 값 - 이전 값) / 이전 값으로 변화율을 계산한다고 가정합니다. 업무 규칙은 빈칸이면 빈칸을 유지하고, 분모가 0이거나 숫자가 아닌 값은 CHECK로 표시하며, 날짜는 일반 측정값처럼 계산하지 않는 것입니다.

02의도적으로 엣지케이스를 넣은 작은 시트 만들기

실제 통합문서에 수식을 적용하기 전에 작은 테스트 시트를 만듭니다. 정상 값과 자주 발생하는 예외를 한 번에 볼 수 있도록 다음과 같은 행을 준비합니다.

A: 이전 값B: 새 값의도한 결과
210012020%
350500%
425blank
5010CHECK
6pending10CHECK
7100n/aCHECK
82026-10-012026-10-08CHECK

처음 두 행은 정상 동작을 확인하기 위한 기준입니다. (120 - 100) / 100 = 0.20이므로 20%이고, (50 - 50) / 50 = 0이므로 0%입니다. 나머지 행은 실제 생산 데이터라기보다 수식이 어떻게 실패하는지 확인하기 위한 테스트입니다.

03AI에게 수식을 요청한 뒤 가정을 확인하기

AI 채팅 도우미에는 다음처럼 단순하게 요청할 수 있습니다. A2에서 B2로의 변화율을 계산하고, 오류가 발생하면 결과를 빈칸으로 표시해 달라고 요청합니다.

이 수식은 100에서 120으로 변하는 경우와 50에서 50으로 변하는 경우에는 잘 작동합니다. 하지만 IFERROR는 서로 다른 여러 문제를 같은 빈칸으로 숨깁니다. 분모가 0인 경우, 텍스트 입력, 다른 수식 오류가 모두 사라져 검토 대상인지 구분하기 어려울 수 있습니다. 더 중요한 점은 Excel에서 날짜가 내부적으로 일련번호로 저장된다는 것입니다. A2와 B2가 실제 Excel 날짜라면, 뺄셈과 나눗셈이 정상적으로 수행되어 명백한 오류 대신 숫자 형태의 변화율이 나올 수 있습니다.

즉, 계산이 성공했다는 사실만으로 입력값의 데이터 유형이 의도에 맞다는 것을 증명할 수는 없습니다.

04수식을 더 명시적으로 만들고 모든 행을 테스트하기

앞에서 정한 규칙을 기준으로 하면 다음처럼 조금 더 명시적인 수식을 사용할 수 있습니다.

이 수식은 빈칸, 숫자가 아닌 입력, 분모가 0인 경우를 구분합니다. 따라서 2행부터 7행까지는 의도한 규칙대로 동작합니다. C열의 숫자 결과를 20%처럼 표시하려면 Percentage 형식을 적용하면 됩니다.

하지만 8행에서는 중요한 한계가 드러납니다. Excel 날짜는 내부적으로 숫자이므로 실제 날짜 셀에도 ISNUMBER가 TRUE를 반환합니다. 따라서 이 방어적인 수식도 날짜를 숫자로 계산할 수 있습니다. 일반적인 수식만으로는 어떤 숫자 일련번호가 실제 측정값인지, 의도하지 않은 날짜인지 숫자 자체만 보고 안정적으로 판단할 수 없습니다.

05Python으로 의도한 규칙을 교차검증하기

두 번째 검증으로 합성 테스트 데이터를 row,old_value,new_value 열을 가진 formula_cases.csv로 저장합니다. 2026-10-01과 2026-10-08은 그대로 유지합니다. 다음 표준 라이브러리 기반 스크립트는 의도한 규칙을 독립적으로 적용합니다. 빈칸은 blank, ISO 형식 날짜는 CHECK, 숫자가 아닌 값은 CHECK, 이전 값이 0이면 CHECK로 처리하고, 정상 숫자에서는 변화율을 계산합니다.

python
from pathlib import Path
from decimal import Decimal, InvalidOperation
from datetime import date
import csv
import sys

INPUT_PATH = Path("formula_cases.csv")
OUTPUT_DIR = Path("outputs")
REPORT_PATH = OUTPUT_DIR / "formula_check_report.txt"

if not INPUT_PATH.is_file():
    sys.exit("Missing input file: formula_cases.csv")

if OUTPUT_DIR.exists():
    sys.exit("Stop: outputs folder already exists. Remove or rename it manually first.")


def is_iso_date(value):
    try:
        date.fromisoformat(value)
        return True
    except ValueError:
        return False


def check_change(old_text, new_text):
    old_text = old_text.strip()
    new_text = new_text.strip()

    if old_text == "" or new_text == "":
        return "blank"

    if is_iso_date(old_text) or is_iso_date(new_text):
        return "CHECK"

    try:
        old = Decimal(old_text)
        new = Decimal(new_text)
    except InvalidOperation:
        return "CHECK"

    if old == 0:
        return "CHECK"

    change = (new - old) / old * Decimal("100")
    return f"{change:.2f}%"


results = []

with INPUT_PATH.open("r", encoding="utf-8", newline="") as file:
    reader = csv.DictReader(file)
    required = {"row", "old_value", "new_value"}

    if reader.fieldnames is None or not required.issubset(reader.fieldnames):
        sys.exit("CSV must contain: row, old_value, new_value")

    for record in reader:
        result = check_change(record["old_value"], record["new_value"])
        results.append(
            f"Row {record['row']}: "
            f"old={record['old_value']!r}, "
            f"new={record['new_value']!r} -> {result}"
        )

OUTPUT_DIR.mkdir()
REPORT_PATH.write_text("\n".join(results) + "\n", encoding="utf-8")
print(f"Created: {REPORT_PATH}")

이 7개 합성 행에서 예상되는 Python 결과는 순서대로 20.00%, 0.00%, blank, CHECK, CHECK, CHECK, CHECK입니다. Excel에서 오류가 표시되는지만 보지 말고 행별로 결과를 비교하세요.

06AI가 제안한 수식을 검토할 때 자주 하는 실수

  • 정상적인 한 행만 테스트한 뒤 수천 행에 바로 채워 넣습니다.
  • 누락 데이터와 잘못된 데이터를 구분하지 않고 IFERROR로 모든 실패를 숨깁니다.
  • 분모가 0인 경우 어떤 결과를 낼지 업무 규칙을 별도로 정의하지 않습니다.
  • 숫자처럼 보이거나 숫자 형식으로 표시된 셀이 항상 의도한 숫자 데이터라고 가정합니다.
  • Excel 날짜가 내부적으로 숫자로 저장되어 산술 연산에 참여할 수 있다는 점을 놓칩니다.
  • 표시된 백분율만 비교하고 실제 내부 값이 0.20인지 20인지 다른 배율인지 확인하지 않습니다.
  • 기대 결과를 먼저 정의하지 않고 화면의 오류가 사라질 때까지 수식만 계속 수정합니다.

Python은 같은 업무 규칙을 독립적으로 구현할 수 있다는 점에서 유용합니다. Excel 수식을 문자 그대로 그대로 복제해서는 안 됩니다. 두 구현이 같은 잘못된 가정을 공유하면 교차검증도 동일한 오류를 반복할 수 있습니다.

07최종 수식 테스트 체크리스트 사용하기

  1. 수식을 받아들이기 전에 의도한 계산 규칙을 자연어로 먼저 적습니다.
  2. 정상값, 빈칸, 0, 텍스트, 날짜 테스트 행을 만듭니다.
  3. 단순한 기대 결과는 직접 손으로 계산합니다.
  4. 오류를 무조건 숨길지, 빈칸으로 둘지, CHECK로 표시할지 구분합니다.
  5. 날짜와 기타 Excel 특수 데이터 유형이 어떻게 표현되는지 확인합니다.
  6. 결과가 중요하다면 독립적인 계산으로 규칙을 교차검증합니다.
  7. 그다음에 전체 데이터셋에 수식을 적용합니다.

핵심은 수식 검증이 단순한 문법 문제가 아니라 데이터 유형과 업무 규칙의 문제라는 점입니다. AI가 만든 수식은 초안 구현으로 보고, 엣지케이스 테스트를 통해 실제로 필요한 동작과 일치하는지 확인해야 합니다.

실행·검증 기록

2026-09-21 · hand-checked example · Python 3.12

  • (120 - 100) / 100 = 0.20, 즉 20%인지 손으로 확인했습니다.
  • (50 - 50) / 50 = 0, 즉 0%인지 손으로 확인했습니다.
  • 합성 규칙에서 빈 입력은 blank가 되어야 함을 확인했습니다.
  • 이전 값이 0이면 분모로 사용할 수 없으므로 CHECK로 표시해야 함을 확인했습니다.
  • pending과 n/a는 숫자가 아닌 입력이므로 CHECK로 표시해야 함을 확인했습니다.
  • Python 규칙이 ISO 날짜 2026-10-01과 2026-10-08을 명시적으로 감지해 해당 행을 CHECK로 처리하도록 구성됐는지 확인했습니다.
  • 스크립트가 formula_cases.csv를 읽고 outputs/formula_check_report.txt만 생성하며 outputs 폴더가 이미 있으면 중지하도록 구성됐는지 확인했습니다.
검증 범위의 한계
  • 코드는 검토했고 작은 예제는 손으로 계산했지만, 이 코드를 직접 실행하지는 않았습니다.
  • Python 예제는 2026-10-01 같은 ISO 날짜는 인식하지만 모든 지역별 날짜 형식을 인식하려고 하지는 않습니다.
  • Excel의 실제 날짜는 일련번호로 저장되므로 ISNUMBER만으로 날짜와 일반 숫자 측정값을 구분할 수 없습니다.
  • CSV로 내보내면 스프레드시트의 날짜 표현과 셀 서식이 달라질 수 있으므로 CSV 교차검증만으로 원래 Excel 셀 서식까지 확인할 수는 없습니다.
  • 실제 통합문서에서는 오류값, 백분율, 빈 문자열을 반환하는 수식, 지역별 숫자 형식, 도메인별 검증 규칙에 대한 추가 테스트가 필요할 수 있습니다.

사이트 전체의 작성·검증 원칙

참고 출처

설명과 예제는 직접 작성했습니다. 관련 동작과 개념은 아래 공식 자료에서 확인할 수 있습니다.