月末勤怠を壊すExcelの構造欠陥
月末の金曜日、午後4時。経理部から内線が入ります。「〇〇拠点の勤怠データ、合計勤務時間が合わないみたいで…」。その瞬間、胃がずしりと重くなる感覚を覚えます。またか、という思いです。時計の針が午後5時を指す頃には、各拠点の人事担当からの問い合わせがチャットに溜まり、画面右下には通知がポップアップし続けます。次第に目の焦点が合わなくなり、蛍光灯の光がやけに目に染みるような、そんな経験をしました。
これは、拠点ごとに異なる休日カレンダーを、一枚の巨大なExcelシートで管理しようとした末路です。本社は土日祝休み、A工場は土曜も稼働する週がある、B営業所は地域のお祭りの日を特別休日にしているなど、条件は様々です。これらを天才的な誰かが作ったVLOOKUPとIF関数がネストした長大な数式で捌いていましたが、その製作者はもういません。ブラックボックス化したExcelは、誰にも触れられない聖域と化していたのです。
単一ロジックの無理、集計作業の構造的破綻
まず、なぜこれほど単純なはずの集計作業が毎月のように破綻するのか、考えてみました。原因は入力ミスや担当者の不注意だけではありません。もっと根深い、構造的な欠陥があったのです。全ての拠点の休日ルールを、一本の数式や一枚のシートといった「単一のロジック」で無理やり処理しようとしたこと。それが全ての元凶でした。例外に次ぐ例外を重ねた結果、もはや誰も全体を把握できなくなり、小さな修正が予期せぬ場所でエラーを引き起こす。月末の混乱は、起こるべくして起きていたのです。

休日の3層定義で勤怠管理を再建
私たちが陥っていた罠は、「休日」という言葉で全ての休みを一緒くたに扱っていたことにあります。しかし、それぞれの休みは性質が全く異なります。この違いを無視した設計が、あらゆる計算を狂わせていたのです。解決の糸口は、休日をその性質に応じて3つのレイヤーに分解し、定義し直すことでした。
第一のレイヤーは「祝日」です。これは国民の祝日に関する法律で定められた、全国共通の休日ですね。個別の企業の都合では変わらない、最も基本的なカレンダーの構成要素です。
次に、第二のレイヤーが「会社休日」です。創立記念日や夏季・冬季の特別休暇など、会社全体で一律に定められた休日のことを指します。これは全社員に適用されるルールであり、祝日とは別に管理する必要があります。
そして最も厄介なのが、第三のレイヤー、「拠点独自休日」です。工場のシフト制に伴う特定の休みや、営業所がある地域だけの休日、あるいは特定の職種だけに適用される休暇などが含まれます。この変動要素こそが、勤怠計算を複雑化させる主犯格でした。
休日定義の混乱、基本無視と分類
以前のExcelでは、これら3つが祝日リストのシートに無秩序に混在していました。ある拠点の特別休日を祝日リストに追加した結果、その日付が他の全拠点で休日扱いになり、総労働時間が想定より大幅に少なく計算される大惨事を招いたこともあります。勤怠管理の実務では、祝日設定、所属や拠点単位の休日設定、そしてそれらの自動更新設定を分離して扱うのが一般的です。私たちは、その基本を完全に無視していました。
一方で、先にツールを導入したり、自動化スクリプトを書いたりする前に、まずこの「休日の定義」を整理し、関係者全員で合意する必要がありました。どんなに高機能なシステムを導入しても、土台となるデータの構造が歪んでいては、まともな結果は得られません。泥臭い作業ではありますが、この分類こそが再建の第一歩だったのです。
Excel堅牢化、カレンダーマスタ
Pythonを導入するまでもない、あるいは予算が下りないという状況でも、Excel運用のまま堅牢性を高める方法はあります。それは「カレンダーマスタ」という考え方の導入です。全てのロジックを関数に詰め込むのではなく、変動する要素をデータとして切り出します。
具体的には、新しいシートを1枚作り、「カレンダーマスタ」と名付けます。A列に1年分の日付を並べ、B列に曜日を入れます。ここまでは誰でも行いますが、重要なのはここからです。C列に「祝日フラグ」、D列に「会社休日フラグ」を立てる列を用意します。祝日なら1、そうでなければ0、といった具合です。

拠点別休日マスタで運用と保守をシンプル化
さらに、E列以降に「本社休日フラグ」「A工場休日フラグ」「B営業所休日フラグ」といったように、拠点ごとの休日フラグ列を追加していきます。こうすることで、「この日にこの拠点は休みか?」という判定が、複雑なIF文ではなく、マスタシートの特定のセルを見るだけで完結するようになります。非エンジニアが運用を続けるなら、コードを直接修正するより、このマスタファイル(ExcelやCSV)をメンテナンスする方が遥かに安全で、保守性も高まります。
勤怠データを集計するシート側では、`SUMIFS`や`COUNTIFS`、あるいは`XLOOKUP`といった関数を使って、このマスタを参照します。例えば、A工場の特定の月の勤務日数を計算したい場合、「カレンダーマスタのA工場休日フラグが0である」という条件を追加するだけで済みます。数式がシンプルになり、可読性も劇的に向上します。

