Claude Code x openpyxl でKPIダッシュボードを毎日自動更新する完全ガイド
Claude Code×openpyxlでExcel KPIダッシュボードを毎朝自動更新する仕組みを解説。売上・利益・顧客数などのKPIを自動集計し目標達成率で色分け表示。未達アラートはSlack通知。コード付き。
目次 クリックで開く
|
blog

▲ Claude Codeが実際に生成した実行結果
毎朝30分のKPI集計作業をゼロにした
- Excel KPIダッシュボード自動更新の完全自動化を実現するPythonスクリプトを5ステップで解説
- 「毎朝の手動KPI集計・転記・グラフ更新」という課題を根本から解消する
- Claude Codeへの自然言語指示だけでスクリプトを生成できる
- 月・週・日単位の定期実行で完全無人化を実現する方法も紹介
以下のステップを順番に実行することで、今日から業務自動化を始められます。コピーして使えるコードと、Claude Codeへの指示文をセットで解説します。
営業企画の近藤です。毎朝8時30分、出社してすぐにKPIダッシュボードを手動更新するのが日課でした。3つのCSVを開いてコピーし、グラフを更新して……その30分が惜しくなりClaude Codeに相談したところ、データ更新からSlack通知まで完全自動化できました。
✅ 複数CSVを自動統合してKPI集計
✅ 目標vs実績グラフの自動更新
✅ 達成率で色分け(緑/黄/赤)
✅ 未達KPIをSlackに自動通知
✅ 週次・月次サマリーの自動生成
STEP 1:複数CSVを統合してKPIを自動集計する
まず複数の営業データCSVを読み込み、KPIを計算するスクリプトを作成します。
以下のKPIを自動計算しExcelに書き込んでください。
– 月次売上・目標達成率
– リード獲得数・商談化率・受注率
– 架電数・アポ獲得率
import pandas as pd, openpyxl
from datetime import datetime
sales = pd.read_csv("sales_daily.csv", parse_dates=["date"])
leads = pd.read_csv("leads.csv", parse_dates=["created_at"])
calls = pd.read_csv("calls.csv", parse_dates=["call_date"])
today = datetime.now().date()
ms = today.replace(day=1)
monthly_sales = sales[sales["date"].dt.date >= ms]["amount"].sum()
target = 5_000_000
achieve_rate = monthly_sales / target * 100
monthly_leads = len(leads[leads["created_at"].dt.date >= ms])
converted = len(leads[(leads["status"]=="商談化") & (leads["created_at"].dt.date >= ms)])
conv_rate = converted / monthly_leads * 100 if monthly_leads else 0
monthly_calls = len(calls[calls["call_date"].dt.date >= ms])
apo = len(calls[(calls["result"]=="アポ獲得") & (calls["call_date"].dt.date >= ms)])
apo_rate = apo / monthly_calls * 100 if monthly_calls else 0
wb = openpyxl.load_workbook("kpi_template.xlsx")
ws = wb["KPI"]
ws["B2"] = monthly_sales
ws["B3"] = achieve_rate / 100
ws["B4"] = monthly_leads
ws["B5"] = conv_rate / 100
ws["B6"] = monthly_calls
ws["B7"] = apo_rate / 100
ws["A1"] = f"更新: {datetime.now():%Y/%m/%d %H:%M}"
wb.save(f"kpi_{today:%Y%m%d}.xlsx")
print(f"KPI集計完了 売上達成率:{achieve_rate:.1f}%")
3CSVが統合され月次KPIが自動計算されてExcelに書き込まれました。達成率がパーセント表示で正確に出力されています。

