毎月30名分の給与明細をExcelで1件ずつ作っていた総務担当者が、PythonとopenpyxlでPDF一括出力できるようにした話

月末の給与明細作成地獄

従業員30名規模の会社で総務を担当しております。月末になると常に時間との戦いになります。給与計算ソフトを活用しております。税金や保険料の計算はすぐに終わります。しかし本当の地獄はそこから始まります。計算されたデータを元にする作業が大変です。社員一人ひとりの給与明細書を作成します。さらに配布作業も行わなければなりません。一括出力できる人事労務クラウドはございません。残念ながら弊社には導入されておりませんでした。

私は給与計算ソフトのデータを確認します。同時にExcelの明細書テンプレートを開きます。社員ごとに数値を手打ちで入力しておりました。30人分なら大したことはないと考えました。しかし実際には手当や扶養人数が異なります。人によって条件が違うため、行がズレることもあります。「あれ、この交通費は誰のだっけ」となります。その瞬間に頭が真っ白になることもありました。時計の針は22時を回っております。目はチカチカして疲れを感じておりました。胃の奥が重く沈んでいく感覚を覚えたものです。

給与明細作成の苦労

まず、社員によって基本給の金額が違います。役職手当や家族手当の有無も異なります。交通費の支給額もそれぞれバラバラです。振込先の銀行口座も人によって違います。これをExcelのテンプレートに転記します。1件ずつコピーして貼り付ける作業です。さらにPDF形式で保存する工程がございます。それぞれの社員宛てにメールで送信します。PDFを添付して送る作業が毎月発生します。コピペミスが非常に怖いと感じておりました。画面に定規を当てて目視確認を繰り返します。給与日前日になるとオフィスには誰もいません。明細作りのために残業をするのが当たり前でした。

給与明細ミスの危機と自動化への決意

手作業の限界を感じる出来事がございました。それはある日突然やってきました。毎月の作業を少しでも早く終わらせたいと考えます。前月の明細ファイルをコピーして使いました。数値を書き換える運用をしていたときのことです。いつものように全社員への送付を終えました。PDFの送付を終えて、ほっと一息つきました。コーヒーを飲んでリラックスしておりました。

送付からわずか10分後のことです。営業部のAさんからチャットが届きました。「明細の振込口座が自分のものではない」との内容です。慌てて送信済みのPDFを開き直しました。するとAさんの明細に問題が見つかりました。前月のBさんの口座番号が残っていたのです。そのままそっくり残っておりました。血の気が引き、全身が凍りつきました。マウスを握る手が小刻みに震えたのを覚えています。今でもその光景を思い出すと怖くなります。

給与情報の取り扱いと重大なリスク

そもそも給与情報は非常に重要です。企業が扱うデータの中でも機密性が高いです。大切な個人情報であることを忘れてはいけません。誰がいくらもらっているかという情報です。どこの銀行を使っているかも含まれます。こういった情報が他人に漏れるのは危険です。重大なリスクを引き起こすことになります。個人情報保護法などの観点からも問題です。今回は社内での指摘で済みました。もし他人の給与額が見えていたら大変です。取り返しのつかない事態になっていたでしょう。人間の目によるチェックには限界がございます。このヒヤリハットを機に決意を固めました。絶対にミスが起きない仕組みを作ります。自動化の仕組みを作ることを決意いたしました。

openpyxlのExcel自動化と数式の罠

Pythonを使えばExcelの操作が可能です。プログラムで完全に制御することができます。そこでopenpyxlというライブラリを選びました。Excelファイルを直接読み書きできるツールです。最初の準備として情報をまとめました。社員番号や氏名、基本給をCSVにします。各種手当や控除額、口座情報もまとめました。メールアドレスも含めた「社員マスタCSV」です。このCSVからデータを1行ずつ読み込みます。Excelの給与明細テンプレートを使います。空のテンプレートに自動で流し込む仕組みです。そのためのスクリプトを構築いたしました。

実装の肝となる処理について説明します。指定したセルに正確な値を当てる作業です。openpyxlではワークシートを指定します。「ws[‘C5’].value = name」と記述します。これだけでC5セルに氏名を書き込めます。サクッと書き込めるので非常に便利です。基本給や手当をそれぞれのセルに入力しました。その後は支給合計などの計算を行います。控除合計や差引支給額も算出させます。この計算ロジックもPython側に持たせました。

VBA・Pythonをもっと本格的に学ぶなら

VBAやPythonを実務レベルまで引き上げたい方には「侍エンジニア」がおすすめです。マンツーマン指導・オーダーメイドカリキュラムで、文系出身でも挫折しにくい環境が整っています。無料カウンセリングだけでも学習ロードマップが明確になります。

侍エンジニア 無料カウンセリングを予約する →

openpyxl 数式処理の落とし穴

ここで非エンジニアが必ずつまずく点があります。それはExcelに組み込まれた数式です。SUM関数などが入っている既存ファイルです。openpyxlで読み込む際に注意が必要です。デフォルトの設定では数式が文字列になります。計算結果として取得することができません。これを防ぐための設定がございます。ワークブックを読み込む際の引数を確認してください。「data_only=True」を指定する必要があります。これを知らないと作業が止まってしまいます。数式セルへ書き込みを行う際、エラーが出ます。ファイルが壊れるなどのトラブルも起きます。これで何時間も時間を溶かすことになります。

