はじめに
こんにちは、ニンジンです🥕
これまで全3回にわたってお届けしてきた「Invoice Maker」制作シリーズ、ついに完結しました!
毎月末の受注一覧データから会社名や金額をコピーし、請求書の雛形に貼り付けて1枚ずつPDF形式で保存する作業は、件数が増えるほど手作業での対応が困難になります。コピペミスによるヒューマンエラーのリスクも生じます。
本記事では、3回分の内容をダイジェストでおさらいしながら、Excelデータの読み取りやPDF変換のロジック、さらにノンプログラマーでも操作可能なGUI(操作画面)の実装まで、一連の構築手順を一括で確認できます。
📚 シリーズ全記事一覧
【第1回】Excelデータの読み取りとPDF変換の基本ロジック
|
最初のステップとして、基盤となる「1枚のExcelデータを取得し、レイアウトを保持したままPDFへ変換する」プログラムを構築します。 詳細解説:【第1回】PythonでExcel請求書を自動PDF化!openpyxlとpywin32で行う業務自動化入門 > |
仕様上の注意点と対策
-
① data_only=True の指定:
通常の読み込みでは、合計値などのセルから「=SUM(H2:H3)」といった数式文字列がそのまま取得されます。data_only=Trueを設定することで、Excelが計算した後の数値結果を正確に抽出します。 -
② 一時ファイル(temp.xlsx)の経由:
openpyxl単体ではPDF出力を行えません。そのため、一度別名でデータをExcel保存し、COMコンポーネント(pywin32)を通じてWindows上でExcel製品を操作してPDF保存を指示し、最後に一時ファイルを削除する処理フローを採用しています。
【第2回】for文による連続一括PDF化とエラーハンドリング
|
1枚の処理ロジックを、複数データの連続処理へと拡張します。for文による繰り返し処理を実装し、実務運用に必須となる例外処理を組み込みます。 詳細解説:【第2回】Pythonのfor文でExcelデータを連続PDF化!重複回避とエラー対策(例外処理)のやり方 > |
実務運用に耐えうるコード設計
Pythonを使いバックグラウンドでExcelを操作する際、処理の途中でエラーが発生すると、タスクマネージャー上でExcelプロセスが起動したまま残る問題があります。これが累積するとシステムのリソースを圧迫します。
この現象を防ぐため、コード内にtry...finallyブロックを導入します。メイン処理中に予期せぬエラーが発生した場合でも、finally: excel.Quit()が確実に呼び出され、バックグラウンドのExcelプロセスを安全にクローズします。
【第3回】CustomTkinterによるGUI操作画面の実装
|
自動化ロジックの完成後、非エンジニアの担当者でもソースコードに触れずに利用できるよう、操作画面(GUI)を開発します。 詳細解説:【第3回】CustomTkinterでPythonツールをGUI化!ノンプログラマーでも使える汎用アプリの作り方 > |
操作性向上とアプリケーション設計のポイント
-
① filedialog によるファイルパス取得:
パスの手入力を排除し、Windows標準の「ファイルを開く」ダイアログから視覚的にExcelファイルを選択できる仕組みにより、入力ミスを防止します。 -
② .get() による実行範囲の制御:
画面上の入力欄(Entry)から「開始行」と「終了行」の数値を.get()で動的に取得。ソースコードを直接書き換えることなく、対象データの範囲変更を可能にします。 -
③ クラス(Class)を用いた構造化:
画面の部品管理と自動化ロジックの連携が煩雑にならないよう、class InvoiceApp(ctk.CTk):を用いたオブジェクト指向設計を導入し、コードの保守性を高めています。
よくある質問(FAQ)
Windowsのみ対応しています。
PDF化の処理に使用している pywin32 が、WindowsのExcelを裏側から直接操作する仕組みのためです。MacやLinux環境では動作しません。
Macでも同様の処理をしたい場合は、PDF化の部分を reportlab や pdfkit などの別のライブラリに置き換える必要があります。
Python 3.8以上を推奨します。
第3回で使用するCustomTkinterの推奨環境がPython 3.8以上のため、この基準に合わせておくと安心です。インストール済みのバージョンはコマンドプロンプトで確認できます。
python --version
Microsoft Excel(有償版)がパソコンにインストールされている必要があります。
PDF化の処理でExcel本体を裏側から起動しているためです。GoogleスプレッドシートやLibreOfficeでは代替できないのでご注意ください。
よくある原因は3つです。
- Pythonが正しくインストールされていない:
python --versionでバージョンが表示されるか確認してください。 - pipが古い:
python -m pip install --upgrade pipでpipを最新にしてから再試行してください。 - 社内ネットワークの制限:社内のセキュリティ設定でインターネット接続が制限されている場合があります。IT担当者に確認してください。
計算式の文字列がそのまま取得されてしまいます。
例えば合計金額のセルに =SUM(H2:H3) という式が入っている場合、数値ではなくこの式の文字列が請求書に転記されてしまいます。
data_only=True を指定することで、Excelが計算した後の「結果の数値」だけを取得できます。データの読み取りには必ず付けるようにしましょう。
openpyxlにはPDF書き出しの機能がないためです。
処理の流れを整理すると、以下のようになります。
- openpyxlでデータを書き込み、いったん
temp.xlsxとして保存する - 裏側でExcelを起動して
temp.xlsxを開き、PDF形式で保存する - 用済みの
temp.xlsxをos.remove()で削除する
この手順を踏むことで、元の請求書テンプレートのレイアウトを崩さずにPDFを生成できます。
はい、range() の数値を変更するだけで対応できます。
「4行目から10行目まで」処理したい場合は range(4, 11)、「20行目から25行目まで」なら range(20, 26) と指定します。
第3回で作ったGUIアプリでは、この開始行・終了行を画面の入力欄から変更できるため、コードを直接触る必要はありません。
エラーが発生して処理が止まります。
Windowsではファイル名に / \ : * ? " < > | などの文字は使えません。
対策として、会社名を取得した後に str.replace() や re.sub() を使って使用できない文字を除去する処理をあらかじめ追加しておくことをおすすめします。
はい、エラー発生前に処理が完了したPDFはそのまま残ります。
第2回で解説した try...finally の構造により、エラーが発生してもExcelプロセスは確実に終了します。
エラーになった行番号はターミナルに表示されるため、その行のデータを確認してから再実行することで対処できます。
見た目が大きく異なります。通常のTkinterは古いWindowsアプリ風のデザインですが、CustomTkinterはフラットでモダンな見た目です。
| 項目 | Tkinter(標準) | CustomTkinter |
|---|---|---|
| デザイン | 古いWindowsアプリ風 | フラットでモダン |
| ダークモード | 非対応 | 対応 |
| インストール | Python標準搭載 | pip installが必要 |
| 書き方 | 通常のTkinterと同じ | ほぼ同じ(移行しやすい) |
PyInstallerで .exe ファイル化するのが現実的な方法です。
そのままでは相手のPCにもPythonと各ライブラリが必要になります。社内に非エンジニアのスタッフが多い場合、環境構築をお願いするのは現実的ではありません。
PyInstallerで実行ファイル(.exe)化すれば、Pythonがインストールされていないパソコンでもダブルクリックで起動できるようになります。
はい、基本のコードではエラーが発生します。
入力値を int() で数値変換する際に文字列が渡されるとエラーになります。
実務で使う場合は try...except ValueError を組み合わせて「数字以外が入力されたら警告を出す」処理を追加しておくと安心です。
はい、セルの位置が変わった場合は修正が必要です。
コード内の ws_kanri["C4"] のような記述が、どのセルを参照するかを指定しています。列や行の位置を変更した場合は、その箇所を対応するセル番地に書き換えてください。
管理表と請求書の両方を変更した場合は、それぞれの参照箇所を確認するようにしましょう。
はい、os モジュールと datetime を組み合わせることで対応できます。
処理の冒頭で現在の年月を取得してフォルダ名に使う方法が一般的です。os.makedirs() と組み合わせることで、フォルダが存在しない場合も自動作成できます。
datetime.now().strftime("請求書_%Y%m") → 「請求書_202507」のようなフォルダ名を自動生成
件数が増えるほど処理時間はかかりますが、Excelプロセスが溜まるトラブルは防止できます。
1件あたり数秒が目安ですが、PCのスペックやExcelファイルの複雑さによって変わります。
第2回で解説した try...finally を正しく実装することで、エラー発生時にExcelのプロセスが残り続けてPCが重くなる現象を防げます。
まとめ:3回でたどった自動化の道のり
本シリーズでは、以下のようなステップでExcel請求書の自動化ツールを作り上げてきました。
これで「クリック一つで大量の請求書を発行できるツール」という当初の目標は達成できました。ただ、このツールを他のパソコンで動かすには「Pythonとライブラリのインストール」という壁が残っています。
💡 環境構築不要で今すぐ使いたい方へ
PYTHON環境構築 不要・実行ファイル化済み
Invoice Maker (NINJIN EDITION)
「自分で環境を作るのは大変…」「社内のPCにそのまま展開したい」という方には、ダブルクリックするだけで起動できる実行ファイル(.exe)の完全版パッケージをご用意しました。
noteで詳しく見る →最後までお読みいただき、ありがとうございました。py-vbalab.comでは、これからも皆様の業務を劇的に楽にするVBA&Pythonの技術を発信していきます!
シリーズ記事一覧
電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。
-
FILE.01 — IoT
Raspberry Pi Pico W × GASラズパイPico W×GASで自作!「LINEで動く温湿度&スマートリモコン」完全ロードマップ
「外出中のペットの室温が心配…」そんな思いからスタートしたIoT自作プロジェクトの総集編。温湿度監視からエアコン遠隔操作まで、仕組みをゼロから作りたい方のための全5回の開発記録です。
シリーズを読む -
FILE.02 — CNC
Arduino × レーザー刻印CNCCNC自作シリーズ
高精度な加工を目指し、本格的な自作CNC製作に挑戦中。現在は基幹パーツであるオリエンタルモーターの納品を待つ「設計・準備編」を公開。ハードとソフトの両面から、理想のマシンを形にする過程をリアルタイムにお届けします。
シリーズを読む -
FILE.03 — XY軸制御
Raspberry Pi × ステッピングモーターXYテーブルシリーズ
Raspberry Piとステッパモーターを使い、ゼロから2軸制御に挑む記録。OS設定から回路設計、多軸制御のPythonコードまで、躓きやすいポイントを徹底図解。電子工作初心者が「動く感動」を味わうための実戦ガイドです。
シリーズを読む -
FILE.04 — 業務自動化
Python × Excel × CustomTkinter【Python開発記】NINJIN Mail制作記
PythonとExcelを連携させ、実務で即戦力となるメール送信ツールを開発。CustomTkinterによるUI構築や、ミスを防ぐテンプレート活用術など、現場の「痒い所に手が届く」自動化ノウハウを細部まで丁寧に解説します。
シリーズを読む -
FILE.05 — 業務自動化
Python × Excel × GUIアプリ化Invoice Maker(請求書・見積書自動作成)
手作業の請求書作成から卒業!PythonでExcelデータを読み込み一括PDF化する「Invoice_Maker」の作り方を全3回で解説。基本ロジックからGUIアプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む

コメント