"""
月次売上集計スクリプト
- 入力: sales_2026.xlsx (売上明細シート)
- 出力: summary_2026.xlsx (月次集計シート + 書式設定)
"""
from openpyxl import load_workbook, Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from collections import defaultdict
from datetime import datetime
INPUT = "sales_2026.xlsx"
OUTPUT = "summary_2026.xlsx"
# --- 1. 明細を読み込み、月ごとに合計する -----------------------------
def aggregate_monthly(path):
wb = load_workbook(path, data_only=True)
ws = wb.active
monthly = defaultdict(lambda: {"amount": 0, "count": 0})
for row in ws.iter_rows(min_row=2, values_only=True):
date, code, client, qty, unit_price = row[:5]
if not date or not qty or not unit_price:
continue # 空行はスキップ
if isinstance(date, str):
date = datetime.strptime(date, "%Y-%m-%d")
key = date.strftime("%Y-%m")
monthly[key]["amount"] += qty * unit_price
monthly[key]["count"] += 1
return dict(sorted(monthly.items()))
# --- 2. 前月比を計算 --------------------------------------------
def attach_mom(monthly):
prev = None
result = []
for month, stat in monthly.items():
mom = None if prev is None else stat["amount"] / prev - 1
result.append({
"month": month,
"amount": stat["amount"],
"count": stat["count"],
"mom": mom,
})
prev = stat["amount"]
return result
# --- 3. Excelに整形して書き出し ---------------------------------
def write_summary(rows, path):
wb = Workbook()
ws = wb.active
ws.title = "月次集計"
ws.append(["月", "売上合計", "明細件数", "前月比"])
for r in rows:
ws.append([
r["month"],
r["amount"],
r["count"],
None if r["mom"] is None else round(r["mom"], 4),
])
# 書式設定
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill("solid", fgColor="7C3AED")
center = Alignment(horizontal="center")
thin = Side(style="thin", color="BFBFBF")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
for cell in ws[1]:
cell.font, cell.fill, cell.alignment = header_font, header_fill, center
for row in ws.iter_rows(min_row=2, max_col=4):
for cell in row:
cell.border = border
row[1].number_format = "#,##0" # 売上合計
row[3].number_format = "0.0%" # 前月比
for col, w in zip("ABCD", [12, 16, 12, 12]):
ws.column_dimensions[col].width = w
wb.save(path)
# --- 4. 実行エントリポイント ------------------------------------
if __name__ == "__main__":
monthly = aggregate_monthly(INPUT)
rows = attach_mom(monthly)
write_summary(rows, OUTPUT)
print(f"{len(rows)}か月分を {OUTPUT} に出力しました。")
Copilotへの質問例
Windows Copilotにこの題材を投げる場合、最初の依頼はこのくらい具体的に書きます。
「Excelの月次売上データを自動集計するPythonスクリプトを作成してください。
入力ファイル名は sales_2026.xlsx、シートには日付・商品コード・取引先・数量・単価の5列があります。
月ごとに売上合計と明細件数を計算し、前月比も付けて、新しいExcelファイル summary_2026.xlsx に書き出してください。
使用するライブラリは openpyxl のみ、ヘッダ行は紫(#7C3AED)で塗り、売上合計は3桁区切り、前月比はパーセント表記でお願いします。」