top of page

​タグ一覧

配列処理(76)

シート・セル操作(37)

ファイル操作(33)

階層化フォーム(33)

開発事例(31)

図形操作(29)

設計思想(15)

ユーザーフォーム(12)

シフト表(12)

講座実施報告(12)

数学(11)

イベントプロシージャ(10)

開発効率化(10)

コード自動生成(10)

GAS(10)

技術解説(9)

ココナラ(9)

文字列操作(8)

Webアプリ(8)

Googleスプレッドシート(6)

その他(5)

アニメーション(5)

副業(5)

介護・福祉(5)

OneDrive(4)

条件付き書式(4)

イミディエイトウィンドウ(4)

クリップボード(4)

小説(3)

日報(3)

JavaScript(3)

PDF(3)

HTML(3)

公開ツール(3)

クラスモジュール(2)

コード解説(2)

パズル(2)

小ネタ(2)

フリーランス(2)

Antigravity(2)

カレンダー(2)

Enum(2)

医療(2)

LookerStudio(2)

リスキリング(2)

Discord(2)

Outlook(2)

デスクトップアプリ(2)

スクレイピング(1)

WebAPI(1)

PowerShell(1)

文書作成(1)

スプレッドシート(1)

経理(1)

超勉強会(1)

溶接ロボット(1)

楽天市場(1)

VBA不使用(1)

実行予約(1)

CAD(1)

給与計算(1)

QRコード(1)

python(1)

学校(1)

発注書(1)

【Excel VBA】シフト作成の「考える部分」を自動化する工夫4選|候補を消す割り当てと休憩の自動調整

8 時間前
読了時間: 5分

まずは動画で、4つの工夫の全体をご覧ください(動画内のデータはサンプルです)。

同じ動画は、YouTubeの「シフト作成の「考える部分」を自動化する工夫4選」でも2026年11月14日 12:00に公開します。

シフト作成で本当に時間がかかるのは、表に入力する作業より、「誰をどこに入れれば全部の条件を守れるか」を考える部分だと思います。

この記事では、飲食店向けに納品したシフト作成ツール(Excel VBA)から、その考える部分を自動化するために使った工夫を4つ紹介します。

この記事で紹介する4つの工夫。候補を消す割り当て、順番の工夫、休憩の自動調整、さかのぼって補う処理

コードは、考え方が伝わるように短く書き直したものです。納品したコードそのものではありません。

 

工夫1:数独のように、候補を消していく

守る条件は、休みの回数、5連勤まで、毎日の発注やレジなどの担当、その日の出勤人数と、いくつもあります。全部を同時に守りながら半月分を埋めるのは、人の手では大変です。

守る条件の例。休みの回数、連勤の上限、毎日の担当、出勤の人数

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

マスごとに候補を持つ。人×日×シフトの種類の3次元配列で管理する

割り当てるときは、まず仮に確定して、条件を守れるかを確かめます。判定が終わったら、確定前の状態に戻します。

1つ確定したら、条件を満たしてもう入れられなくなった候補を消します。たとえば、その日の発注の担当が決まれば、同じ日のほかの人の「発注」の候補は要らなくなります。

決めたら入らない候補を消す。候補が無くなったマスは失敗として記録する

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

実際の画面。ボタン1つで約30人の半月分が埋まる

 

 

工夫2:難しい担当から先に決める

候補を消す仕組みがあっても、割り当てる順番が悪いと行き詰まります。発注やレジ締めができる人は限られているので、普通の出勤を先に埋めると、担当できる人が残らないことがあります。

そこで、「発注 → 時間帯責任者 → オープン → レジ → 普通の出勤 → 休み」の順に決めるようにしました。できる人が少ない担当から先に決めて、自由度の高いものを最後に回す、という順番です。

できる人が少ない担当から先に割り当てる。出勤と休みは最後にまとめて決める

同じ担当の中では、これまでの回数が少ない人を優先します。ここで使っているのが、回数に0〜1の乱数を足してから並べ替える方法です。

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

回数の少ない人を優先し、同じ回数なら乱数で並べ替える

 

 

工夫3:休憩の直し方を全部試して選ぶ

このツールの休憩の規則は、6時間なら30分、7時間なら45分、8時間なら60分です。シフトは30分単位で組むので、45分の休憩は60分として扱っています。

勤務時間を30分動かすと必要な休憩も変わるので、一度組んだシフトでは、つじつまの合わない人が出てきます。

働く時間が変わると必要な休憩も変わる。規則に合わない例

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

直し方は3種類。休憩と出勤の入れ替え、出勤の延長、出退勤の短縮

どう直すかを条件分岐で書き分けるのではなく、30分ずつずらした候補を全部作って、規則の表と照らし合わせます。

候補がそろったら、規則に合うものの中から、人が足りない時間を減らせる直し方を優先して選びます。規則を表で持っているので、休憩の決まりが変わっても、処理の流れはそのままです。

候補を試して、規則に合い、人が足りない時間を減らせるものを選ぶ

時間帯ごとの配置そのものの考え方は、「シフトの自動配置は「足す」より「削る」」で解説しています。

 

 

工夫4:足りない時間は、日別の表までさかのぼる

時間帯ごとに組んでいくと、どうしても人が足りない時間が出ることがあります。時間別の表の中だけでは解決できず、日別の表で休みにした人に出てもらう必要があります。

そこで、時間別の処理から日別の表へさかのぼる処理を入れました。足りない担当を見つけたら、その日休みの人を、労働時間が少ない順に調べます。

足りない担当を見つけたら日別の表へさかのぼり、休みの人を労働時間が少ない順に調べる

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

守れる人だけを出勤に変え、その日の配置を作り直す

処理の骨組みは次のとおりです。発注、時間帯責任者、オープン、レジの順に調べて、誰かを出勤に変えたら先頭に戻ります。

やり直しの回数に上限(最大10回)を決めているのがポイントです。条件によってはどうしても埋まらない日があるので、上限に達したら無理に続けず、人の判断に任せます。

人が判断して足りない日を作り直す方法は、「足りない日だけ作り直す」で紹介しています。

 

ほかの業務への応用

ここで紹介した考え方は、シフト以外の割り当てにも使えると考えています。

  • 候補を持って消す:席の割り当て、当番表、面談や会議の日程調整

  • 難しいものから決める:時間割、配車、工程の割り当て

  • 直し方を全部試して選ぶ:残業の上限、運転の休憩など規則のある予定づくり

  • 前の段階へさかのぼる:発注の量や生産計画の見直し

 

動画で見る

それぞれの工夫は、YouTubeのショート動画でもご覧いただけます。

 

まとめ

  • マスごとに候補を持ち、確定するたびに入らなくなった候補を消すと、条件の多い割り当ても同じ手順で扱える

  • 割り当ての順番は、できる人が少ない担当から。回数に乱数を足せば、同じ回数の人の偏りを防げる

  • 直し方を条件分岐で書き分けず、候補を全部作って規則と照らし合わせると、処理が単純になる

  • 足りないときは前の段階へさかのぼって作り直す。ただし回数に上限を決める

条件が増えるほど、処理を「候補を作る」「確かめる」「選ぶ」に分けておくことが効いてきます。私の経験上、条件の多い業務をVBAで自動化するときの基本になる考え方の一つです。

その作業、自動化できるかもしれません

毎月くり返している集計・転記・帳票づくりに何日もかかっていませんか。
Excelはそのままで、面倒な部分だけを自動化できます。ご相談は無料です。

softex-celwareロゴ 透過 横長.png

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2026 softex-celware。Wix.com で作成されました。

bottom of page