「誰が優先か」を決めずにAIに勤務表は組めない──医務・デイサービス・給食、3部門の勤務表自動化で学んだこと

介護DX
Photo by Towfiqu barbhuiya on Unsplash

「誰が優先か」を決めずにAIに勤務表は組めない──医務・デイサービス・給食、3部門の勤務表自動化で学んだこと

勤務表作成は、介護施設の管理業務の中でも地味に精神をすり減らす仕事だと思います。希望休、有給消化、委員会の予定、資格ごとの配置制限、連勤の上限。これを毎月手作業で組んでいる管理者は、たぶん全国にたくさんいるはずです。

自分の場合、医務部門、デイサービス2拠点(デイサービスA・B)、給食部門という3つの部門の勤務表を、生成AI(ClaudeとChatGPTを並行して使いながら)と一緒に段階的に自動化してきました。今回はその過程をまとめて振り返ります。結論から言うと、この作業で一番時間を使ったのはコードを書くことではなく、「誰を優先して配置するか」という現場の暗黙ルールを、そのまま言葉にすることでした。

共通の運用フロー:自動化は「全部お任せ」にしない

3部門とも、最終的な運用フローは同じ形に落ち着きました。

  1. 対象年月を指定して月次シートを自動生成する
  2. 希望休・有給・確定している勤務を先に手入力する
  3. 自動振り分けを実行し、空欄だけを埋める(手入力分は上書きしない)
  4. 担当者が確認・微調整する

ポイントは「入力済みの確定勤務は自動処理で絶対に上書きしない」という原則です。AIやマクロに全部を決めさせるのではなく、人が先に決めたことを尊重した上で、残りを埋めさせる。この設計にしたことで、現場の担当者が「勝手に書き換えられた」と感じることがなくなり、導入のハードルが大きく下がりました。

医務部門:7人の役職差をどうコード化するか

医務部門は7人体制です。主任・副主任・正社員・パート4名という構成で、使うシフトコードはM(モーニング)・A(A棟)・B(B棟)・F(フリー)・診察(水曜のみ)の5種類。

固めたルールの一部を挙げると、こうなります。

  • 1日あたりA・B・Mは最低1人ずつ確保する
  • Mは役職に関係なく全員に平等に割り振る(年功序列なし)
  • 診察は水曜のみ、主任と副主任で交互にローテーションする
  • オンコールも主任・副主任で平等に回し、休みの日は前日の担当がそのまま引き継ぐ(携帯持ち帰りの連続性ルール)
  • パートは固定の出勤日数、正社員は残りの枠を埋める

委員会ルールと有給管理も別シートとして追加しました。委員会は8つあり、第何週の何曜日に誰が出るかを管理して、該当日は自動的に「F」を割り振ります。

ここで一番苦労したのは、配置ロジックよりもシートの構造でした。原本シートと月別シートでヘッダー行の位置が1行ズレていて、気づかないまま数式を組むと当然ズレたまま動きます。さらに職員マスタから職員1名の行が丸ごと抜けていたことも判明しました。AIは「シートの構造が全部揃っている」前提でコードを組むので、実際のファイルの微妙な行ズレや抜けは、こちらが見つけて指摘するしかありません。

デイサービス:目標日数と実績のズレを自動で追う

デイサービスA・Bの月次勤務表では、職員マスタに「月間勤務日数目標」「曜日指定(任意)」「有給付与日数」「有給残日数(自動計算)」「今月の実勤務日数(自動計算)」という列を追加し、目標日数に届いていない人を優先的に空欄へ配置するロジックにしました。1日あたり各拠点で最低6人(看護師1人以上・運転者3人以上・一般職員1人以上)を確保しつつ、累計勤務日数が少ない人を優先して埋めていきます。

給食部門:一番「制約が細かい」勤務表だった

給食部門の勤務表は、3部門の中で一番条件が細かい勤務表でした。勤務種別ごとの必要人数に加え、正職員・パート・アルバイトそれぞれの勤務可能範囲、責任者の配置、個別の勤務制限。一般的な勤務表というより、複数の条件を同時に満たす組み合わせを探す「制約充足問題」として考える必要がありました。

そして給食部門で実際に起きたのが、「アルバイトの休みが月末に集中する」という問題です。月間の勤務日数自体は合っているのに、月の前半に勤務を入れすぎて、最終週が休みだらけになる。合計値は正しいのに、スケジュールとしては明らかに不自然な勤務表が出来上がってしまいました。

原因は、「必要勤務回数まで埋める」処理が月全体の分布をまったく評価していなかったことです。改善として、月全体の勤務密度と週ごとの勤務回数を見る、候補者が複数いる場合は勤務回数の少ない人を優先する、必要勤務数を早い段階で消化しすぎない、といった調整を入れました。この経験から学んだのは、回数の平等と配置の平等は別物だということです。

