月末の給与明細作成地獄

従業員30名規模の会社で総務を担当していると、月末は常に時間との戦いになる。給与計算ソフトを使えば、税金や保険料の計算自体はあっという間に終わる。しかし、本当の地獄はそこから始まるのだ。計算されたデータを元に。社員一人ひとりの給与明細書を作成して配布しなければならない。システムで一括出力できる立派な人事労務クラウドなど。うちの会社には導入されていありません。
給与計算ソフトのエクスポートデータを横目に。Excelの明細書テンプレートを開いて社員ごとに数値を手打ちしていた。30人分だから大したことはないと思いながらも、手当や扶養人数が人によって違うため。途中で行がズレて「あれ、この交通費は誰のだっけ」と頭が真っ白になった。時計の針は22時を回り、目はチカチカして胃の奥が重く沈んでいくのを感じた。
給与明細作成の苦労
まず、社員によって基本給も違えば、役職手当や家族手当の有無も異なる。交通費の支給額や振込先の銀行口座もバラバラだ。これをExcelのテンプレートに1件ずつコピーして貼り付け、PDF形式で保存し。それぞれの社員宛てにメールで添付して送る。この一連の作業が毎月発生する。コピペミスが怖くて、画面に定規を当てながら目視確認を繰り返していた。給与日前日になると。誰もいなくなったオフィスで明細作りの残業をするのが当たり前になっていた。
給与明細ミスの危機と自動化への決意

手作業の限界を感じる出来事は、ある日突然やってきた。毎月の作業を少しでも早く終わらせようと。前月の明細ファイルをコピーして数値を書き換える運用をしていたときのことだ。いつものように全社員へのPDF送付を終え、ほっと一息ついてコーヒーを飲んでいた。
送付からわずか10分後、営業部のAさんから「あの。明細の振込口座が自分のものじゃないんですが」とチャットが飛んできた。慌てて送信済みのPDFを開き直すと、Aさんの明細の末尾に。前月のBさんの口座番号がそっくりそのまま残っていた。血の気が引き、マウスを握る手が小刻みに震えたのを今でも覚えている。
次に、給与情報は、企業が扱うデータの中でも極めて機密性の高い個人情報である。誰がいくらもらっているか、どこの銀行を使っているか。こういった情報が他人に漏れることは。個人情報保護法や労働基準法の観点からも重大なリスクになる。今回は社内での指摘で済んだが。もし他人の給与額が丸見えになっていたら取り返しのつかない事態に発展していた。人間の目によるチェックには限界がある。このヒヤリハットを機に、絶対にミスが起きない自動化の仕組みを作る決意を固めた。
openpyxlのExcel自動化と数式の罠

Pythonを使えば、Excelの操作をプログラムで完全に制御できる。そこで白羽の矢を立てたのが。Excelファイルを直接読み書きできる外部ライブラリのopenpyxlだ。最初の準備として、社員番号、氏名、基本給、各種手当、控除額、振込口座。メールアドレスをまとめた「社員マスタCSV」を用意した。このCSVから1行ずつデータを読み込み。Excelで用意した給与明細の空テンプレートに自動で流し込むスクリプトを組んです。
実装の肝となるのは、テンプレートの指定したセルに正確な値を当てはめる処理だ。openpyxlでは。ワークシートのオブジェクトに対して「ws[‘C5’].value = name」のように書くだけで。C5セルに氏名をサクッと書き込める。基本給や手当をそれぞれのセルに入力した後は、支給合計や控除合計。最終的な差引支給額を自動計算させるロジックもPython側に持たせた。
ここで一度立ち止まって考えてみてください
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。
openpyxl 数式処理の落とし穴
一方で、ここで非エンジニアが必ずつまずく落とし穴がある。既存のExcelファイルに組み込まれたSUM関数などの数式だ。openpyxlでExcelを読み込む際。デフォルトのままでは数式が計算結果としてではなく。数式の文字列そのままとして取得されてしまう。これを防ぐためには。ワークブックを読み込む関数の引数に「data_only=True」を指定しなくてはならない。これを知らずに数式セルへ書き込みを行おうとすると。ファイルが壊れたり予期せぬエラーが出たりして何時間も溶かすことになる。
openpyxlをより体系的に学びたい場合は。Amazonで実務向けのPython解説書を一冊手元に置いておくのが早道だ。さらに確実なスキル習得を目指すなら。侍エンジニアのようなマンツーマン指導型スクールで実践形式で身につける方法も選択肢に挙げられる。
Excel自動PDF化とデータ管理

