この記事でわかること

  • Excelの定型レポートを自動化するときに、Claude CodeとPythonがそれぞれ受け持つこと
  • 既存のExcelを調べるところから、検証まで進める5つのステップと、段階ごとの指示文
  • 読み込み・集計・書き込み・書式・保存の小さなコード例
  • 生成したExcelを「作れた」で終わらせない検証の考え方

全体像はExcelをAIで自動化する方法で紹介しました。この記事はその実践編です。

定型レポートの自動化で、Claude CodeとPythonが受け持つこと

定型レポートは、貼り付け・集計・書式・保存の繰り返しです。これをPythonに置き換えると、次回からは実行するだけで同じ形のファイルが作れます。役割は次のように分けます。

担当 受け持つこと
人 どの数値をどの形で出すかを決める・結果を確かめる
Claude Code 既存のExcelの構造を調べる・仕様をまとめる・コードを書く・検証を手伝う
Python 毎回同じ手順で集計し、Excelファイルを作る

Claude Codeは、ファイルを読み、コードを書き、コマンドを実行できるAIのコーディングツールです。ExcelのファイルをPythonで操作するライブラリには、xlsx形式を読み書きできるopenpyxlを使います。

例にする業務:毎週の店舗別売上レポート

例として、架空の売上データ(CSV)から、店舗別の件数・数量・売上金額・構成比をまとめた表を毎週作る業務を自動化します。

  • 元データ:日付・店舗・商品区分・数量・売上金額の5列
  • 出力:「店舗別」シートに、店舗ごとの行と合計の行
  • 書式:見出しの太字と塗りつぶし、金額の桁区切り、構成比のパーセント表示、列幅、見出し行の固定

手順を試すときも、列名と数行の架空のサンプルデータで十分です。

Claude Codeと進める5つのステップ

1つの指示で「調べて、作って、直して」まで頼むと、途中で人が確かめる機会がなくなります。段階を分けて、それぞれの結果を読んでから次へ進みます。

STEP 1 既存のExcelの構造を調べてもらう

今のレポートの構造を調べてもらいます。この段階では何も作らせません。

report_sample.xlsx の構造を調べてください。まだファイルの作成や変更はしないでください。
調べること: シート名、見出しの行、列ごとの値の種類、数値形式、列幅、合計の行の位置。
調べ方(使うコードやコマンド)を先に見せて、私の確認を待ってください。

STEP 2 再現する仕様を書き出してもらう

入力と出力を文章にまとめてもらい、人が数値の定義(何を合計するか、構成比の分母は何か)を確定させます。

調べた結果から、自動化の仕様を箇条書きにしてください。コードはまだ書かないでください。
入力の列、集計のしかた、出力するシートと列の順番、書式、保存するファイル名を含めてください。
元のファイルは上書きせず、新しいファイルに出力する前提にしてください。

STEP 3 Pythonのコードを作ってもらう

仕様に合意してから、コードを書いてもらいます。

確定した仕様で、sales.csv から weekly_report.xlsx を作るPythonのコードを作成してください。
ライブラリは csv と openpyxl だけにしてください。
実行する前に、作るファイルとその内容を報告して、私の確認を待ってください。

STEP 4 生成結果を機械的に確かめる

ファイルが作れたことと、中身が正しいことは別です。検証用のコードも作ってもらいます(中身は後の章で説明します)。

weekly_report.xlsx を検証するコードを作成してください。ファイルは変更しないでください。
シート名、見出し、行数と列数、合計の値、数値形式を、sales.csv から計算した値と比べてください。
結果は、一致した項目と一致しなかった項目に分けて報告してください。

STEP 5 ずれを直して手順を固める

一致しなかった項目を直し、検証を通るまで繰り返します。一度で完成させるより、出力を確かめて直すことを重ねる方が確実です。帳票の自動化は、既存のExcelのフォーマットを確認しながら方向を決め、意図した通りの出力になっているかを確かめて直す、という繰り返しで形になります。

コードの中身:読み込み・集計・書き込み・書式

以下は、記事の作成時にサンプルデータで実行して確かめたコードです。

元データは、Python標準のcsvモジュールで1行ずつ辞書として読み、店舗ごとに足し合わせます。ファイルを開くときは文字コードを指定し、newline="" を付けます。

import csv
from collections import defaultdict

totals = defaultdict(lambda: {"件数": 0, "数量": 0, "売上": 0})
with open("sales.csv", encoding="utf-8", newline="") as f:
    for row in csv.DictReader(f):
        t = totals[row["店舗"]]
        t["件数"] += 1
        t["数量"] += int(row["数量"])
        t["売上"] += int(row["売上金額"])

