【Excel VBA】シフト表ツールの仕組みの工夫3選|一括処理・ボタンの自動配置・人時売上の集計
まずは動画で、3つの工夫の全体をご覧ください(動画内のデータはサンプルで、金額などの数字は説明用の例です)。
同じ動画は、YouTubeでも2026年12月3日 12:00に公開します。
業務で使うExcelツールは、中心の処理のほかに、「操作をまとめる」「入力を楽にする」「結果を数字で確かめる」といった周りの仕組みで使いやすさが決まると感じています。
この記事では、飲食店向けに納品したシフト作成ツール(Excel VBA)から、そうした仕組みの工夫を3つ紹介します。

コードは、考え方が伝わるように短く書き直したものです。納品したコードそのものではありません。
工夫1:店の数だけの手順をボタン1つにまとめる
複数店舗のシフトでは、希望の反映、日別の割り当て、時間別の配置という手順を、店の数だけ繰り返す必要があります。

そこで、手順を1つのボタンにまとめました。シートを店の数だけ用意し、前の期間のシフトを読み込んでから、設定された店の処理順に繰り返します。

大事なのは「途中の止めどころ」です。複数の店を掛け持ちする人がいるので、途中の店で全員の割り当てを決めきると、次の店で使える人がいなくなります。
途中の店では、残りの人を空けておきます。最後の店の処理で初めて、正社員は残りを出勤に、それ以外は休みに決めきります。処理の順番と、どこで決めきるかを設計しておくことで、単純なループでは解決できない部分をまとめられます。

ボタン1つの中で前の期間のシフトも読み込みます。読み込みの仕組みは「前の期間を名前で読み込む」で紹介しています。店どうしのシートのつなぎ方は、「複数店舗のシフトをシートでつなぐ」で解説しています。
工夫2:選択肢の一覧からボタンを自動で並べる
ユーザーフォームのボタンを手で作ると、選択肢が変わるたびに作り直しになります。ボタンの数だけクリックの処理も必要です。

そこで、選択肢の一覧から、ボタンを実行時に作るようにしました。縦の個数を決めておくと、横の個数は計算で出ます。
たとえば選択肢が8個で縦が3個なら、(8-1)÷3を切り捨てて2、そこに1を足して横は3個です。

ボタンを増やしたときに問題になるのがクリックの処理です。ここでは、WithEventsを持つクラスを1つ作り、ボタン1個につきこのクラスを1個ずつ割り当てます。
フォーム側では、作ったクラスを配列に入れて持ち続けます。プロシージャの中の変数にしか持っていないと、処理が終わった時点でクラスが消えて、クリックに反応しなくなるからです。
クリックの処理はクラスの中の1か所だけなので、ボタンが何個に増えても、処理を書き足す必要はありません。

実際のツールでは、セルをダブルクリックするとその場でボタンが出て、選ぶだけで入力できます。同じ作り方で、日付のボタンを並べるカレンダーの入力画面も作っています。

選べる時刻だけをボタンで出す使い方は、「希望入力を速くする工夫」で紹介しています。
工夫3:30分1行の記録から、平均時給と人時売上を出す
シフトが変わるたびに、店ごとの平均時給や人時売上を計算し直すのは大変です。
このツールでは、割り当ての結果を「誰が・どの店で・どの30分に」働くかの記録として、30分=1行で持っています。集計は、この記録から店ごとに絞り込んで計算するだけです。

計算式は次のとおりです。
平均時給 = 時給×労働時間の合計 ÷ アルバイトの労働時間
人時売上 = 想定売上 ÷ 全員の労働時間
希望の達成率 = 労働時間 ÷ 希望時間
平均時給は、アルバイトだけで計算しています。人時売上は全員の労働時間で割るので、分母にする労働時間が2つの指標で違います。この切り分けも、1人1行の表ではなく明細の記録を持っているから簡単にできます。

ボタン1つで店舗ごとの数字が確かめられるので、シフトを直しながら数字を見て判断できます。

30分1行の記録の持ち方は、「ブックをまたぐ年間集計」でも紹介しています。
ほかの業務への応用
手順の順番と止めどころを決める:月次の締め作業、部署ごとの帳票
一覧からボタンを並べる:カレンダー、担当者の選択、商品や工程の選択
記録を1行ずつ持つ:部門別の原価、機械や設備の稼働率、案件ごとの工数
動画で見る
それぞれの工夫は、YouTubeのショート動画でもご覧いただけます。
店の数だけの手順をボタン1つにまとめる(2026年12月4日公開)
選択肢の一覧からボタンを自動で並べる(2026年12月5日公開)
平均時給と人時売上をシフトから自動で出す(2026年12月6日公開)
まとめ
一括処理は、手順をつなぐだけでなく「途中の店では残し、最後の店で決めきる」という止めどころまで設計する
ボタンは一覧から実行時に作り、WithEventsを持つ1つのクラスでクリックを受ける。クラスはフォームの配列に持ち続ける
割り当ての記録を30分1行で持っておくと、平均時給や人時売上など、分母の違う集計も簡単に切り替えられる
中心の処理だけでなく、周りの仕組みまで作り込むと、ツールが現場で使い続けられやすくなります。私の経験上、業務に合わせたツールづくりで差が出やすいところの一つです。



