業務用スクリプトの依頼文に入力・出力・エラー処理のルールを入れる
「これを自動化して」を、実行可能な task description に変えます。sensitive data を含まない合成 sample と、手作業で確認した expected result を添えて、team ごとの work logs を集計する script request を完成させます。
通常のデータで一度動いただけでは、AIが提案したExcel数式をそのまま使うべきではありません。小さな合成シートで空白、0、文字列、日付を試し、Pythonでも意図した結果を照合します。
この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English
対象読者AIチャットアシスタントでExcel数式を作成し、実際の業務ファイルへ適用する前に例外入力まで確認したい人向けです。
AIチャットアシスタントが提案したExcel数式は、通常のデータでは正しく見えても、セルが空白、分母が0、数値の代わりに文字列が入っている、日付がExcelのシリアル値として保存されている、といった場合に異なる動作をすることがあります。こうした問題は#DIV/0!や#VALUE!のような目立つエラーだけではありません。見た目にはもっともらしい数値が返っても、業務上は誤った結果である場合があります。
以下は合成した例です。A列に旧値、B列に新値を入れ、C列で(新値 - 旧値) / 旧値として変化率を計算するとします。業務ルールは、空白なら空白のまま、分母が0または数値以外ならCHECK、日付は通常の測定値として計算しない、というものです。
実際のブックへ数式を適用する前に、小さなテストシートを作ります。通常値とよくある失敗ケースを一緒に確認できるよう、次の行を用意します。
| 行 | A: 旧値 | B: 新値 | 期待する結果 |
|---|---|---|---|
| 2 | 100 | 120 | 20% |
| 3 | 50 | 50 | 0% |
| 4 | 25 | blank | |
| 5 | 0 | 10 | CHECK |
| 6 | pending | 10 | CHECK |
| 7 | 100 | n/a | CHECK |
| 8 | 2026-10-01 | 2026-10-08 | CHECK |
最初の2行は通常動作の基準です。(120 - 100) / 100 = 0.20なので20%、(50 - 50) / 50 = 0なので0%です。残りの行は通常データというより、数式の失敗条件を確認するためのテストです。
AIチャットアシスタントには、A2からB2への変化率を計算し、エラーなら空白にする、といった形で依頼できます。
この数式は100から120、50から50では正しく動きます。しかしIFERRORは異なる問題をすべて同じ空白に隠します。分母が0、文字列入力、その他の数式エラーが同じ結果になるため、確認すべき問題を区別できません。さらに重要なのは、Excelの日付は内部的にシリアル番号として保存されることです。A2とB2が実際のExcel日付なら、減算や除算が実行され、明確なエラーではなく数値の変化率が返る場合があります。
つまり、計算に成功したことだけでは、入力値が意図したデータ型であることを証明できません。
ここで定義したルールに合わせるなら、もう少し明示的な数式にできます。
この数式は空白、数値以外の入力、分母が0の場合を分けて扱います。そのため2行目から7行目までは意図したルールどおりになります。C列の数値を20%のように表示したい場合はPercentage形式を設定します。
ただし8行目では重要な限界が分かります。Excelの日付は内部では数値なので、実際の日付セルにもISNUMBERはTRUEを返します。そのため、この防御的な数式でも日付を数値として計算できます。一般的な数式だけで、ある数値シリアルが意図した測定値なのか、誤って入った日付なのかを数値だけから確実に判断することはできません。
2つ目の確認として、合成ケースをrow,old_value,new_value列を持つformula_cases.csvとして保存します。2026-10-01と2026-10-08はそのまま残します。次の標準ライブラリだけを使うスクリプトは、意図したルールを独立して適用します。空白はblank、ISO形式の日付はCHECK、数値以外はCHECK、旧値が0ならCHECK、通常の数値なら変化率を計算します。
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でエラー表示が出るかどうかだけではなく、各行の結果を比較してください。
Pythonを使う利点は、同じ業務ルールを別の方法で独立して実装できることです。Excel数式をそのまま文字単位で再現するだけでは意味がありません。両方が同じ誤った前提を持っていれば、照合しても同じミスを繰り返します。
重要なのは、数式の検証が構文だけの問題ではなく、データ型と業務ルールの問題でもあることです。AIが作った数式は実装案として扱い、例外値テストで本当に必要な動作と一致しているか確認してください。
2026-09-21 · hand-checked example · Python 3.12
説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。