STEP 2:達成率で色分けとグラフを自動生成する
KPI数値に加え、達成状況が一目でわかる条件付き書式とグラフを自動生成します。
– 達成率80%未満は赤、80-99%は黄、100%以上は緑
– 日別売上折れ線グラフ+目標ライン
– 部門別棒グラフ
from openpyxl.formatting.rule import CellIsRule
from openpyxl.styles import PatternFill, Font
from openpyxl.chart import LineChart, Reference
red_f = PatternFill("solid", fgColor="FFCDD2")
yellow_f = PatternFill("solid", fgColor="FFF9C4")
green_f = PatternFill("solid", fgColor="C8E6C9")
ws.conditional_formatting.add("C2:C20",
CellIsRule(operator="lessThan", formula=["0.8"], fill=red_f))
ws.conditional_formatting.add("C2:C20",
CellIsRule(operator="between", formula=["0.8","0.999"], fill=yellow_f))
ws.conditional_formatting.add("C2:C20",
CellIsRule(operator="greaterThanOrEqual", formula=["1"], fill=green_f))
chart = LineChart()
chart.title = "日別売上推移"
chart.y_axis.title = "売上(円)"
data = Reference(ws_daily, min_col=2, min_row=1, max_row=ws_daily.max_row)
target = Reference(ws_daily, min_col=3, min_row=1, max_row=ws_daily.max_row)
dates = Reference(ws_daily, min_col=1, min_row=2, max_row=ws_daily.max_row)
chart.add_data(data, titles_from_data=True)
chart.add_data(target, titles_from_data=True)
chart.set_categories(dates)
chart.series[1].graphicalProperties.line.dashDot = "dash"
chart.width = 20; chart.height = 12
ws.add_chart(chart, "E2")
wb.save(f"kpi_{today:%Y%m%d}.xlsx")
達成率80%未満が赤、80-99%が黄、100%以上が緑に自動着色。折れ線グラフと目標ラインが自動生成されました。
STEP 3:未達KPIをSlackに自動通知する
目標未達のKPIを検知して、Slackに自動アラートを送信します。
絵文字と具体的な数値を含めてください。
import requests
WEBHOOK = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
def kpi_alert(name, current, target, rate):
if rate >= 1.0: return
emoji = "🔴" if rate < 0.8 else "🟡"
requests.post(WEBHOOK, json={"blocks":[
{"type":"header","text":{"type":"plain_text","text":f"{emoji} KPIアラート"}},
{"type":"section","fields":[
{"type":"mrkdwn","text":f"*KPI:* {name}"},
{"type":"mrkdwn","text":f"*達成率:* {rate*100:.1f}%"},
{"type":"mrkdwn","text":f"*実績:* {current:,.0f}"},
{"type":"mrkdwn","text":f"*目標:* {target:,.0f}"},
]}
]})
kpi_alert("月次売上", monthly_sales, target, achieve_rate/100)
kpi_alert("商談化率", conv_rate, 30, conv_rate/30)
kpi_alert("アポ率", apo_rate, 20, apo_rate/20)
print("Slackアラート送信完了")
未達KPIが自動検出され、赤・黄の絵文字付きでSlackに通知が届きました。具体的な達成率と実績値が表示されています。
STEP 4:週次・月次サマリーレポートを自動生成する
経営層向けの週次・月次KPIサマリーを自動集計します。
週次・月次サマリーExcelを自動生成してください。
def create_summary(period="weekly"):
wb = openpyxl.Workbook()
ws = wb.active
ws.title = f"{period} KPI"
headers = ["KPI","今期","前期","変化率","傾向","達成率"]
for col, h in enumerate(headers, 1):
c = ws.cell(row=1, column=col, value=h)
c.font = Font(bold=True, color="FFFFFF")
c.fill = PatternFill("solid", fgColor="107C41")
kpis = [("売上", monthly_sales, prev_sales, target)]
for row_i, (kpi, curr, prev, tgt) in enumerate(kpis, 2):
chg = (curr - prev) / prev * 100 if prev else 0
trend = "↑" if chg > 0 else "↓" if chg < 0 else "→"
ws.cell(row=row_i, column=1, value=kpi)
ws.cell(row=row_i, column=2, value=curr)
ws.cell(row=row_i, column=3, value=prev)
ws.cell(row=row_i, column=4, value=f"{chg:+.1f}%")
tc = ws.cell(row=row_i, column=5, value=trend)
tc.font = Font(color="107C41" if chg>0 else "DC2626", bold=True, size=14)
ws.cell(row=row_i, column=6, value=f"{curr/tgt*100:.1f}%")
fn = f"kpi_summary_{period}_{today:%Y%m%d}.xlsx"
wb.save(fn)
print(f"サマリー生成: {fn}")
create_summary("weekly")
create_summary("monthly")
週次・月次KPIサマリーが自動生成されました。前期比の変化率と↑↓矢印付きで経営会議にそのまま提出できます。
STEP 5:タスクスケジューラーで毎朝自動実行
毎朝9時に自動でKPI更新が走るようにスケジューラーを設定します。
エラー時は自動リトライするコードを追加してください。
import subprocess, sys, time, logging
from datetime import datetime
logging.basicConfig(filename="kpi_update.log", level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s")
def run_retry(script, max_try=3, wait=60):
for i in range(max_try):
try:
r = subprocess.run([sys.executable, script],
capture_output=True, text=True, timeout=300)
if r.returncode == 0:
logging.info(f"成功: {r.stdout.strip()}")
return True
logging.error(f"試行{i+1}失敗: {r.stderr}")
except subprocess.TimeoutExpired:
logging.error(f"試行{i+1}タイムアウト")
if i < max_try-1: time.sleep(wait)
requests.post(WEBHOOK, json={"text": "KPI自動更新が失敗しました"})
return False
run_retry("kpi_dashboard.py")
# タスクスケジューラー登録(管理者権限で):
# schtasks /create /tn "KPI自動更新" /tr "python C:\scripts\kpi.py" /sc DAILY /st 09:00 /f
タスクスケジューラーへの登録コマンドが生成されました。毎朝9時に自動実行され、エラー時は3回リトライ後にSlack通知が届きます。
このシステムが解決する課題
KPI指標をリアルタイムで可視化するダッシュボードを構築。この自動化が特に効果的な場面と、解決できる課題を整理します。
- KPIを毎月手動でExcelに入力してグラフを更新するのに時間がかかっている
- データソースが複数あり、KPIの集計にミスが発生している
- 経営層・担当者・現場で見たい粒度が異なるが、別々に作るのが大変
- リアルタイム性がなく、数日前のデータを見て判断しなければならない
実務での活用シナリオ
導入前後の効果比較
KPIの集計・入力・グラフ更新を担当者が手動で実施。月次KPIの確定に3〜4日かかり、その間に経営判断が遅れるケースもあった。集計ミスによる数値の修正も頻発していた。
PythonがデータソースからKPIを自動集計し、openpyxlでExcelダッシュボードを自動更新。条件付き書式で目標達成・未達成を色分け表示。毎朝8時に自動実行し、出社時には最新KPIが確認できる。
導入のポイントと注意事項
- KPIの定義・計算式・データソースは別ファイルで文書化し、変更があった場合にすぐに把握できるようにする
- スパークライン(小さなグラフ)をKPI一覧表に追加することで、トレンドを一目で把握できるダッシュボードになる
- 前月比・前年比のカラー表示(増加→緑、減少→赤)は経営層に好まれるので、条件付き書式で必ず実装する
- KPIのアラート機能(目標比70%以下になったらSlack通知)と組み合わせることで、見逃しゼロの管理体制が完成する
よくある質問(FAQ)
関連記事
Claude Codeの導入を、プロに任せてみませんか?
Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。