openpyxlを体系的に学びたい場合の方法です。Amazonで解説書を一冊購入するのが早道です。実務向けのPython本を手元に置いてください。さらに確実なスキル習得を目指す方法もあります。侍エンジニアのようなスクールも有効です。マンツーマンで指導を受けることができます。実践形式で身につけるのも良い選択肢です。

Excel自動PDF化とデータ管理

Excelへの自動入力が完了しました。次は改ざん防止のためにPDF化を行います。openpyxl単体ではPDF化ができません。そのためwin32comというライブラリを使います。Windowsの機能を操作できるライブラリです。Pythonから裏側でExcelを立ち上げます。「win32com.client.Dispatch」を呼び出しました。人間が手動で行う操作を再現できます。「名前を付けて保存」からPDFを選びます。その動作を完全に自動化することができました。

ファイルの上書きを防ぐ工夫も必要です。後から探しやすくする設計にいたしました。命名規則を綿密に考えて設計しました。os.makedirsというモジュールを活用します。スクリプト実行時にフォルダを自動生成します。「0012_田中太郎」といった社員別フォルダです。その中にPDFファイルを保存していきます。「2026年04月_0012_田中太郎_給与明細.pdf」としました。年月付きのファイル名で保存するようにしております。

自動化の落とし穴:データ上書きと事前チェック

当初は凡ミスを犯したこともございます。ファイル名に年月を入れ忘れてしまいました。スクリプトをテストのために実行しました。二度実行した瞬間に悲劇が起きました。先ほど生成した前月のPDFが消えたのです。すべて警告もなく上書きされました。バックアップを取っていなかったので大変です。自動化の恐ろしさを身をもって体験しました。PDF化の処理では事前チェックが大切です。出力先に同名のファイルがないか確認します。os.path.existsでチェックする仕組みにしました。この一手間を惜しんではいけません。過去のデータを一瞬で失う事故につながります。

メール誤送信対策:ドライラン

PDFの大量生成に成功した後の話です。当然ですがメール送信も自動化したくなります。しかし過去のヒヤリハットを思い出しました。送付先アドレスの確認なしでは危険です。プログラムで30件を一瞬で送る怖さがあります。あまりにもリスクが高いと判断いたしました。もしマスタCSVの行がズレていたら大変です。社員番号とアドレスが間違っていたらと考えました。そう想像するだけで恐ろしくなります。

業務画面のイメージ

個人情報を扱う自動化には注意が必要です。完全な無人運転はリスクが大きすぎます。そこで設計に原則を取り入れました。「送る前に人間が最終確認する」という工程です。具体的にはドライランという機能を構築しました。デバッグモードを走らせる仕組みの導入です。

ドライランの段階では送信を行いません。ターミナル上に送信予定のリストを出します。「誰の」「どのPDFを」「どこへ送るか」です。プログラムを一時停止させて確認します。宛先と添付ファイル名を目視でチェックします。問題がないと判断して初めて先に進みます。「Y」キーを押すと送信が開始されます。これによって誤送信のリスクを抑えました。リスクは極限までゼロに近づいております。

Pythonによる給与明細発行自動化

毎月の憂鬱だった発行業務が変わりました。Pythonの力を借りて劇的に生まれ変わりました。実現のための道のりは3つのステップです。

ステップの1つ目について説明します。社員マスタをCSV形式で整備することです。次にExcelのセルマッピングを定義します。openpyxlで正確に流し込む土台を作ります。2つ目はwin32comの活用です。ExcelをPDF形式に一括変換します。社員番号フォルダに年月付きで保存する仕組みです。最後の3つ目がドライラン機能です。目視確認とsmtplibによる送信を連携させました。

バックオフィス業務全体の生産性向上

この3つの仕組みがうまく噛み合いました。かつては数時間かかっていた作業です。今ではわずか数分で完結いたします。確認作業とボタン一押しで終わります。同じ技術は他の業務にも応用できます。請求書のPDF一括出力でも役立ちます。またバックオフィス業務の自動化も可能です。経費精算のGAS自動化も検討してください。有給残日数の自動管理も組み合わせられます。月末の事務作業を大幅に短縮できるはずです。手作業のコピペで疲弊しているならお勧めします。ぜひ社員マスタの整備から始めてみてください。

関連リンクとチェックリスト

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうかを判断します。VBAかPythonかの選択も大切です。最初に避けるべき落とし穴をまとめました。実務で迷うポイントを1枚に凝縮しております。メールアドレスだけで受け取りが可能です。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルを自動で選択する機能です。部署名のゆれを正規化する処理も入っております。CSV文字コード確認も含めた3本セットです。今週の作業を楽にするための最小キットとなります。

ミニキットを見る(¥980)

関連する学びを少し広げるなら

PythonやExcelまわりの自動化をもう少し体系的に学びたい方には、実務向けの技術書で土台を固める方法もあります。

Python業務自動化関連書籍(Amazon) →

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

[アンケート] この記事は役に立ちましたか?

30秒で答えられます。改善の参考にします。

1問だけ回答する