VBA・Pythonをもっと本格的に学ぶなら
VBAやPythonを実務レベルまで引き上げたい方には「侍エンジニア」がおすすめです。マンツーマン指導・オーダーメイドカリキュラムで、文系出身でも挫折しにくい環境が整っています。無料カウンセリングだけでも学習ロードマップが明確になります。
悪循環を断つカレンダーマスタ化
もちろん、毎年のマスタ更新は手作業になります。ですが、年に一度、全拠点のカレンダー情報を集約してこのマスタを作る手間は、毎月発生する原因不明のエラー調査と修正作業に比べれば、比較にならないほど小さなコストです。拠点別の休日差分を同一ロジックで処理しようとすることが、締め日前の膨大な差分修正と再計算を生んでいたのですから、このマスタ化は、その悪循環を断ち切るための現実的で効果的な一歩となります。
自動化の肝は「検証ロジック」
Excelでのマスタ運用が軌道に乗れば、次はいよいよPythonによる自動化が視野に入ります。Excelで確立した「休日定義の分離」という設計思想は、Pythonスクリプトを書く際にもそのまま活かすことができ、むしろその恩恵を最大限に引き出せるはずです。
日本の祝日判定には、`jpholiday`という非常に便利なライブラリが存在します。PyPIで継続的に更新されており、数行のコードで特定の日付が祝日かどうかを判定できます。これで、まず「祝日レイヤー」の判定は自動化が完了します。

しかし、これだけでは不十分です。祝日以外の「会社休日」と「拠点独自休日」は、別途ExcelやCSVファイルで作成したカレンダーマスタを`pandas`で読み込み、祝日情報とマージして最終的な勤務日カレンダーを生成する必要があります。
品質保証を自動化する検証ロジック
さらに、ここで絶対に忘れてはならないのが、「検証ロジック」を最初からスクリプトに組み込むことです。データを取り込み、集計して結果を出力するだけでは不十分です。出力された結果が本当に正しいのか、機械的にチェックする工程を挟むのです。
例えば、集計が完了した後に、各拠点・各個人の月間総労働時間があるべき範囲(例えば140時間〜190時間など)に収まっているかチェックしたり、休日と定義された日に出勤記録が残っていないか、あるいは平日なのに勤務記録が全くない従業員がいないかといった異常値を検出するコードを追加します。
この締め日前チェックを自動化することで、人的ミスやデータの不整合を早期に発見し、手戻りを劇的に減らすことができます。エラーが見つかれば結果ファイルを出力せずに、どこがおかしいかを具体的に示す警告メッセージを出すようにしておきます。集計処理の高速化だけでなく、この「品質保証」の工程まで自動化することこそが、真の業務改善と言えるのではないでしょうか。

例外を表に出す設計とデータ管理
拠点ごとに異なる休日ルールに振り回され、毎月の勤怠集計が破綻していた日々。そこから私たちが学んだ最も重要な教訓は、ツールやテクニック以前の問題でした。それは、「例外を隠蔽せず、全て表に出す設計」を最初にやるべきだ、ということです。
複雑なIF関数やVBAマクロは、一見すると賢い解決策に見えますが、それは例外的なルールをブラックボックスの中に隠蔽しているに過ぎません。仕様変更や担当者の交代があれば、途端に誰も触れない技術的負債と化してしまいます。そうではなく、祝日や会社休日、拠点独自休日といったルールを「カレンダーマスタ」という誰の目にも見えるデータとして切り出す。この単純な分離が、全てを変えてくれました。
自動化の本質:設計思想と価値
この設計思想は、ExcelでもPythonでも、あるいは高価な勤怠管理システムを導入する場合でも変わりません。変動要素をデータとして管理し、ロジックは可能な限りシンプルに保つことが大切です。例外が発生すればコードを書き換えるのではなく、マスタデータを修正すれば済む。この原則を守るだけで、システムの保守性は劇的に向上し、属人化を防ぐことができます。
次に、自動化のプロジェクトを評価する際、私たちはつい「処理時間が何時間から何秒に短縮されたか」という点に目を奪われがちです。しかし、本当に価値があるのはそこではありません。差し戻しの件数や再集計の回数がどれだけ減ったか、締め日前の問い合わせ電話がどれだけ鳴らなくなったか、そうした「手戻りコスト」の削減こそが、本質的な効果測定の指標となります。
自動化へ向けた業務の整理と設計
もしあなたが今、複雑なExcelファイルと格闘しているなら、いきなりPythonを学ぼうとする前に、一度立ち止まってみてください。その業務に潜む「例外」は何か、何度も手修正している箇所はどこか。まずはそれを紙に書き出し、分類し、管理可能なデータとして整理することから始めてみましょう。自動化という華やかなゴールを目指す前に、この泥臭くも重要な設計作業に取り組むことこそが、未来の自分を助ける最短ルートなのです。
関連リンクとチェックリスト
無料プレゼント
Excel業務を自動化する前に確認するチェックリスト(PDF)
自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。
¥980 ミニキット
コピペで動かせる3スクリプト+自動化チェックリスト
最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。
著者はこうして解決の糸口を見つけた
著者も同じ境遇から始まりました。独学でここまで自動化した道のりを参考にしてみてください。
関連書籍
業務効率化関連書籍を、手元で見返せる形にしておきたい場合
業務効率化は、いきなり大きく変えるより、手元の作業を1つずつ減らすほうが続けやすいです。考え方を見返せる本があると、次の一手を選びやすくなります。
学習サービスとアンケート
このスキルを活かしてさらに前へ進むなら
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

