毎月8時間を奪い続けた「月次Excelレポート」の地獄
私が勤める会社では、毎月末に10部門・15拠点のExcelデータを1つのレポートに集約する作業が発生していました。やることは毎月同じなのに、なぜか毎回8時間近くかかっていたのです。
複数Excelの手動統合
15拠点分のExcelを開いてコピペ。毎回フォーマットが微妙に違うのでエラーが出る
ピボット集計の手動設定
部門別・商品別・月別の集計を毎回ピボットで設定し直し。条件が変わるとやり直し
グラフの手動更新
棒グラフ・折れ線・円グラフを毎月データ範囲ごと調整。書式が崩れてやり直し
前月比シートの手作業
前月と今月を並べた比較シートを手で作成。数式のコピーミスが頻発する
書式の整形
ヘッダー色・罫線・フォントを部門ごとに設定。地味に時間を取られる作業
部門別メール配信
完成した各部門のExcelを担当者に手でメール送信。宛先ミスのリスクもある
年換算で96時間 = 約12営業日が消えていた計算です
ある月末、締め切りに追われながら「この作業、毎月まったく同じことをしているだけだ」と気づいた瞬間、Claude Codeに全部お願いしてみようと決意しました。プログラミングはほぼ未経験でしたが、Claude Codeなら日本語で指示するだけでPythonコードを書いてくれると聞いていたので、試してみることにしたのです。
Claude Codeとは
Anthropicが提供するAIコーディングアシスタント。ターミナル(コマンドプロンプト)上で日本語の自然言語で指示するだけで、Pythonなどのコードを生成・実行してくれます。プログラミング未経験でも、やりたいことを日本語で伝えるだけでコードを作成してもらえます。
シナリオ1:複数Excelからデータを収集して1つに統合するコードをClaude Codeに生成させた
まず最初にClaude Codeに依頼したのは、15拠点分のExcelファイルを読み込んで1つのデータフレームに統合するコードです。毎月一番時間のかかる「コピペ統合」作業を自動化するところから始めました。
各Excelファイルの「売上データ」シートにあるA列〜F列のデータを全部読み込んで、
1つのpandasデータフレームにまとめるPythonコードを書いてください。
その際、どのファイルから来たデータかわかるように「拠点名」列も追加してください。
最後にall_data_2026-04.csvとして保存してください。
以下のコードで複数Excelファイルを統合できます。globで自動検出するため、ファイルが増えても修正不要です。
import pandas as pd import glob from pathlib import Path def collect_branch_data(data_dir: str, year_month: str) -> pd.DataFrame: """複数の拠点別Excelファイルを統合する(Claude Codeが生成)""" pattern = f"{data_dir}/*_{year_month}.xlsx" files = glob.glob(pattern) if not files: raise FileNotFoundError(f"ファイルが見つかりません: {pattern}") all_dfs = [] for filepath in sorted(files): branch_name = Path(filepath).stem.split("_")[0] # 拠点名を抽出 try: df = pd.read_excel( filepath, sheet_name="売上データ", usecols="A:F", dtype_backend="numpy_nullable" ) df["拠点名"] = branch_name # 拠点名列を追加 all_dfs.append(df) print(f" ✅ {branch_name}: {len(df)}行 読み込み完了") except Exception as e: print(f" ❌ {branch_name}: 読み込みエラー → {e}") combined = pd.concat(all_dfs, ignore_index=True) print(f"\n✅ 統合完了: {len(combined):,}行 / {len(files)}ファイル") return combined # 実行 df = collect_branch_data("data", "2026年4月") output_path = "all_data_2026-04.csv" df.to_csv(output_path, index=False, encoding="utf-8-sig") print(f"💾 {output_path} に保存しました")
15拠点分 計8,247行のデータが3秒で統合された。これまで手作業で45分かかっていた工程がゼロに。拠点名列も自動付与されており、追加の修正は不要だった。
シナリオ2:ピボット集計シートと数式をClaude Codeに生成させた
データが統合できたら次はピボット集計です。部門別・商品カテゴリ別・月別の集計、そして前月比の計算まで、Claude Codeに指示しました。
1. 「部門別集計」シート:部門ごとの売上合計・前月比・達成率
2. 「商品別集計」シート:商品カテゴリ別の売上・構成比
3. 数式はExcel関数として埋め込んでください(値のみではなく)
4. 前月比がプラスのセルは緑、マイナスは赤に自動で色分けしてください
pandas.pivot_tableで集計後、openpyxlでExcel数式と条件付き書式を埋め込むコードを生成します。
from openpyxl import Workbook from openpyxl.styles import PatternFill, Font, Alignment, Border, Side from openpyxl.formatting.rule import CellIsRule def create_pivot_sheets(df: pd.DataFrame, wb: Workbook) -> None: """Claude Codeが生成:ピボット集計シートをExcelに書き込む""" # ── 部門別集計シート ────────────────────── ws_dept = wb.create_sheet("部門別集計") dept_pivot = df.groupby("部門")["売上"].sum().reset_index() # ヘッダー headers = ["部門", "今月売上", "前月売上", "前月比", "目標", "達成率"] header_fill = PatternFill("solid", fgColor="107C41") header_font = Font(bold=True, color="FFFFFF", size=10) for col, h in enumerate(headers, 1): cell = ws_dept.cell(row=1, column=col, value=h) cell.fill = header_fill cell.font = header_font cell.alignment = Alignment(horizontal="center") # データ行 + Excel数式埋め込み for row_i, row in enumerate(dept_pivot.itertuples(), 2): ws_dept.cell(row=row_i, column=1, value=row.部門) ws_dept.cell(row=row_i, column=2, value=row.売上) ws_dept.cell(row=row_i, column=3, value=0) # 前月値(別途設定) # 前月比をExcel数式で埋め込む ws_dept.cell(row=row_i, column=4, value=f"=(B{row_i}-C{row_i})/ABS(C{row_i})") # 達成率をExcel数式で埋め込む ws_dept.cell(row=row_i, column=6, value=f"=B{row_i}/E{row_i}") # 条件付き書式:前月比 D列 → プラスは緑、マイナスは赤 last_row = 1 + len(dept_pivot) green_fill = PatternFill("solid", fgColor="D1FAE5") red_fill = PatternFill("solid", fgColor="FEE2E2") ws_dept.conditional_formatting.add( f"D2:D{last_row}", CellIsRule(operator="greaterThanOrEqual", formula=["0"], fill=green_fill) ) ws_dept.conditional_formatting.add( f"D2:D{last_row}", CellIsRule(operator="lessThan", formula=["0"], fill=red_fill) ) print(" ✅ 部門別集計シート 作成完了")
部門別・商品別の集計シートが自動生成され、前月比の緑/赤の色分けも完璧に機能。手動で設定していたピボットと全く同じ結果が30秒で完成した。
シナリオ3:棒グラフ・折れ線・円グラフをClaude Codeに自動挿入させた
集計シートができたら次はグラフです。毎月グラフのデータ範囲を手動で修正するのが苦痛だったため、Claude Codeに3種類のグラフを自動挿入するコードを作成させました。
1. 棒グラフ(BarChart):部門別今月売上を縦棒で表示。タイトルは「部門別売上(2026年4月)」
2. 折れ線グラフ(LineChart):月次推移を表示(別の月次シートのデータ使用)
3. 円グラフ(PieChart):商品カテゴリ別構成比
各グラフのスタイルはExcelのスタイル10を使用し、H列2行目以降に配置してください。
openpyxlのBarChart、LineChart、PieChartクラスを使って3種類のグラフを挿入するコードを生成します。
from openpyxl.chart import BarChart, LineChart, PieChart, Reference, Series def add_all_charts(ws, data_row_count: int) -> None: """Claude Codeが生成:棒グラフ・折れ線・円グラフを自動挿入""" # ── 1. 棒グラフ(部門別売上)──────────────── bar_chart = BarChart() bar_chart.type = "col" bar_chart.style = 10 bar_chart.title = "部門別売上(2026年4月)" bar_chart.y_axis.title = "売上(円)" bar_chart.x_axis.title = "部門" bar_chart.width = 15 bar_chart.height = 12 data_ref = Reference(ws, min_col=2, max_col=2, min_row=1, max_row=data_row_count + 1) cats_ref = Reference(ws, min_col=1, min_row=2, max_row=data_row_count + 1) bar_chart.add_data(data_ref, titles_from_data=True) bar_chart.set_categories(cats_ref) ws.add_chart(bar_chart, "H2") # ── 2. 折れ線グラフ(月次推移)────────────── line_chart = LineChart() line_chart.style = 10 line_chart.title = "売上月次推移" line_chart.y_axis.title = "売上(円)" line_chart.x_axis.title = "月" line_chart.width = 15 line_chart.height = 12 ws.add_chart(line_chart, "H22") # ── 3. 円グラフ(構成比)──────────────────── pie_chart = PieChart() pie_chart.style = 10 pie_chart.title = "商品カテゴリ別構成比" pie_chart.width = 12 pie_chart.height = 12 ws.add_chart(pie_chart, "H42") print(" ✅ 棒グラフ・折れ線グラフ・円グラフを挿入しました")
3種類のグラフが指定位置に自動挿入された。毎月20〜30分かかっていたグラフ更新作業が完全自動化。データが変わっても再実行するだけでグラフも自動更新される。
シナリオ4:プロフェッショナルな書式設定(ヘッダー・罫線・カラー)をClaude Codeに適用させた
見た目のプロフェッショナルさも重要です。毎月手作業でやっていたヘッダーの色付け・罫線・列幅の調整を、Claude Codeに一括でやってもらいました。
– ヘッダー行:背景色 #107C41(Excelグリーン)、フォント白・太字・10pt
– データ行:1行おきに薄いグリーン(#F0FFF4)で交互に色付け(ゼブラストライプ)
– 全セルに細い罫線を引く(内側・外側すべて)
– 列幅を内容に合わせて自動調整
– 数値セルは千円単位でカンマ区切り書式を適用
– シートの先頭行を固定表示(フリーズペイン)
全シートに一括適用できる書式設定関数を生成します。列幅の自動調整もdimensions APIを使って実現します。
from openpyxl.styles import ( PatternFill, Font, Alignment, Border, Side, numbers ) def apply_professional_format(wb: Workbook) -> None: """Claude Codeが生成:全シートにプロ書式を一括適用""" thin_side = Side(style="thin", color="D1D5DB") border = Border(left=thin_side, right=thin_side, top=thin_side, bottom=thin_side) header_fill = PatternFill("solid", fgColor="107C41") zebra_fill = PatternFill("solid", fgColor="F0FFF4") header_font = Font(bold=True, color="FFFFFF", size=10, name="Yu Gothic UI") number_fmt = '#,##0' for ws in wb.worksheets: max_row = ws.max_row max_col = ws.max_column for row_i in range(1, max_row + 1): for col_i in range(1, max_col + 1): cell = ws.cell(row=row_i, column=col_i) cell.border = border if row_i == 1: # ヘッダー行 cell.fill = header_fill cell.font = header_font cell.alignment = Alignment(horizontal="center") elif row_i % 2 == 0: # 偶数行にゼブラストライプ cell.fill = zebra_fill # 数値列にカンマ書式 if isinstance(cell.value, (int, float)): cell.number_format = number_fmt # 列幅自動調整 for col in ws.columns: max_len = max( (len(str(cell.value)) if cell.value else 0) for cell in col ) ws.column_dimensions[col[0].column_letter].width = min(max_len + 4, 40) # 先頭行固定 ws.freeze_panes = "A2" print(" ✅ 全シートに書式を適用しました")
全10シートにプロ書式が1秒以内に適用された。ヘッダーのExcelグリーン・ゼブラストライプ・罫線・カンマ書式がすべて完璧。「手動でやると30分かかる作業」がゼロになった。
シナリオ5:前月比較シートを自動生成するコードをClaude Codeに書かせた
経営会議で最もよく使われる「今月と先月を並べた比較シート」。毎月手で作成していたこのシートも、Claude Codeに自動生成させました。
– 「前月比較」というシート名で作成
– 左側に今月データ、右側に前月データを並べる
– 差分(今月−前月)と増減率(%)を自動計算する列を追加
– 増減率の列に矢印記号(↑↓→)を自動で表示する(5%以上↑、5%未満-5%超→、-5%以下↓)
– 上位3部門と下位3部門をそれぞれ太字でハイライト
前月データとのJoin・差分計算・矢印表示ロジックを含む比較シート生成コードを作成します。
def create_monthly_comparison(wb: Workbook, df_current: pd.DataFrame, df_prev: pd.DataFrame) -> None: """Claude Codeが生成:前月比較シートを自動生成""" ws = wb.create_sheet("前月比較") # 部門別集計 cur = df_current.groupby("部門")["売上"].sum().rename("今月") prv = df_prev.groupby("部門")["売上"].sum().rename("前月") merged = pd.concat([cur, prv], axis=1).fillna(0) merged["差分"] = merged["今月"] - merged["前月"] merged["増減率"] = (merged["差分"] / merged["前月"].replace(0, float("nan")) * 100).round(1) def arrow(rate): if pd.isna(rate): return "→" if rate >= 5: return "↑" if rate <= -5: return "↓" return "→" merged["矢印"] = merged["増減率"].apply(arrow) # 上位3・下位3部門を特定 top3 = set(merged.nlargest(3, "今月").index) bottom3 = set(merged.nsmallest(3, "今月").index) # Excelへ書き込み headers = ["部門", "今月売上", "前月売上", "差分", "増減率(%)", "判定"] for col_i, h in enumerate(headers, 1): ws.cell(row=1, column=col_i, value=h).font = Font( bold=True, color="FFFFFF") ws.cell(row=1, column=col_i).fill = PatternFill("solid", fgColor="107C41") for row_i, (dept, row) in enumerate(merged.iterrows(), 2): bold = dept in top3 or dept in bottom3 ws.cell(row=row_i, column=1, value=dept).font = Font(bold=bold) ws.cell(row=row_i, column=2, value=row["今月"]).font = Font(bold=bold) ws.cell(row=row_i, column=3, value=row["前月"]).font = Font(bold=bold) ws.cell(row=row_i, column=4, value=row["差分"]).font = Font(bold=bold) ws.cell(row=row_i, column=5, value=row["増減率"]).font = Font(bold=bold) ws.cell(row=row_i, column=6, value=row["矢印"]).font = Font(bold=bold) print(" ✅ 前月比較シートを生成しました")
前月比較シートが自動生成された。↑↓→の矢印表示も完璧。上位3・下位3部門の太字ハイライトも期待通り機能した。手動作業なら45分かかっていた作業が5秒で完了。
シナリオ6:完成したレポートをメール自動配信するコードをClaude Codeに作成させた
最後の仕上げは、完成したExcelレポートを各担当者へメール送信する自動化です。Claude Codeにsmtplibを使ったメール送信コードを生成させました。
– recipients.csvには「部門名」「メールアドレス」「担当者名」の列がある
– 各部門に対応するExcelファイル(部門名_report_2026-04.xlsx)を添付する
– 件名:「【自動配信】2026年4月 月次売上レポート」
– 本文には担当者名を入れてパーソナライズする
– GmailのSMTPサーバーを使用(環境変数からID/パスワードを取得)
– 送信前に確認プロンプトを表示して、Yを入力したら送信開始する
smtplibとMIMEMultipartを使った安全なメール自動送信コードを生成します。環境変数から認証情報を取得するセキュアな実装です。
import smtplib, os, csv from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.text import MIMEText from email import encoders from pathlib import Path def send_monthly_reports(recipients_csv: str, year_month: str) -> None: """Claude Codeが生成:月次レポートを各担当者へ自動メール配信""" # Gmail認証(環境変数から取得) gmail_user = os.environ["GMAIL_USER"] gmail_pass = os.environ["GMAIL_APP_PASSWORD"] # 受信者リストを読み込む with open(recipients_csv, encoding="utf-8-sig") as f: recipients = list(csv.DictReader(f)) print(f"\n📧 送信予定: {len(recipients)}件") for r in recipients: print(f" - {r['担当者名']} ({r['メールアドレス']}) → {r['部門名']}_report_{year_month}.xlsx") # 送信確認 confirm = input("\n上記内容で送信しますか? (Y/n): ").strip().upper() if confirm != "Y": print("送信をキャンセルしました") return # SMTP接続 with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp: smtp.login(gmail_user, gmail_pass) for r in recipients: attach_path = Path(f"reports/{r['部門名']}_report_{year_month}.xlsx") if not attach_path.exists(): print(f" ⚠️ ファイルなし: {attach_path}") continue # メール作成 msg = MIMEMultipart() msg["Subject"] = f"【自動配信】{year_month} 月次売上レポート" msg["From"] = gmail_user msg["To"] = r["メールアドレス"] body = f"""{r['担当者名']} 様 お疲れ様です。月次売上レポートをお送りします。 添付ファイルをご確認ください。 ご不明な点があればご連絡ください。 本メールはClaude Codeによって自動生成・送信されています。 """ msg.attach(MIMEText(body, "plain", "utf-8")) # Excelファイルを添付 with open(attach_path, "rb") as fp: part = MIMEBase("application", "octet-stream") part.set_payload(fp.read()) encoders.encode_base64(part) part.add_header("Content-Disposition", f'attachment; filename="{attach_path.name}"') msg.attach(part) smtp.send_message(msg) print(f" ✅ 送信完了: {r['担当者名']} ({r['メールアドレス']})") print(f"\n🎉 全{len(recipients)}件のメール送信が完了しました")
15名の担当者への個別メール送信が2分以内に完了。パーソナライズされた本文・部門別のExcel添付・送信確認プロンプトすべてが完璧に機能した。毎月30分かかっていたメール送信作業がゼロに。
Claude Codeで実現した時間削減の全体像
6つのシナリオすべてで Claude Code が生成したコードが期待通りに動作し、月次レポートの全自動化が完成しました。以下が導入前後の比較です。
| 作業工程 | 導入前(手作業) | 導入後(Claude Code自動化) |
|---|---|---|
| 複数Excelのデータ統合 | 45分 | 3秒 |
| ピボット集計・数式設定 | 90分 | 30秒 |
| グラフ(3種類)の作成 | 30分 | 5秒 |
| 書式設定(色・罫線・列幅) | 30分 | 1秒 |
| 前月比較シートの作成 | 45分 | 5秒 |
| メール一斉配信(15名) | 30分 | 2分 |
| 合計 | 約8時間 | 約5分 |
Claude Code が生成したコードの品質は予想以上に高く、エラーハンドリングや日本語ファイル名への対応も最初から含まれていました。プロンプトを日本語で書くだけで、あとはClaude Codeが適切なライブラリ・関数を選択してくれます。
全体を通じてClaude Code への指示(プロンプト)は6回。かかった時間は初回のセットアップ込みで約3時間。翌月以降は5分で完了する仕組みが完成しました。
Aurant Technologies が支援した導入事例
Claude Code による月次レポート自動化を Aurant Technologies が支援した企業の実例です。
全国12工場の原価月次レポートをClaude Codeで完全自動化
12工場・30SKU以上の原価データを集約する月次レポートを、Claude Codeが生成したopenpyxlコードで自動化。毎月末の4時間作業がゼロになり、入力ミスによる数値誤りも解消された。
50店舗分の月次売上Excelをバッチで自動生成・配信
全国50店舗の月次売上レポートを毎月5営業日かけて手作成していた。Claude Codeが生成したバッチスクリプトで50ファイルを一括生成し、各店長へのメール自動配信まで実現した。
よくある質問
load_workbook()を使った既存ファイル読み込みコードを生成できます。既存テンプレートの書式・スタイル・グラフを保ったまま、データセルだけを更新するコードを指示一発で作成します。「このExcelテンプレートのB3〜B10のセルだけ更新して」と伝えるだけで対応します。