はじめに
こんにちは、VBA・Python業務自動化ラボ(py-vbalab.com)のニンジンです。
前回の第1回では、Pythonを使って「1枚の請求書」を自動作成し、美しいPDFとして出力する基本ロジックを解説しました。 しかし、現場の業務は1枚で終わることはありませんよね。月末には数十枚、多ければ数百枚の請求書が待っています。
「1枚の自動化ができたら、次は10枚でも100枚でも同じこと。」 これこそが、プログラムの真骨頂である**「ループ(繰り返し)処理」**の魔法です。
今回は、前回のコードをさらに進化させ、受注管理表に並んだ複数行のデータを次々と読み込み、一気に大量のPDFを生成するスクリプトを作成します。さらに、実務でツールを動かすなら絶対に知っておきたい「エラー対策(例外処理)」の技も惜しみなく公開します!
【PR:今すぐ完成版ツールを使いたい方へ】

「自分でコードを書く時間がない!」 「社内の誰でもクリックだけで使える完成品が今すぐ欲しい!」
という方に向けて、本シリーズの最終形態であるGUI(画面)搭載のフルパッケージ版**【Invoice Maker (NINJIN EDITION)】**をnoteにて頒布しています。
👉 Invoice Maker (NINJIN EDITION) をnoteでチェックする
準備1:テストに必要なExcelファイルを準備
お手持ちの管理表と書類フォーマットを準備いただくか、下記のサンプルをご使用下さい。
※第1回の記事と同じExcelファイルです。
準備2:Pythonコードを動かす環境の準備
複数データを一括処理!進化版Pythonスクリプト
こちらが今回のベースとなる、連続処理に対応したスクリプトの全貌です。
(※ファイルパスやシート名は、ご自身の環境に合わせて変更してください)
初心者でもコードの意味が分かるように、1行ずつ説明文を追加してあります。
# invoice_maker_test02.py
# 受注管理表の複数行からデータを読み込み、請求書の雛形に書き込んでPDF化するサンプルコード
# invoice_maker_test01.pyをベースに、for文で複数行を処理するように拡張したコードです
import openpyxl
import win32com.client
import os
# 1. 設定
KANRI_PATH = "受注管理表_Sample.xlsx" # 変数KANRI_PATHに受注管理表のExcelファイルのパスを指定
HINAGATA_PATH = "請求書_Sample.xlsx" # 変数HINAGATA_PATHに請求書の雛形となるExcelファイルのパスを指定
# Excelアプリケーションの起動(ループの外で行うと高速です)
excel = win32com.client.Dispatch("Excel.Application") # DispatchでExcelアプリケーションを起動
excel.Visible = False # Excelのウィンドウを表示しない
excel.DisplayAlerts = False # 警告ダイアログを表示しない
excel.ScreenUpdating = False # 画面更新を停止(より徹底する場合)
try: # エラー発生時もExcelを確実に終了させるためにtryブロックを使用
wb_kanri = openpyxl.load_workbook(KANRI_PATH, data_only=True) # KANRI_PATHを開く data_only=Trueで数式の結果を値で取得
ws_kanri = wb_kanri["Sheet1"] # シート名を指定してシートを取得
# 2. for文で4行目から9行目まで繰り返す
# range(4, 10) は 4, 5, 6, 7, 8, 9 までを指します
for i in range(4, 10):
try: # for文の中でエラーが起きても次の行に進むように、ここでもtryブロックを使用
# 行番号(i)を使って各データを取得
order_id = ws_kanri[f"A{i}"].value # 受注番号 .valueでセルの値を取得
company_name = ws_kanri[f"C{i}"].value # 会社名
s_name = ws_kanri[f"F{i}"].value # 商品名
count = ws_kanri[f"G{i}"].value # 数量
amount = ws_kanri[f"H{i}"].value # 単価
print(f"--- 処理中({i}行目): {company_name} 様 ---")
# 3. 雛形へ書き込み
wb_hina = openpyxl.load_workbook(HINAGATA_PATH) #HINAGATA_PATHを開く
ws_hina = wb_hina["Sheet1"] # シート名を指定してシートを取得
ws_hina["A5"] = company_name #HINAGATA_PATHのA列5行目に会社名を書き込み
ws_hina["B18"] = s_name #HINAGATA_PATHのB列18行目に商品名を書き込み
ws_hina["L18"] = amount #HINAGATA_PATHのL列18行目に金額を書き込み
ws_hina["J18"] = count #HINAGATA_PATHのJ列18行目に数量を書き込み
# 一時ファイルのパス(会社名を含めて重複を避ける)
temp_excel = os.path.abspath(f"temp_{order_id}.xlsx") #abspathで絶対パスを取得 order_idを使って一時ファイルの名前を個別化する
wb_hina.save(temp_excel) # 保存してからPDF化する必要があるため、一時的なExcelファイルを作成
# 4. PDF化処理
output_pdf = os.path.abspath(f"請求書_{order_id}_{company_name}.pdf") # 出力するPDFのパスを作成(会社名と受注番号を含めて重複を避ける)
doc = excel.Workbooks.Open(temp_excel) # Openで先ほど保存した一時的なExcelファイル(temp.xlsx)を開く
doc.ExportAsFixedFormat(0, output_pdf) # ExportAsFixedFormatでPDF形式で保存。第1引数は0でPDF、第2引数は保存先のパス
doc.Close(False) # Closeでtemp.xlsxを閉じる。引数は変更を保存するかどうか(Falseで保存しない)
# 一時ファイルの削除
os.remove(temp_excel) # 一時的なExcelファイルを削除
print(f"成功: {output_pdf}")
except Exception as e: # エラーが発生しても次の行に進むための例外処理
print(f"【失敗】 {i}行目の処理でエラー: {e}")
finally:
# ループ内での後片付け(必要に応じて)
pass # 今回は特に後片付けはないですが、ここでExcelの設定をリセットすることもできます
finally:
# 5. Excelを完全に終了
excel.Quit()
print("すべての処理が完了しました。")
テスト結果
ここがポイント!実務で使える3つの技
このスクリプトには、ただ動くだけでなく「現場でトラブルを起こさないための工夫」が詰め込まれています。
① for i in range() による高速ループ処理
for i in range(4, 10): と書くことで、変数 i に「4, 5, 6, 7, 8, 9」という数字が順番に入り、その下のブロックが繰り返し実行されます。 ws_kanri[f"C{i}"] のように記述すれば、1周目は「C4」、2周目は「C5」と、自動でエクセルの行を下にずらしながらデータを取得してくれるのです。
② f-stringを活用した「ファイル名重複回避」
前回のコードでは、出力するファイル名を "請求書_出力.pdf" で固定していました。しかし、ループ処理でこれをやると**「100回すべて同じ名前に上書きされて、最後の1社分しか残らない」**という大惨事になります。
そこでPythonの強力な文字列操作「f-string」の出番です。
output_pdf = f"請求書_{order_id}_{company_name}.pdf"
このように書くことで、「請求書A001株式会社〇〇.pdf」のように、1件ずつ個別のファイル名を動的に生成できます。これで上書きされる心配はありません。
③ 【最重要】Excelの亡霊を防ぐ try...finally
VBAやPythonでExcelを裏側操作する際、最も恐ろしいのが**「エラーでプログラムが止まったのに、裏側でExcelが起動したままになる現象(ゴーストプロセス)」**です。これが溜まるとパソコンの動作が激重になります。
これを完全に防ぐのが try...finally ブロックです。
try:の中にメインの処理を書きます。finally:の中には**「エラーが起きようが起きまいが、絶対に最後に実行する処理」**を書きます。
try:
# メインのループ処理
finally:
excel.Quit() # 絶対にExcelを終了させる!
このお作法を守ることで、途中で予期せぬエラーが起きてツールが停止しても、裏側のExcelは確実に閉じられます。これが「現場で耐えうるプロの書き方」です。
まとめ:裏側のロジックはこれでOK!次は…?
今回のスクリプトを実行すれば、指定した行のデータが猛スピードで読み込まれ、魔法のように次々とPDFが生成されていく光景を見ることができます。これで裏側の処理は完成です。
しかし、実務で使う上で一つ大きな問題が残っています。 毎月処理する行数は変わりますよね。「今月は4行目から50行目まで出力したい」となった場合、いちいちプログラムのコードを開いて range(4, 51) と書き換えなければなりません。 エンジニアではない一般の事務スタッフにとって、コードを直接いじるのはハードルが高く、誤ってコードを壊してしまうリスクもあります。
そこで最終回となる次回は! CustomTkinterというライブラリを使って、**誰でもクリックと文字入力だけで使える「専用の操作画面(GUI)」**を作り上げます。いよいよ「プロ仕様のツール」の完成です。お楽しみに!
【次回の記事はこちら】
【第3回】黒い画面を卒業!CustomTkinterでプロ仕様のGUI搭載ツール「Invoice Maker」を完成させる
💡 業務ですぐにツールを使いたい方へ
「次回の解説まで待てない」「環境構築とか面倒だから今すぐツールが欲しい!」という方は、noteにて完成版のGUIアプリ【Invoice Maker (NINJIN EDITION)】を頒布中です。 直感的な操作画面を備え、ダウンロード後すぐに起動して使える完全版ソフトウェアとなっています。ぜひチェックしてみてください! 👉 Invoice Maker (NINJIN EDITION) をnoteで確認する










コメント