毎月のシフト表をExcelで手作りしていた店長が、PythonとopenpyxlでPDF一括出力できるようにした話

シフト公開後の無限ループ作業

シフト作成は、まるでパズルのようです。誰がどの時間帯に入れますか。人件費の予算内に収まりますか。休日の希望は重なっていませんか。

頭を抱えながら、Excelのセルを埋めていきます。ようやく完成が見えたとき、どっと疲労が押し寄せます。

しかし、店長の仕事はこれで終わりではありません。ここからが、地味で苦痛な単純作業の始まりです。完成した全体シフト表から、スタッフ一人ひとりの個別シフトを切り出します。

見やすく整えてPDF化する作業です。さらに、個別のLINEやメールで送付しなければなりません。スタッフが15名いるなら、同じ作業を15回繰り返すことになります。

具体的には、シートをコピーし、不要な行を削除して印刷範囲を調整します。ファイル名は「2026年05月_山田.pdf」と一つずつ入力します。これを手動で保存する作業です。

その後、それぞれの連絡先へ添付して送る工程が待っているのです。

深夜のPDF化と修正の無限ループ

毎月25日の深夜のことです。誰もいないバックオフィスで、私はPC画面を睨みつけていました。15人分のExcelシートをPDF化していました。

しかも、ひたすら「名前をつけて保存」の繰り返しです。「Aさん……保存、Bさん……保存」とつぶやきました。そうしながら、単調な作業を繰り返していました。

だんだん意識が遠のき、誰の分を保存したのか分からなくなることもありました。シフト完成の達成感も、この無機質なクリック作業で完全にすり減っていくのです。さらに悩ましい点があります。

シフトは「一度完成したら終わり」ではありません。公開した直後に、変更の申し出が容赦なく飛んでくるのです。そのたびに元のExcelを修正します。

該当スタッフのPDFを再出力します。そして、もう一度送り直す作業が発生していました。毎月、二重手間、三重手間の無限ループが待ち受けていたのです。

手作業コピペの個人情報漏洩

手作業の最大の敵は、疲労による集中力の低下です。毎月新しいExcelファイルを一から作る作業は大変です。そのため、多くの方が前月のファイルをコピーして使い回すのではないでしょうか。

この使い回しが、最悪のヒューマンエラーを引き起こすきっかけとなります。ファイルの中身を最新シフトへ書き換える場面です。このとき、名前や時給など固定情報の更新を忘れることがあります。

ある朝出勤すると、アルバイトの学生からLINEが届いていました。「送られてきたシフト、時給も名前も別の人になっています」とありました。その瞬間、私の血の気が引きました。

前月のファイルを使い回した際、名前と時給欄を上書きし忘れていたのです。これは個人情報漏洩です。他人の勤務日数と時給が丸見えになる事故でした。

急いで全員に「先ほどのファイルは破棄してください」と伝えました。冷や汗をかきながら、お詫びのメッセージを送ったのです。胃をキリキリさせながら、全ファイルを一から作り直しました。

手作業シフト表の個人情報リスク

シフト表には、出勤日だけでなく勤務時間数や時給も記載されます。そこから計算される見込み給与も書かれていることが多いです。これらは大切な個人情報です。

他人の給与事情が丸見えになる状況です。これでは、スタッフ間の信頼関係が簡単に壊れてしまいます。この出来事をきっかけに、精神論でミスを防ぐ限界を痛感しました。

人が手で触れる回数が増えるほど、事故の確率は跳ね上がるのです。Excelをコピーして名前を打ち換える作業は根絶しなければなりません。そうしないと、また同じミスを繰り返してしまうでしょう。

私はそう強く感じた出来事でした。

openpyxlでExcel自動化:データと色設定

手作業をなくすための第一歩は、データの管理と出力の分離です。まず、スタッフID、氏名、各日の出勤時間、退勤時間、シフト区分をまとめます。これを「シフトマスタ」としてCSV形式で整備しました。

次に、デザインが整った空のExcelテンプレートを用意します。そこへPythonでマスタデータを流し込みます。そんな仕組みを組みました。

ここで活躍するのが、Pythonライブラリの「openpyxl」です。これはExcelファイルを直接操作できます。プログラムの動きは非常にシンプルです。

CSVの行を1行ずつ読み込みます。テンプレートのコピーを開き、特定のセルに値を書き込んでいきます。例えば、「スタッフの名前をB3セルに入れたい」とします。

その場合は単純です。「ws[‘B3’].value = staff_name」と書けば対応できます。最初は見当もつきませんでした。

CSVのデータを、どうやって狙ったセルへ入れるのか分からなかったからです。しかし、実行後にExcelを開いた瞬間でした。B3に本当に名前が入っていて感動しました。

まるで目に見えないアシスタントが入力してくれたような感覚でした。

openpyxlセル色分けの落とし穴

さらに視認性を上げるため、セルの色分けも追加しました。シフト区分ごとに色を変える処理です。openpyxlのPatternFill機能を使えば、カラーコーディングを自動化できます。

例えば、早番は青、遅番はオレンジ、休日はグレーといった色分けです。ただし、ここには落とし穴がありました。初心者がつまずきやすい「色の指定方法」です。

直感的に「red」や「blue」と書きたくなるかもしれません。しかし、それだけではうまくいかないのです。openpyxlではaRGB(アルファ値+RGB)の16進数文字列が求められます。

単なる赤色でも「FFFF0000」と書く必要がありました。

aRGB指定でつまずいた点

先頭の「FF」は透明度を示しています。これを忘れて「FF0000」とだけ書くと困りました。エラーが出たり、色が反映されなかったりしたのです。

