シフト作成の基本

エクセルでシフト表を自動作成!関数とマクロで効率化する手順

「エクセルでシフトを作成しているが、毎月の入力や集計、人件費計算に時間がかかりすぎる」— これは、多くのシフト担当者が抱える共通の悩みです。

しかし、Excelは強力なツールであり、適切な関数VBA(マクロ)を組み合わせることで、シフト作成の多くの作業を自動化・効率化できます。これにより、残業の削減とミスの防止が可能です。

この記事では、すぐに使えるエクセルでのシフト自動作成テクニックと、その具体的な手順を解説します。さらに、Excelの限界を見極め、本当に全自動化が必要な場合の次のステップもご紹介します。

第1章:VBA不要!Excel関数で「半自動化」する3つの基本テクニック

エクセルのVBAマクロはプログラミング知識が必要ですが、多くの作業は基本的なExcel関数だけでも効率化できます。ここでは、マクロを組むことなく、集計やチェックのプロセスを自動化し、シフト作成時間を大幅に短縮する実用的なテクニックをご紹介します。

テクニック1:希望収集・集計を「COUNTIF関数」で自動化する

シフト作成の初期段階で最も時間がかかるのが、スタッフの提出した希望を集計し、必要な人員配置を満たしているかチェックする作業です。

  • 実現できること
    スタッフが入力した「〇」や「希望休」の数を、時間帯やスタッフごとに自動で集計し、過不足をチェックできます。

  • 手順

    1. スタッフに「希望入力シート」で「〇」を入力してもらいます。
    2. 「集計シート」の各時間帯のセルに、=COUNTIF(希望入力シートの範囲, "〇") の関数を設定します。
    3. これにより、時間帯別の必要人員(人件費予算に基づき設定)と集計結果を比較し、過不足が一目でわかる半自動の体制が完成します。
  • エクセル関数の例
    たとえば、「希望入力」シートのB5セルからB20セルに「〇」がいくつあるか数える場合、集計シートの該当セルに以下の関数を入力します。
    =COUNTIF('希望入力'!B5:B20, "〇")

テクニック2:人件費予算を超過しないか「SUMIF関数」でチェック

シフトが完成した後に人件費が予算オーバーしていないか確認するのは、大きな手戻りになる可能性があります。関数を使えば、シフト入力と同時にリアルタイムで人件費チェックが可能です。

  • 実現できること
    シフトを入力するたびに、人件費の合計をリアルタイムで計算し、設定した予算内に収まっているかチェックできます。

  • 手順

    1. スタッフの時給や労働時間を入力するマスタシートを用意します。
    2. シフト入力後の時間合計セルで、=SUMIF(スタッフ名, 該当スタッフ, 労働時間合計) * 時給 などの関数を使って、スタッフごとの人件費を算出します。
    3. さらに条件付き書式を組み合わせ、予算を超えたらセルが赤く表示されるように設定すれば、自動チェック機能が実現します。
  • エクセル関数の例
    たとえば、スタッフAさんの1か月の労働時間合計がC5セル、時給が「マスタ」シートのD5セルにあり、部門全体の人件費合計をE1セルに表示する場合、以下の関数で計算できます。 =SUM(C5:C20) * マスタ!D5 (SUM関数で全スタッフの労働時間を合計し、時給のマスタセルと乗算します。SUMIFは特定の条件で集計したい場合に有効です。)

テクニック3:法令違反やミスを「条件付き書式」で視覚化する

