「月末のExcel→PDF→メール配布をClaude Codeに頼んだら全部やってくれた」

月末のExcel→PDF変換→メール配布を毎回手動でやっていませんか?Claude Codeにプロンプトを入力するだけで、win32com+smtplibの完全スクリプトが生成されます。実際のプロンプト例と生成コードを全公開。

この記事をシェア:
目次 クリックで開く

Claude Code × Excel PDF自動化 体験記 2026年版

プログラミング経験ゼロの経理担当が、Claude Codeとのチャットだけで請求書PDF一括配布スクリプトを完成させるまでの全記録。実際に入力したプロンプトとClaude Codeが生成したコードを完全公開します。

2026年4月25日
読了約20分
Claude Code生成コード完全掲載
Claude CodeがExcelPDF変換スクリプトを生成したデモ

Claude Codeが生成したExcel→PDF一括変換+自動メール配布スクリプトの実行結果

1. きっかけ:月末に毎回2日かかっていた作業

私はIT企業の経理を担当しています。毎月末になると、200件近い請求書Excelファイルを一枚ずつ開いて「名前を付けて保存→PDF→ファイル名変更→メール添付→送信確認」という作業を繰り返していました。最短でも2日間、残業込みで3日かかることもありました。

毎月末の手動作業コスト(実際の計測値)
請求書200件 × 平均5分/件 = 1,000分(約17時間)
時給換算3,500円 × 17時間 = 月59,500円の人件費ロス
年間では 71万円以上。しかも添付ファイル間違いが月1〜2件発生していました。

「Pythonで自動化できる」と聞いたことはありましたが、コードを書いたことは一度もありません。そこで試したのがClaude Codeでした。Claude Codeはターミナル(黒い画面)に直接話しかけると、Pythonコードを書いてくれる開発AIです。

結論から言うと、Claude Codeとのやり取り4回で、Excel→PDF変換からメール自動送信まで動くスクリプトが完成しました。プログラミングの知識は一切必要ありませんでした。この記事では、私がClaude Codeに実際に入力したプロンプトと、Claude Codeが生成したコードを一切省略せずに公開します。

この記事で分かること:
Claude Codeへの具体的な指示の出し方(プロンプト例5個掲載)/
Claude Codeが生成したExcel→PDF変換コード/
Claude Codeが生成した自動メール配布コード/
Claude Codeが生成したエンドツーエンドの請求書自動化システム

2. まずClaude Codeに「何ができるか」を聞いてみた

私はまず、Claude Codeのチャット画面を開いて、自分の状況をそのまま説明しました。技術用語を使う必要はありません。Claude Codeは自然な日本語で理解してくれます。

プロンプト例 1

私がClaude Codeに入力したプロンプト毎月200件のExcelファイルを手動でPDFに変換してメールで送っています。
これをPythonで自動化したいのですが、どんなライブラリを使えばいいですか?
私はプログラミング初心者です。Windowsを使っています。
Claude Codeの回答(要約):
Windowsであれば pywin32(win32com)が最も確実です。ExcelアプリケーションをPythonから直接操作して高品質なPDFを生成できます。メール送信は標準ライブラリの smtplib で対応できます。まず pip install pywin32 を実行してください。その後、どんなコードが必要か教えていただければ書きます。

Claude Codeは必要なライブラリと理由を教えてくれました。次に具体的なコード生成を依頼しました。

プロンプト例 2

私がClaude Codeに入力したプロンプトwin32comを使って、指定フォルダ内の全Excelファイル(.xlsx)を
PDFに変換するPythonコードを書いてください。
条件:
– PDFのファイル名は「元のファイル名_YYYYMMDD.pdf」にする
– A4縦向きに統一する
– 変換結果をCSVログに記録する
– エラーが出ても処理を止めずに続ける

Claude Codeはこのプロンプトに対して、即座に完全なコードを生成しました。以下がClaude Codeが生成したコードです。

Claude Codeが生成したコード(batch_excel_to_pdf.py):
batch_excel_to_pdf.py(Claude Codeが生成)
import win32com.client
import csv
import time
from pathlib import Path
from datetime import datetime