そのたびに、かなり悩まされました。もしopenpyxlを体系的に学びたい場合は、実務向けのPython解説書を一冊置くと整理しやすいです。さらに実践で身につけたい場合は、マンツーマン指導型の学習サービスも選択肢に入ります。

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

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

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

win32comでのExcel PDF化と安全保存

openpyxlを使えば、個別スタッフのデータが入ったExcelファイルが瞬時に15個生成されます。しかし、これをそのまま送るわけにはいきません。レイアウト崩れを防ぐためです。

また、内容を勝手に書き換えられないようにするためにも、PDF化が必須となります。

残念ながら、openpyxl単体にはExcelをPDFとして出力する機能はありません。そこで登場するのが、「win32com」というライブラリです。これはWindowsのCOM(Component Object Model)の仕組みを利用しています。

外部からExcelアプリそのものを遠隔操作できるのです。「win32com.client.Dispatch(‘Excel.Application’)」と記述します。すると、Pythonから本物のExcelをバックグラウンドで立ち上げられます。

生成した個別Excelファイルを一つずつ開きます。そして、「ExportAsFixedFormat」メソッドを呼び出します。これにより、無事にPDFとして保存できるようになります。

誤送付・上書きを防ぐファイル保存ルール

保存先のフォルダ構成にも工夫を凝らしました。出力したPDFが1つのフォルダに散乱すると危険です。送付時に相手を間違えるリスクがあるからです。

そこで、スタッフIDと氏名を組み合わせた専用フォルダを作ります。例として、0001_山田太郎のような形です。このフォルダはos.makedirsで自動作成させます。

その中に年月付きファイル名で保存するようにしました。たとえば「2026年05月_0003_田中花子_シフト表.pdf」です。また、保存前には同名ファイルの存在をos.path.existsで確認しています。

これは、意図しない上書きを防ぐための一手間です。この手間を惜しむと、過去のシフトデータを一瞬で吹き飛ばす事故につながってしまうからです。

PDF再生成、差分チェックで効率化

こうしてPDFの一括出力が完成しました。数日間の平穏が訪れます。しかし、公開から3日後、お決まりのシフト変更依頼が舞い込んできました。

CSVマスタの一部を書き換え、スクリプトを実行しました。変更があったのはたった2人だけです。ところが、スクリプトは変更が一切ない残り13人分のPDFまで全て再生成してしまいました。

結果として、ファイル更新日時が全員分同じになります。どれが新しくなったPDFなのか、一目で判別できなくなってしまったのです。

「違う、私が欲しいのは変わった人の分だけだ」と頭を抱えました。結局、15個の新しいPDFを一つずつ開いて、古いシフト表と見比べる羽目になったのです。これは本末転倒な状況でした。

自動化したはずなのに、確認作業が増えてしまったからです。

差分チェック安全更新

この悲劇を二度と起こさないためです。「差分チェック(diff)機能」をスクリプトに組み込みました。仕組みは次の通りです。Pythonのcsvモジュールで、変更前後のCSVを読み込みます。

それぞれのデータをスタッフIDをキーにした辞書へ入れました。そして、行ごとに内容を比較するロジックを書きます。データに差異が見つかったスタッフだけをリストアップするのです。

まずはターミナル画面に変更内容を表示させます。誰のシフトが何日から何日に変わったのか、画面上で確認できるようにしました。「Y」キーを押したときだけ、該当するスタッフのPDFのみを再生成します。

このドライラン形式の安全網を設けたことで、誤出力のリスクはかなり減りました。

Pythonによるシフト表自動化

毎月膨大な時間を奪っていたシフト表の切り出しとPDF化作業です。これはPythonの力を借りることで、かなり仕組み化できます。道のりは、大きく3つのステップにまとまりました。

ステップ1は、データの分離と流し込みです。複雑なExcelを直接いじるのをやめ、シフト情報をCSVマスタとして整備します。そのデータをopenpyxlでテンプレートへ流し込みます。

関数やデザインは、あらかじめExcel側で整えておきました。ステップ2は、PDFへの変換と整理です。win32comでバックグラウンドのExcelを動かし、PDF化します。

そして、スタッフIDフォルダに年月付きのファイル名で振り分けます。ステップ3は、現場の運用に耐える安全網づくりです。変更前後のマスタを比較し、差分が出たスタッフだけを再出力します。

変更内容を事前に画面で確認してから実行するドライラン設計にしました。これにより、盲目的なシステム実行による二次災害を防ぎやすくなりました。

月末シフト配布とバックオフィス業務の自動化

この3つの仕組みが噛み合い、月末のシフト配布作業は変わりました。数分の確認とエンターキーの一押しで完結するようになったのです。かつては深夜残業を強いられていた作業でした。

同じopenpyxlとwin32comの組み合わせは応用が利きます。請求書のPDF一括出力給与明細のPDF一括出力でも使いやすいです。また、バックオフィス業務の自動化という観点もあります。

経費精算のGAS自動化有給残日数の自動管理を組み合わせる方法です。これにより、月末の事務作業を一気に圧縮できるはずです。もし手作業のコピペで消耗しているなら。まずはシフトマスタのCSV整備から始めてみてはいかがでしょうか。

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

無料プレゼント

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

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

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

¥980 ミニキット

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

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

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

関連書籍

Python業務自動化関連書籍を、手元で見返せる形にしておきたい場合

Pythonやデータ処理の自動化は、作りながら同じ基礎を何度も確認する場面が多いです。手元で見返せる本があると、調べ直しの時間を減らしやすいです。

Python業務自動化関連書籍をAmazonで探す

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

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

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

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

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

1問だけ回答する