8連勤が発生した話:エラーが出なくても「失敗」はある

勤務表の自動化で一番印象に残っているのが、自動振り分け自体は正常に動いているのに、結果を見ると一部の職員に8連勤が発生していたという件です。VBAのエラーは一切出ていません。プログラムとしては「成功」です。でも、8連勤の勤務表は現場では絶対に使えません。

原因は、必要人数を満たすことが優先され、職員ごとの直近の連勤数を十分に評価していなかったことでした。改善として、最大連勤数をハード制約(絶対に破れない条件)にし、できるだけ3〜4連勤程度で回るよう調整し、特定の職員だけ連勤が多くならないよう公平性も評価するようにしました。月をまたぐ連勤を見落とさないよう、前月末の勤務状態も参照します。

プログラムがエラーを出さなくても、出力結果が現場で使えなければそれは失敗。この視点は、自動化に取り組むすべての人に共有したい教訓です。

夜勤は「1日」ではなく「シーケンス」で考える

夜勤のある勤務表では、夜勤→夜勤明け→休みという連続した流れをセットで扱う必要があります。1日単位で勤務を決めるロジックだと、この前後関係が簡単に崩れてしまいます。

そこで、勤務を単独のセルではなく「勤務シーケンス」として扱う考え方を導入しました。夜勤を配置するときは翌日・翌々日まで確認する。さらに月初は前月最終日の勤務が見えないという問題があるため、前月末の勤務状態を参照して翌月1日以降の判定へ引き継ぐ設計にしています。勤務表では「その日だけ正しい」では不十分で、月境界を含めた時系列の処理が必要になる、というのが実装してみて分かったことでした。

一番大事だった設計思想:「絶対条件」と「できれば条件」を分ける

3部門の勤務表を作ってきて、共通して一番効いた考え方がこれです。

絶対条件(破ると勤務表として成立しないもの):必要人数、勤務不可、夜勤後のルール、最大連勤、休職、確定休など。

優先条件(できるだけ守るもの):同じ勤務への偏り防止、月内の均等化、役職者を特定勤務から外す、同じ組み合わせを減らす、など。

すべてを絶対条件にすると、条件を満たせる候補者がいなくなって配置が破綻します。逆にすべてを緩くすると、現場で使えない勤務表になります。この優先順位の設計こそが、勤務表自動化の中心だったと今は思います。「条件を追加するほど賢くなる」とは限らない、というのは意外な発見でした。

実装で一番痛かった事故

最後に、開発中の事故も正直に書いておきます。

一番肝を冷やしたのは、職員マスタを読み込む処理で「職員番号」ではなく「氏名」列を誤って参照していたバグです。この状態でマクロを走らせると全員が問答無用で「休」になるという、一目で異常だと分かるレベルの不具合だったのが不幸中の幸いでした。

もう一つ地味に苦しんだのが、VBAのScripting.Dictionaryがエラー429を吐き続けた件です。原因を追うと、コード自体の問題ではなく、ファイルが「(2)」という重複コピーの状態で開かれていて、2つのVBAProjectの参照が競合していたのが真因でした。Excelを一度全部閉じて、対象の.xlsmファイル1つだけを開き直すという、拍子抜けするほど地味な解決策です。結局Dictionaryへの依存自体をやめて固定配列に書き直しました。

3部門やってみて分かったこと

医務・デイサービス・給食、扱うシフトの性質はまったく違いますが、共通していたのは「役職・資格・雇用区分による優先順位」を最初にどれだけ具体的に言葉にできるかで、出来上がりの精度が決まるという点でした。「平等に割り振って」の一言だけでは、AIはどの軸で平等にすればいいのか判断できません。

現場の勤務表作成者が持っている暗黙の判断基準を、AIとのやり取りを通じて一つずつ引っ張り出す。この作業自体が、実は一番価値のある業務の棚卸しだったと感じています。


AI介護士kaze運営者。介護福祉士・ケアマネジャー・社会福祉士の資格を持ち、介護現場歴18年。現場のリアルな課題感を起点に、AI×介護の実用性を探求・発信しています。


同じような業務改善の悩みを抱えている施設の方へ

ここで紹介した仕組みは、施設ごとの人員体制や運用ルールに合わせて設計し直す必要があります。「うちの施設でも近いことができないか」という方は、以下のフォームからお気軽にご相談ください。

お問い合わせはこちら
※「題名」欄に「業務改善について」のように一言添えていただけるとスムーズです。

コメント

タイトルとURLをコピーしました