Excelの定型レポートを自動化する手順|Claude CodeとPythonで毎週の集計表を作る
毎週・毎月の定型レポートを手作業で作っている人向けに、Excelの定型レポートをPythonで自動化する手順を解説します。Claude Codeに構造を調べてもらい、集計・書式・保存・検証まで段階ごとの指示文と小さなコード例で紹介します。
目次
この記事でわかること
- 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から始めてみてください。
よくある質問
Pythonを書いたことがなくても作れますか?
コードはClaude Codeに書いてもらえますが、何を集計して、どの形で出すかを決めるのは人の仕事です。仕様を言葉で説明できて、生成されたファイルの数値を元のデータと照らし合わせられれば始められます。Pythonの基本を学ぶ方法は「Pythonを学ぶ方法」の記事で紹介しています。
VBAマクロとPythonのどちらで作るべきですか?
Excelを開いた状態でボタン一つで動かしたいならVBAマクロ、元データを読み込んで新しいファイルを毎回作る処理ならPythonが向いています。この記事の例のように、集計表を別のファイルとして作り直す定型レポートはPythonで組みやすい作業です。
元のExcelファイルをそのまま更新してもよいですか?
おすすめしません。openpyxlは保存先に同じ名前のファイルがあると警告なしで上書きし、既存のファイルを開いて同じ名前で保存すると図形が失われることが公式ドキュメントに書かれています。元のファイルは読むだけにして、新しい名前のファイルへ出力してください。
グラフも自動で作れますか?
openpyxlには、セル範囲を指定してグラフを作る機能があります。ただし、まずは表の数値が正しく出ることを確かめてから、グラフは後から足すのがおすすめです。グラフを足すときも、参照しているセル範囲が合計の行を含んでいないかを確かめてください。
社内の売上データをClaude Codeに読ませても大丈夫ですか?
まず勤務先のルールを確認してください。仕様づくりやコードの作成は、列名と数行の架空のサンプルデータだけで進められます。本番のデータでの実行は、ルールで許された環境で行ってください。