Excelファイルへの自動入力が完了したら、次は改ざん防止のためのPDF化だ。openpyxl単体ではPDFへのエクスポート機能を持たないため。WindowsのCOMインターフェースを操作できるwin32comというライブラリを組み合わせた。Pythonから裏側でExcelアプリケーションを立ち上げ。「win32com.client.Dispatch(‘Excel.Application’)」を呼び出すことで。人間が「名前を付けて保存」からPDFを選ぶのと同じ動作を自動化する。
そのため、ファイルの上書きを防ぎ、後から探しやすくするための命名規則は綿密に設計した。os.makedirsというモジュールを使い。スクリプト実行時に「0012_田中太郎」といった社員ごとの専用フォルダを自動生成させる。その中に「2026年04月_0012_田中太郎_給与明細.pdf」という年月付きのファイル名で保存していく。
自動化の落とし穴:データ上書きと事前チェック
当初はファイル名に年月を入れ忘れるという凡ミスを犯した。スクリプトをテストのために二度実行した瞬間。先ほど生成した前月の明細PDFが警告もなく全て上書きされて消滅したのだ。バックアップを取っていなかったため。自動化の恐ろしさを骨の髄まで味わうことになった。PDF化の処理では。出力先パスにすでに同名のファイルが存在しないかをos.path.existsで事前にチェックするロジックを組み込む。この一手間を惜しむと、過去の重要な明細データを一瞬で吹き飛ばす事故に繋がる。
メール誤送信対策:ドライラン
パネル/d26-content5.png
しかし、PDFの大量生成に成功すると。当然「これを自動でメール送信するところまでやりたい」という欲求が湧いてくる。しかし、ここで過去のヒヤリハットの記憶が蘇った。送付先アドレスの確認なしに。プログラムの力で30件を一瞬で自動送信してしまうのはあまりにも危険だ。万が一、マスタCSVの行が1つズレていたら。社員番号とメールアドレスの紐付けが間違っていたら。
個人情報を扱う自動化において、完全な無人運転はリスクが高すぎる。そこで「送る前に必ず人間の目で最終確認できるゲートを設ける」という設計原則を取り入れた。具体的には。送信処理を実行する前にドライランというデバッグモードを走らせる仕組みを構築した。
ドライランの段階では、実際にはメールを送らない。ターミナル上に「誰の」「どのPDFファイルを」「どのアドレス宛てに」送付する予定かというリストを出力し。プログラムを一時停止させる。画面に表示された宛先と添付ファイル名の組み合わせを目視で確認し。問題がないと判断して初めて「Y」キーを押す。これによって、メール誤送信のリスクは極限までゼロに近づいた。
Pythonによる給与明細発行自動化
さらに、毎月の憂鬱だった給与明細の発行業務は。Pythonの力を借りることで劇的に生まれ変わった。実現のための道のりは、大きく分けて3つのステップに集約される。
ステップの1つ目は、社員マスタをCSVで整備し。Excelテンプレートのセルマッピングをopenpyxlで定義することだ。ここでの正確なデータ流し込みがすべての土台となる。2つ目は、win32comを活用してExcelをPDF形式に一括変換し。社員番号フォルダに年月付きで自動保存する仕組みの構築。最後の3つ目が、ドライランによる目視確認機能と。smtplibを使った安全な自動メール送信の連携です。
この3つの仕組みが噛み合ったことで、かつては数時間かかっていた月末の地獄が。今ではわずか数分の確認作業とエンターキーの一押しで完結するようになった。同じopenpyxlとwin32comの組み合わせは
まず、でも威力を発揮する。また、バックオフィス業務の自動化という観点では、
や
も組み合わせることで、月末の事務作業を一気に圧縮できるはずだ。手作業のコピペで消耗している時間があるなら。まず社員マスタのCSV整備から始めてほしい。
関連リンクとチェックリスト
著者はこうして解決の糸口を見つけた
著者も同じ境遇から始まりました。独学でここまで自動化した道のりを参考にしてみてください。
学習サービスとアンケート
このスキルを活かしてさらに前へ進むなら
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