集計した値を、openpyxlで新しいブックに書き込み、書式を付けて保存します。

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill

wb = Workbook()
ws = wb.active
ws.title = "店舗別"
ws.append(["店舗", "件数", "数量", "売上金額", "構成比"])
grand = sum(t["売上"] for t in totals.values())
for shop in sorted(totals):
    t = totals[shop]
    ws.append([shop, t["件数"], t["数量"], t["売上"], t["売上"] / grand])
ws.append(["合計", sum(t["件数"] for t in totals.values()),
           sum(t["数量"] for t in totals.values()), grand, 1])
for cell in ws[1]:
    cell.font = Font(bold=True)
    cell.fill = PatternFill("solid", fgColor="DDEBF7")
for row in ws.iter_rows(min_row=2):
    row[3].number_format = "#,##0"
    row[4].number_format = "0.0%"
ws.column_dimensions["A"].width = 12
ws.freeze_panes = "A2"
wb.save("weekly_report.xlsx")

書式はセルごとに設定します。number_format は表示の形式だけを変え、セルの値そのものは変えません。

生成したExcelを検証する

目で見る確認を、機械的な確認に置き換えます。最低限、シート名・見出し・行数と列数・合計の値(元データから別に計算した値と比べる)・数値形式・書式を確かめます。

import csv
from openpyxl import load_workbook

with open("sales.csv", encoding="utf-8", newline="") as f:
    rows = list(csv.DictReader(f))
expected = sum(int(r["売上金額"]) for r in rows)
shops = {r["店舗"] for r in rows}

ws = load_workbook("weekly_report.xlsx")["店舗別"]
assert [c.value for c in ws[1]] == ["店舗", "件数", "数量", "売上金額", "構成比"]
assert ws.max_row == 1 + len(shops) + 1 and ws.max_column == 5
assert ws.cell(row=ws.max_row, column=4).value == expected
assert ws["D2"].number_format == "#,##0"
assert ws["A1"].font.bold
print("OK")
python make_report.py
python check_report.py

記事のサンプルでは、5行5列の表ができ、合計の売上金額68,400円が元データの合計と一致して、検証がすべて通りました。数値の確認を人の目だけに頼らないことは、AIに作業を任せるときの基本です(確認の考え方はAIの出力をどう確認するかで扱っています)。

作り直したファイルと前回のファイルの違いを、キー列で照合して確かめる方法は、2つのExcelファイルを比較する方法で紹介しています。

つまずきやすい点と判断のポイント

  • 元のファイルを上書きしない:openpyxlの保存は、同じ名前のファイルがあると警告なしで上書きします。既存のファイルを開いて同じ名前で保存すると、図形が失われることも公式ドキュメントに書かれています。元のファイルは読むだけにします。
  • 数式の結果はPythonから読めない:openpyxlで書いた数式の計算結果は、Excelで開いて保存するまでファイルに入りません。data_only=True で読んでも値が空になるため、検証する値はPythonで計算して書き込みます。
  • グラフは表が正しくなってから:openpyxlはセル範囲を参照してグラフを作れますが、先に表の数値を検証で固めます。グラフを足すときは、参照範囲に合計の行が入っていないかを確かめます。棒グラフと折れ線グラフを足して、参照範囲をコードで確かめる手順は、Excelのグラフを自動作成する手順で紹介しています。
  • 自動化しない方がよい帳票もある:毎回レイアウトが変わる、判断や手入力が多い帳票は、自動化の手間に見合いません。自作するか外注するかの判断はExcel自動化は自作と外注どちらにすべきかを参考にしてください。

扱うデータのルール(社外のAIに渡してよいデータかどうか)は、親記事の「AIに渡してよいデータ・渡してはいけないデータ」で確認してください。Claude Codeの始め方はClaude Codeの始め方と使い方、Pythonの学び方はPythonを学ぶ方法にまとめています。

まとめ

  • 定型レポートの自動化は、人が仕様を決めて結果を確かめ、Claude Codeが調べて書き、Pythonが毎回同じ手順で作る分担で進める
  • 指示は、調査 → 仕様 → コード → 検証に分け、段階ごとに結果を読む
  • 元のファイルは上書きせず、新しいファイルに出力する
  • 「ファイルが作れた」ではなく、合計・行数・書式を元データと照らし合わせて確かめる

まずは毎回同じ形で作っている表を1つ選び、STEP 1から始めてみてください。