【Excel VBA】シフト作成の「考える部分」を自動化する工夫4選|候補を消す割り当てと休憩の自動調整
まずは動画で、4つの工夫の全体をご覧ください(動画内のデータはサンプルです)。
同じ動画は、YouTubeの「シフト作成の「考える部分」を自動化する工夫4選」でも2026年11月14日 12:00に公開します。
シフト作成で本当に時間がかかるのは、表に入力する作業より、「誰をどこに入れれば全部の条件を守れるか」を考える部分だと思います。
この記事では、飲食店向けに納品したシフト作成ツール(Excel VBA)から、その考える部分を自動化するために使った工夫を4つ紹介します。

コードは、考え方が伝わるように短く書き直したものです。納品したコードそのものではありません。
工夫1:数独のように、候補を消していく
守る条件は、休みの回数、5連勤まで、毎日の発注やレジなどの担当、その日の出勤人数と、いくつもあります。全部を同時に守りながら半月分を埋めるのは、人の手では大変です。

そこで、数独を解くときと同じ考え方を使いました。マスごとに「入れられるシフトの候補」を全部持っておきます。データは「人 × 日 × シフトの種類」の3次元配列で、候補なら1を入れておきます。

割り当てるときは、まず仮に確定して、条件を守れるかを確かめます。判定が終わったら、確定前の状態に戻します。
1つ確定したら、条件を満たしてもう入れられなくなった候補を消します。たとえば、その日の発注の担当が決まれば、同じ日のほかの人の「発注」の候補は要らなくなります。

候補が無くなったマスは、処理を止めずに失敗の記録へ残します。どうしても条件を満たせない日があっても、最後に「どこが埋まらなかったか」が分かるので、そこだけ人が判断できます。

工夫2:難しい担当から先に決める
候補を消す仕組みがあっても、割り当てる順番が悪いと行き詰まります。発注やレジ締めができる人は限られているので、普通の出勤を先に埋めると、担当できる人が残らないことがあります。
そこで、「発注 → 時間帯責任者 → オープン → レジ → 普通の出勤 → 休み」の順に決めるようにしました。できる人が少ない担当から先に決めて、自由度の高いものを最後に回す、という順番です。

同じ担当の中では、これまでの回数が少ない人を優先します。ここで使っているのが、回数に0〜1の乱数を足してから並べ替える方法です。
回数は整数なので、1未満の乱数を足しても「回数が少ない人が先」という順番は崩れません。同じ回数の人の間だけが、実行のたびに入れ替わります。これで、いつも名簿の上の人から選ばれる偏りを防げます。

工夫3:休憩の直し方を全部試して選ぶ
このツールの休憩の規則は、6時間なら30分、7時間なら45分、8時間なら60分です。シフトは30分単位で組むので、45分の休憩は60分として扱っています。
勤務時間を30分動かすと必要な休憩も変わるので、一度組んだシフトでは、つじつまの合わない人が出てきます。

直し方は、休憩と出勤を入れ替える、出勤を延ばす、出退勤を短くする、の3種類を用意しました。

どう直すかを条件分岐で書き分けるのではなく、30分ずつずらした候補を全部作って、規則の表と照らし合わせます。
候補がそろったら、規則に合うものの中から、人が足りない時間を減らせる直し方を優先して選びます。規則を表で持っているので、休憩の決まりが変わっても、処理の流れはそのままです。

時間帯ごとの配置そのものの考え方は、「シフトの自動配置は「足す」より「削る」」で解説しています。
工夫4:足りない時間は、日別の表までさかのぼる
時間帯ごとに組んでいくと、どうしても人が足りない時間が出ることがあります。時間別の表の中だけでは解決できず、日別の表で休みにした人に出てもらう必要があります。
そこで、時間別の処理から日別の表へさかのぼる処理を入れました。足りない担当を見つけたら、その日休みの人を、労働時間が少ない順に調べます。

休みの回数、連勤、本人の希望、年間の上限を守れる人だけを出勤に変えます。変えたら、その日の時間の配置を最初から作り直します。

処理の骨組みは次のとおりです。発注、時間帯責任者、オープン、レジの順に調べて、誰かを出勤に変えたら先頭に戻ります。
やり直しの回数に上限(最大10回)を決めているのがポイントです。条件によってはどうしても埋まらない日があるので、上限に達したら無理に続けず、人の判断に任せます。
人が判断して足りない日を作り直す方法は、「足りない日だけ作り直す」で紹介しています。
ほかの業務への応用
ここで紹介した考え方は、シフト以外の割り当てにも使えると考えています。
候補を持って消す:席の割り当て、当番表、面談や会議の日程調整
難しいものから決める:時間割、配車、工程の割り当て
直し方を全部試して選ぶ:残業の上限、運転の休憩など規則のある予定づくり
前の段階へさかのぼる:発注の量や生産計画の見直し
動画で見る
それぞれの工夫は、YouTubeのショート動画でもご覧いただけます。
条件だらけのシフトを数独のように自動で解く(2026年11月25日公開)
担当が足りない日をなくす割り当ての順番(2026年11月27日公開)
休憩の規則に合わせてシフトを自動で直す(2026年11月28日公開)
人が足りない時間に誰を呼ぶかまで自動で決める(2026年11月29日公開)
まとめ
マスごとに候補を持ち、確定するたびに入らなくなった候補を消すと、条件の多い割り当ても同じ手順で扱える
割り当ての順番は、できる人が少ない担当から。回数に乱数を足せば、同じ回数の人の偏りを防げる
直し方を条件分岐で書き分けず、候補を全部作って規則と照らし合わせると、処理が単純になる
足りないときは前の段階へさかのぼって作り直す。ただし回数に上限を決める
条件が増えるほど、処理を「候補を作る」「確かめる」「選ぶ」に分けておくことが効いてきます。私の経験上、条件の多い業務をVBAで自動化するときの基本になる考え方の一つです。