長時間労働や連続勤務は法令違反やスタッフの疲弊につながります。手動で全て確認するのは難しいため、Excelに自動で警告させましょう。

  • 実現できること
    連続勤務日数超過や休憩未付与といった「危険なシフト」を、Excelが自動で赤色などに色付けして担当者に警告します。

  • 手順

    1. 連続勤務チェック
      COUNTIF
      TODAY() などの関数を組み合わせた論理式を条件付き書式に設定し、特定の日数以上の連続入力があった場合に自動でセルをハイライトさせます。
    2. 休憩付与チェック
      6時間以上の勤務に対して休憩時間が入力されていない場合など、特定の条件を満たさないセルを警告表示させます。
  • エクセル関数の例(連続勤務チェック)
    スタッフごとの勤務時間が入力されている行(例:5行目)全体に条件付き書式を適用し、「5日以上の連続勤務」をチェックする数式を考えます。 勤務時間が入力されているセル(例:D5)を起点とし、勤務時間が入力されているか否かを「1日の勤務」と定義します。(例:「出勤」と入力されている場合) 条件付き書式で「数式を使用して、書式設定するセルを決定」を選択し、以下の数式を入力します。(ここではD5セルに適用し、行全体にコピーすることを想定)

    =COUNTIF(D5:H5, "出勤")>=5

    (意味:D5セルからH5セルまでの5日間の中に、「出勤」という文字列が5つ以上連続している場合に警告色を表示する。日付が変わるごとにこの条件がずれて適用されるように設定します。)

  • エクセル関数の例(休憩付与チェック)
    勤務時間を計算したセルがF5、休憩時間を入力したセルがG5だと仮定します。(勤務時間はシリアル値ではなく、時間の数値(例:6.5時間)で入力されている前提) 条件付き書式の設定で「数式を使用して、書式設定するセルを決定」を選択し、以下の数式を入力します。

    =AND(F5>=6, G5=0)

    (意味:「F5セル(勤務時間)が6時間以上」かつ「G5セル(休憩時間)が0である」場合に警告色を表示する。)

第2章:【上級編】VBAマクロで複雑なシフトを「完全自動作成」する手順

エクセル関数だけでは解決できない「Aさんの勤務後はBさんを休ませる」といった複雑な制約や、最適な組み合わせの探索には、VBAマクロが必要です。

1. VBAマクロの力:関数では難しい「制約条件の解決」

エクセル関数は基本的に「決まった値を計算する」ことしかできませんが、VBAマクロは「パターンを試行錯誤し、最適な結果を探す」ことが可能です。これにより、複数の制約条件(人件費、公平性、希望休など)をすべて満たせるシフト案を、自動で組み上げることができます。

2. VBAマクロ自動作成の実装ステップと手順

VBAマクロでシフト自動作成機能を実装する一般的な手順は以下の通りです。

  1. 制約条件の定義
    スタッフごとのスキル、希望休、最低/最大労働時間、法令ルールなど、すべての制約をコード上で明確に定義します。
  2. シフトパターンの生成
    シフトを埋めるためのコード(アルゴリズム)を記述します。ランダムなパターンを生成し、その都度制約条件を満たしているかチェックする処理が基本です。
  3. 最適解の探索と配置
    制約を最も多く満たす、あるいは人件費が最も低くなるパターンを探索(ゴールシーク機能の活用も含む)し、その結果をシートに自動で書き出します。

3. VBAマクロの注意点:メンテナンス負荷と習得コスト

VBAマクロによる自動作成は強力ですが、専門的なプログラミング知識が必要です。特にルールの変更やスタッフの増加があるたびにVBAマクロのメンテナンスが必要となり、シフト作成担当者にとっては新たな負担となる点に注意が必要です。

また、デバッグ(エラー修正)の難しさにも注意が必要です。シフト作成のロジックが複雑化すると、なぜシフトがうまく組めないのか、どのコードが誤動作しているのかを特定することが非常に困難になり、シフト作成担当者がそのエラーを自力で解決できないことが、運用がストップする最大の原因となります。

まとめ:エクセル自動化の限界と、次のステップ

エクセルでのシフト半自動化は、日々の作業時間を大幅に短縮しますが、以下の限界点に達した場合は、次のステップを検討するタイミングです。

  • 限界1:リアルタイム性の欠如
    スタッフからの急な変更や希望提出に、Excelシートの更新が間に合わない。

  • 限界2:メンテナンス負荷
    法令や時給、複雑なマクロの修正に追われ、シフト作成以外の時間が増加した。

  • 限界3:複雑な最適解の限界
    多数のスタッフや複雑な条件がある場合、Excelマクロでは最適な公平なシフトを導出できない。

エクセルでの自動化の限界を感じ始めたら、それはシフト作成システムへの移行を検討するサインです。シフティーなどの専用のシフト作成システムは、エクセルでは不可能な「複雑な制約」や「人件費予算」を数分でクリアし、担当者を「数式との格闘」から解放します。

数式メンテナンスの煩雑さから解放され、本来の業務に集中したいなら、シフティーの導入が最短の解決策です。

資料請求/お問い合わせはこちら