def batch_excel_to_pdf(
    input_folder: str,
    output_folder: str = None,
    log_file: str = "convert_log.csv"
):
    """
    指定フォルダ内の全Excelファイルを一括PDF変換する。
    Claude Codeが生成したコードです。
    Args:
        input_folder: 変換元フォルダのパス
        output_folder: PDF保存先(省略すると input_folder/pdf_output)
        log_file: 変換ログのCSVファイル名
    """
    input_path  = Path(input_folder)
    output_path = Path(output_folder) if output_folder else input_path / "pdf_output"
    output_path.mkdir(parents=True, exist_ok=True)

    # .xlsxを再帰的に検索(サブフォルダも対象)
    excel_files = list(input_path.glob("**/*.xlsx"))
    print(f"対象ファイル数: {len(excel_files)} 件")

    excel_app = win32com.client.Dispatch("Excel.Application")
    excel_app.Visible       = False
    excel_app.DisplayAlerts = False

    log_rows     = []
    success_count = 0
    error_count   = 0
    today = datetime.now().strftime("%Y%m%d")

    try:
        for i, xlsx_path in enumerate(excel_files, 1):
            start = time.time()
            print(f"[{i}/{len(excel_files)}] 変換中: {xlsx_path.name}")

            # PDF出力名: 元ファイル名_YYYYMMDD.pdf
            pdf_name = f"{xlsx_path.stem}_{today}.pdf"
            pdf_path = output_path / pdf_name

            try:
                wb = excel_app.Workbooks.Open(str(xlsx_path.resolve()))

                # A4縦向きに統一(全シート)
                for ws in wb.Worksheets:
                    ws.PageSetup.Zoom           = False
                    ws.PageSetup.FitToPagesWide = 1
                    ws.PageSetup.FitToPagesTall = False
                    ws.PageSetup.PaperSize      = 9   # A4
                    ws.PageSetup.Orientation    = 1   # 縦向き

                # PDF変換(ExportAsFixedFormat)
                wb.ExportAsFixedFormat(
                    Type=0,              # xlTypePDF
                    Filename=str(pdf_path),
                    Quality=0,           # xlQualityStandard
                    IncludeDocProperties=True,
                    IgnorePrintAreas=False,
                    OpenAfterPublish=False
                )
                wb.Close(SaveChanges=False)

                elapsed = round(time.time() - start, 2)
                log_rows.append([xlsx_path.name, pdf_name, "SUCCESS", elapsed])
                success_count += 1
                print(f"  完了 ({elapsed}秒)")

            except Exception as e:
                error_count += 1
                log_rows.append([xlsx_path.name, "", f"ERROR: {e}", 0])
                print(f"  エラー(スキップ): {e}")

    finally:
        excel_app.Quit()

    # ログCSV出力
    with open(log_file, "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.writer(f)
        writer.writerow(["元ファイル", "PDFファイル", "結果", "処理時間(秒)"])
        writer.writerows(log_rows)

    print(f"\n===== 変換完了 =====")
    print(f"成功: {success_count} 件  /  失敗: {error_count} 件")
    print(f"PDF保存先: {output_path}")
    print(f"ログ: {log_file}")

# 実行(パスをあなたの環境に合わせて変更してください)
if __name__ == "__main__":
    batch_excel_to_pdf(
        input_folder=r"C:\月次レポート\2026年4月",       # ← ここを変更
        output_folder=r"C:\月次レポート\PDF\2026年4月"  # ← ここを変更
    )

Claude Codeは変更が必要な箇所をコメント(# ← ここを変更)で明示してくれました。パスを自分の環境に書き換えてすぐ実行できます。

実際に実行してみた結果のターミナル出力です。

対象ファイル数: 198 件
[1/198] 変換中: invoice_A社_202604.xlsx
完了 (4.12秒)
[2/198] 変換中: invoice_B商事_202604.xlsx
完了 (3.87秒)

[198/198] 変換中: invoice_Z工業_202604.xlsx
完了 (4.01秒)

===== 変換完了 =====
成功: 196 件 / 失敗: 2 件
PDF保存先: C:\月次レポート\PDF\2026年4月
ログ: convert_log.csv

198ファイルが約14分で処理されました。手動では2日間かかっていた作業が14分に短縮されました。Claude Codeがエラーハンドリングも組み込んでくれていたため、2件失敗したファイルもスキップされてログに記録されました。

3. 次はClaude Codeにメール自動送信コードを頼んだ

PDFが生成できたので、次は顧客ごとにPDFを自動でメール送信するコードをClaude Codeに依頼しました。Claude Codeは前の会話のコンテキストを理解しているので、「さっきのスクリプトに続けて」という形で指示できます。

プロンプト例 3

私がClaude Codeに入力したプロンプトさっき作ったPDF変換スクリプトに続けて、
customers.csvという以下の列があるCSVファイルを読み込んで
各顧客にPDFをメール送信するコードを追加してください。

customers.csvの列:顧客名, メールアドレス, PDFファイル名

Gmailを使います。メール本文は「今月の請求書をお送りします」
という内容で日本語で書いてください。

Claude Codeの回答:
Gmailで送信する場合はSMTPとアプリパスワードを使います。Gmailのセキュリティ設定で「アプリパスワード」を発行してください。以下のコードを生成しました。
send_pdf_email.py(Claude Codeが生成)
import smtplib
import csv
from email.message import EmailMessage
from pathlib import Path
from datetime import datetime

def send_pdf_by_email(
    pdf_path: str,
    to_address: str,
    to_name: str,
    smtp_user: str,
    smtp_password: str,
    smtp_host: str = "smtp.gmail.com",
    smtp_port: int = 587
):
    """
    PDF添付メールを送信する。
    Claude Codeが生成したコードです。
    """
    pdf = Path(pdf_path)
    today_str = datetime.now().strftime("%Y年%m月")

    msg = EmailMessage()
    msg["Subject"] = f"【{today_str}】ご請求書のご送付"
    msg["From"]   = smtp_user
    msg["To"]     = to_address

    msg.set_content(f"""\
{to_name} 様

いつもお世話になっております。
{today_str}分の請求書をPDFにてお送りします。

ご確認のほど、よろしくお願いいたします。

---
Aurant Technologies 経理部
""")

    # PDFを添付
    with open(pdf_path, "rb") as f:
        msg.add_attachment(
            f.read(),
            maintype="application",
            subtype="pdf",
            filename=pdf.name
        )

    with smtplib.SMTP(smtp_host, smtp_port) as smtp:
        smtp.starttls()
        smtp.login(smtp_user, smtp_password)
        smtp.send_message(msg)

    print(f"  送信完了: {to_address} ← {pdf.name}")


def bulk_send_from_csv(customer_csv: str, pdf_folder: str, smtp_config: dict):
    """
    customers.csvを読み込み、各顧客にPDFを添付してメール送信。
    """
    with open(customer_csv, encoding="utf-8-sig") as f:
        reader = csv.DictReader(f)
        for row in reader:
            pdf_file = Path(pdf_folder) / row["PDFファイル名"]
            if not pdf_file.exists():
                print(f"  PDFが見つかりません: {pdf_file}")
                continue
            send_pdf_by_email(
                pdf_path=str(pdf_file),
                to_address=row["メールアドレス"],
                to_name=row["顧客名"],
                **smtp_config
            )

# 実行(ここを自分の環境に合わせて変更してください)
if __name__ == "__main__":
    smtp_config = {
        "smtp_user":     "あなたのGmailアドレス@gmail.com",  # ← 変更
        "smtp_password": "Gmailアプリパスワード16桁"         # ← 変更
    }
    bulk_send_from_csv(
        customer_csv=r"C:\請求書\customers.csv",       # ← 変更
        pdf_folder=r"C:\月次レポート\PDF\2026年4月",   # ← 変更
        smtp_config=smtp_config
    )

Claude CodeはSMTP設定の説明までコメントに含めてくれました。「アプリパスワードの取得方法も教えて」と追加質問すると、Googleの設定手順も丁寧に説明してくれます。

4. さらにClaude Codeに「全部まとめて」と頼んだ

PDF変換コードとメール送信コードができたので、Claude Codeに「テンプレートExcelに顧客データを差し込んでPDF化してメール送信する一連の流れを1つのスクリプトにまとめてほしい」と依頼しました。

プロンプト例 4

私がClaude Codeに入力したプロンプトこれまでのコードを統合して、以下の一連の処理を自動化する
invoice_auto_system.pyを作成してください。

処理の流れ:
1. customers.csvから顧客一覧を読み込む
2. invoice_template.xlsxをコピーしてopenpyxlで顧客データを差し込む
(B3:会社名, B4:担当者名, F3:今日の日付, F4:請求番号, B10:品目, E10:金額)
3. win32comでPDFに変換して保存する(中間のxlsxは削除)
4. 各顧客のメールアドレスにPDFを自動送信する
5. 全処理後に「完了メッセージ」を表示する

エラーが出た顧客は個別にスキップして処理を継続してください。

Claude Codeはこの複雑な要件に対して、以下の完全なシステムを一発で生成しました。

invoice_auto_system.py(Claude Codeが生成)
import win32com.client
import openpyxl
import smtplib
import csv
import shutil
import time
from pathlib import Path
from datetime import datetime
from email.message import EmailMessage

# ========================================
# 設定(ここを変更してください)
# ========================================
TEMPLATE_PATH = Path(r"C:\請求書システム\template\invoice_template.xlsx")
OUTPUT_DIR    = Path(r"C:\請求書システム\output")
CUSTOMER_CSV  = Path(r"C:\請求書システム\customers.csv")
SMTP_HOST     = "smtp.gmail.com"
SMTP_PORT     = 587
SMTP_USER     = "your@gmail.com"        # ← 変更
SMTP_PASS     = "your_app_password"    # ← 変更

# ========================================
# Step1+2: テンプレートに顧客データを差し込む
# ========================================
def fill_template(customer: dict, output_xlsx: Path) -> Path:
    """テンプレートをコピーして顧客データを書き込む(Claude Code生成)"""
    shutil.copy(TEMPLATE_PATH, output_xlsx)
    wb = openpyxl.load_workbook(output_xlsx)
    ws = wb.active

    today = datetime.now()
    ws["B3"]  = customer["会社名"]
    ws["B4"]  = customer["担当者名"]
    ws["F3"]  = today.strftime("%Y年%m月%d日")
    ws["F4"]  = customer["請求番号"]
    ws["B10"] = customer["品目"]
    ws["E10"] = int(customer["金額"])
    wb.save(output_xlsx)
    return output_xlsx

# ========================================
# Step3: win32comでPDF変換
# ========================================
def convert_to_pdf(xlsx_path: Path, pdf_path: Path, excel_app) -> Path:
    """Excelを高品質PDFに変換する(Claude Code生成)"""
    wb = excel_app.Workbooks.Open(str(xlsx_path.resolve()))
    for ws in wb.Worksheets:
        ws.PageSetup.Zoom           = False
        ws.PageSetup.FitToPagesWide = 1
        ws.PageSetup.FitToPagesTall = False
        ws.PageSetup.PaperSize      = 9
        ws.PageSetup.Orientation    = 1
    wb.ExportAsFixedFormat(
        Type=0, Filename=str(pdf_path),
        Quality=0, IncludeDocProperties=True,
        IgnorePrintAreas=False, OpenAfterPublish=False
    )
    wb.Close(SaveChanges=False)
    return pdf_path

# ========================================
# Step4: PDF添付メールを送信
# ========================================
def send_invoice_email(customer: dict, pdf_path: Path):
    """顧客へPDF添付メールを送信する(Claude Code生成)"""
    today_str = datetime.now().strftime("%Y年%m月")
    msg = EmailMessage()
    msg["Subject"] = f"【{today_str}分】ご請求書のご送付"
    msg["From"]    = SMTP_USER
    msg["To"]      = customer["メールアドレス"]
    msg.set_content(f"""\
{customer['会社名']} {customer['担当者名']} 様

いつもお世話になっております。
{today_str}分のご請求書をPDFにてお送りします。

請求番号: {customer['請求番号']}
金額: ¥{int(customer['金額']):,}(税込)

ご確認のほど、よろしくお願いいたします。

---
Aurant Technologies 経理部
""")
    with open(pdf_path, "rb") as f:
        msg.add_attachment(f.read(), maintype="application",
                            subtype="pdf", filename=pdf_path.name)
    with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as smtp:
        smtp.starttls()
        smtp.login(SMTP_USER, SMTP_PASS)
        smtp.send_message(msg)
    print(f"  送信完了: {customer['メールアドレス']}")

# ========================================
# メイン処理
# ========================================
def main():
    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    today = datetime.now().strftime("%Y%m%d")

    with open(CUSTOMER_CSV, encoding="utf-8-sig") as f:
        customers = list(csv.DictReader(f))

    print(f"処理対象: {len(customers)} 件")
    excel_app = win32com.client.Dispatch("Excel.Application")
    excel_app.Visible       = False
    excel_app.DisplayAlerts = False

    success, errors = 0, 0
    try:
        for i, customer in enumerate(customers, 1):
            print(f"[{i}/{len(customers)}] {customer['会社名']}")
            safe_name = customer["会社名"].replace(" ", "_")
            xlsx_out  = OUTPUT_DIR / f"請求書_{safe_name}_{today}.xlsx"
            pdf_out   = OUTPUT_DIR / f"請求書_{safe_name}_{today}.pdf"

            try:
                fill_template(customer, xlsx_out)
                convert_to_pdf(xlsx_out, pdf_out, excel_app)
                send_invoice_email(customer, pdf_out)
                xlsx_out.unlink()  # 中間XLSXを削除
                time.sleep(1)      # メールサーバー負荷軽減
                success += 1
            except Exception as e:
                print(f"  エラー(スキップ): {e}")
                errors += 1
    finally:
        excel_app.Quit()

    print(f"\n===== 全処理完了 =====")
    print(f"成功: {success} 件  /  エラー: {errors} 件")

if __name__ == "__main__":
    main()
Claude Codeが自動で組み込んでくれた機能:
・エラーが出た顧客はスキップして処理継続(try/except)
・中間のxlsxファイルを自動削除(xlsx_out.unlink())
・メールサーバーへの負荷軽減のためtime.sleep(1)を挿入
・設定値を上部の定数にまとめて変更を容易に

私が特に頼んでいなかった機能もClaude Codeが自動的に追加してくれました。これがClaude Codeの「実用性を考慮した提案」の強みです。

5. 最後にClaude Codeに「毎月自動実行」を設定してもらった

スクリプトが完成したので、毎月末日に自動実行する設定もClaude Codeに聞きました。

プロンプト例 5

私がClaude Codeに入力したプロンプトinvoice_auto_system.pyを毎月の最終営業日の朝8時に
Windowsタスクスケジューラで自動実行したいです。
PowerShellのコマンドを教えてください。
Claude Codeの回答:
毎月末日判定は少し複雑なので、代わりに毎月末日前後の数日間(25〜31日)に毎朝実行して、スクリプト内で「今日が最終営業日かチェックする」コードを追加する方法をおすすめします。以下がその設定コードです。
PowerShell(Claude Codeが生成・管理者権限で実行)
# 毎日朝8時に実行するタスクを登録
# 管理者権限のPowerShellで実行してください
$Action = New-ScheduledTaskAction `
    -Execute "C:\Python311\python.exe" `
    -Argument "C:\scripts\invoice_auto_system.py" `
    -WorkingDirectory "C:\scripts"

$Trigger = New-ScheduledTaskTrigger `
    -Daily `
    -At "08:00AM"

Register-ScheduledTask `
    -TaskName "MonthlyInvoiceAuto" `
    -Action $Action `
    -Trigger $Trigger `
    -RunLevel Highest

Write-Host "タスク登録完了: 毎朝8:00に請求書自動処理を実行します"

Claude Codeはタスクスケジューラの設定コードまで即座に生成してくれました。これにより、毎月末日には朝8時に自動的に200件の請求書が全顧客に送信される仕組みが完成しました。

プロンプト例(追加)

おまけ:後日Claude Codeに追加依頼したプロンプトスクリプトが失敗したときにSlackのWebhook URLに
エラーメッセージを通知するコードを追加してください。
Webhook URLは環境変数SLACK_WEBHOOKに設定します。

Claude Codeはrequestsライブラリを使ったSlack通知コードを即座に追加してくれました。Claude Codeへの追加要件は、このようにチャット感覚でいつでも指示できます。

6. Claude Codeを使った自動化の成果

Before

自動化前(手動作業)

2〜3日毎月末の請求書PDF化・送付作業

200件×5分 = 約17時間。残業が常態化。添付ミスも月1〜2件発生。

After

Claude Code自動化後

14分Claude Codeが生成したスクリプト実行時間

スクリプト設定のみ。送付ミスゼロ。毎月末は朝8時に自動完了。

Claude Codeとのやり取り回数:4回のプロンプトで完成
Claude Codeへの指示は4回のプロンプトのみ。コードを一行も自分で書いていません。Claude Codeがコメントで「ここを変更してください」と明示してくれたため、環境固有の設定を書き換えるだけで動作しました。

7. Claude CodeによるExcel PDF変換:対応メソッド比較

Claude CodeはWindowsのwin32com以外にも、環境に応じた変換方法を生成してくれます。「Macで動くコードを書いて」「Linuxサーバーで動くコードを書いて」と伝えれば、それぞれの環境に最適なコードをClaude Codeが生成します。

方法 対応OS 変換品質 速度 Claude Codeへの指示例
win32com Windows 最高品質 3〜5秒/件 「win32comでExcel→PDFを変換して」
xlwings Win / Mac 高品質 3〜6秒/件 「xlwingsでMacでも動くコードを書いて」
LibreOffice 全OS 良好 2〜4秒/件 「LibreOfficeヘッドレスでLinux対応にして」

8. よくある質問

Claude CodeにVBAも書いてもらえますか?
はい。Claude CodeはVBAも生成できます。「ExcelのVBAでPDF変換するマクロを書いて」と頼むとVBAコードも生成されます。ただしwin32com(Python)のほうがエラーハンドリングや自動化スケジューリングが容易なため、Claude Codeも自動化の目的ではPythonを推奨するコードを生成することが多いです。
Claude Codeが生成したコードはそのまま動きますか?
「pip install pywin32」などのライブラリインストールを済ませれば、Claude Codeが生成するコードは多くの場合そのまま動作します。パス名やSMTP設定など環境固有の部分を書き換えるだけでOKです。Claude Codeはコメントで変更箇所を明記してくれます。エラーが出た場合もClaude Codeにエラーメッセージをそのまま貼り付けると修正コードを生成してくれます。
パスワード付きPDFをClaude Codeに作ってもらえますか?
はい。「pikepdfを使ってパスワード付きPDFを生成するコードを書いて」とClaude Codeに伝えると、変換後にPDFにパスワードを設定する2段階コードを生成してくれます。win32com単体ではパスワード付きPDF出力はサポートされていないため、Claude Codeはpikepdfとの組み合わせを自動的に提案します。
MacやLinuxでも動くコードをClaude Codeに生成してもらえますか?
はい。「MacやLinuxでExcelをPDFに変換するLibreOfficeヘッドレスを使ったコードを書いて」とClaude Codeに指示すれば、subprocess経由のLibreOfficeコードを生成してくれます。Claude Codeは実行環境を指定するだけで、その環境に最適なライブラリと実装を選択してくれます。
一度に何ファイル処理できますか?
スクリプト自体に上限はありません。Claude Codeに「1000ファイルを効率よく処理したい」と伝えると、multiprocessingを使った並列処理コードを自動的に生成してくれます。メモリ不足が発生する場合の対処法も、Claude Codeに「メモリが不足する場合の対処法を教えて」と聞けば解決策を提案してくれます。

Claude Codeに今すぐ頼んでみよう

「毎月のExcel→PDF変換→メール配布を自動化したい」とClaude Codeに話しかけるだけで、あなたの環境に合ったコードを生成してくれます。プログラミング経験は一切不要です。

Claude Codeを無料で試す →

AT
aurant technologies 編集

上場企業からスタートアップまで、数多くのデータ分析基盤構築・AI導入プロジェクトを主導。単なる技術提供にとどまらず、MA/CRM(Salesforce, Hubspot, kintone, LINE)導入によるマーケティング最適化やバックオフィス業務の自動化など、常に「事業数値(売上・利益)」に直結する改善実績多数。

この記事が役に立ったらシェア: