【Excel VBA】シフトの自動配置は「足す」より「削る」|30分ごとの必要人数を満たす作り方
まずは動画で、考え方と実際の画面をご覧ください(動画内のデータはサンプルです)。
30分ごとの必要人数を見ながら、シフトを手で埋めていませんか。
この記事では、飲食店向けに納品したシフト作成ツール(Excel VBA)で使った「時間帯別の自動配置」の考え方を紹介します。空いた時間に1人ずつ足していくのではなく、まず全員を希望の時間いっぱいに並べてから、条件を守れる範囲で勤務の端を削っていく、という作り方です。
このシリーズでは、同じツールで使った工夫を6回に分けて紹介します。今回はその1回目です。
飲食店のシフトは30分ごとに必要人数が変わる
飲食店のシフトは、30分ごとに必要な人数が変わります。開店直後は少なく、昼から夕方にかけて増え、閉店前にまた減る、という形です。
さらに、人数さえ足りればよいわけではありません。発注やレジ締めができる人も、その時間にいなければなりません。

このツールでは、1日を30分のコマに分け、コマごとの必要人数と、担当(発注・オープン・レジ締め・時間帯責任者)が必要な時間を表にしておきます。自動配置は、この表を満たすように出勤者と勤務時間を決める処理です。
空いた時間に1人ずつ足していく作り方は行き詰まりやすい
自動配置を作ろうとすると、まず思いつくのは「人が足りない時間に、1人ずつ足していく」作り方だと思います。
ところがこの作り方は、条件が増えるほど行き詰まります。先に入れた人に時間が偏ったり、気づくと発注の時間に担当できる人がいなかったりして、組み合わせを何度もやり直すことになります。

逆に考える:全員を並べてから、勤務の端を削っていく
そこで、逆に考えました。手順は次の3つです。
出勤する人を、希望の時間いっぱいに並べる
長く働く人から順に、勤務の端の30分を外してみる
必要人数や担当の条件を守れるなら外し、守れなければ戻す

最初に希望の時間いっぱいに並べるので、出発点では人数は多めになります。そこから余っている分を削っていくので、「足りない時間をどう埋めるか」を考える必要がなく、「この30分を外しても条件を守れるか」だけを確かめればよくなります。
この作り方のポイントは次のとおりです。
外すのは勤務の端(始まりか終わり)の30分だけ。途中からは外さないので、勤務の途中に穴が空かない
長く働く人から順に削るので、勤務時間の長い人から先に短くなっていく
1コマ外すたびに、必要人数と担当の条件を確かめる。守れなければ戻すだけなので、判定が単純になる
最後に、人数に余裕のある時間帯へ休憩を入れる
勤務時間が決まったら、仕上げに休憩を入れます。労働時間に応じて休憩の長さを決め、人数に余裕のある時間帯に入れていきます。

休憩を最後に回すことで、勤務時間を削る段階では休憩のことを考えずに済み、処理を分けて組み立てられます。
実際の画面:ボタン1つで半月分を作成
実際のツールでは、ボタン1つで半月分(15日分)のシフトを作ります。録画で測ったところ、15日分の作成にかかった時間は約8秒でした。

一括作成した直後の画面です。上の行に30分ごとの必要人数と設定人数、その下に発注・時間帯責任者・オープン・レジの担当が入る時間が並び、各スタッフの行には勤務する30分のコマと休憩が入ります(画面のデータはサンプルです)。

応用:時間で区切る割り当てにそのまま使える
「全部並べてから、条件を守れる範囲で端から削る」という考え方は、シフト以外でも、時間で区切って何かを割り当てる業務に使えると考えています。
配車:車と運転手を、時間帯ごとに割り当てる
会議室の予約:部屋と人数・設備の条件を満たす枠を決める
工場・倉庫の人員配置:工程ごとに、必要な人数とスキルをそろえる

動画で見る
この回の内容は、YouTubeのショート動画でもご覧いただけます。
半月分のシフトが約8秒|足さずに削る自動配置(ショート)(2026年11月18日公開)
シフト表ツールの工夫6選(6つの工夫をまとめた本編)(2026年11月17日公開)
まとめ
飲食店のシフトは、30分ごとの必要人数に加えて、発注やレジ締めなどの担当者もそろえる必要がある
空いた時間に1人ずつ足していく作り方は、条件が増えるほど行き詰まりやすい
出勤する人を希望の時間いっぱいに並べ、長く働く人から勤務の端の30分を外していく。条件を守れなければ戻す
端からしか外さないので勤務の途中に穴が空かず、休憩は最後に余裕のある時間帯へ入れる
実際のツールでは、半月分(15日分)を約8秒で作成した(録画での実測)
足すのが難しい問題は、いったん多めに並べてから削ると、確かめることが単純になる場合があります。私の経験上、条件の多い割り当てを組むときに役立つ考え方の一つです。



