勤務表から時間帯ごとに何人いるかカウントする表を作ってみました。
10時台には何人いますよ、って感じの。
表のようなある日の勤務表があります。
そこには
・出勤時間
・退勤時間
・休憩時間(入り時刻と戻り時刻)
のデータが記載されています。
(休憩時間を差し引く必要がなければ出勤、退勤だけでOK)
同じシート、別のシートどこでもよいので時間の間隔を入れます。
その横に"人数"というフィールドを作成し、数式を入れます。
今回は配列を使います。(数式を確定させるときに Ctrl + Shift + Enter)
先ずは図をみてください。
J5セル、だいぶ長い数式が入ってますが、
=(SUM(IF($B$5:$B$24<>"",IF(CEILING($B$5:$B$24,$I$4)<I5,1,0)))-SUM(IF($C$5:$C$24<>"",IF(FLOOR($C$5:$C$24,$I$4)<I5,1,0))))-(SUM(IF($D$5:$D$24<>"",IF(FLOOR($D$5:$D$24,$I$4)<I5,1,0)))-SUM(IF($E$5:$E$24<>"",IF(CEILING(CEILING($E$5:$E$24,$I$4)+"0:01",$I$4)<=I5,1,0))))
大きくは4つに分解されます。
①(SUM(IF($B$5:$B$24<>"",IF(CEILING($B$5:$B$24,$I$4)<I5,1,0)))
②-SUM(IF($C$5:$C$24<>"",IF(FLOOR($C$5:$C$24,$I$4)<I5,1,0)))
③-(SUM(IF($D$5:$D$24<>"",IF(FLOOR($D$5:$D$24,$I$4)<I5,1,0))
④-SUM(IF($E$5:$E$24<>"",IF(CEILING(CEILING($E$5:$E$24,$I$4)+"0:01",$I$4)<=I5,1,0))))
式としては
(①-②)-(③-④)
という感じで①②はその時間にいた在籍人数を、③④は休憩に入った人数を計算しています。
使用している関数を説明しておくと、
----------------
CEILING
切り上げ関数です。指定した基準値の倍数でのうち最も近い値に切り上げてくれます。
式)Ceiling(数値,基準値)
例)Ceiling("8:05","0:30") = 8:30
----------------
FLOOR
切り捨て関数です。指定した基準値の倍数でのうち最も近い値に切り捨ててくれます。
式)Floor(数値,基準値)
例)Floor("8:05","0:30") = 8:00.
では、ひとつずつ見ていきます。
①(SUM(IF($B$5:$B$24<>"",IF(CEILING($B$5:$B$24,$I$4)<I5,1,0)))
もし、出勤の列が空でなかったら、
そしたら、もし出勤の列の値を0:30($I$4)単位で切り上げた値が8:30(I5)未満だったら
1を返します、そうでなければ0を返します。
そして、その数字たちを合計します(Sum)
これで、出勤の列の個数(人数)がでます。
ただし、ここでは退勤は加味されていないので、その分を引かなければなりません。
それが②です。
②-SUM(IF($C$5:$C$24<>"",IF(FLOOR($C$5:$C$24,$I$4)<I5,1,0)))
もし、退勤の列が空でなかったら、
そしたら、もし退勤の列の値を0:30($I$4)単位で切り捨てた値が8:30(I5)未満だったら
1を返します、そうでなければ0を返します。
そして、その数字たちを合計します(Sum)
これで、退勤の列の個数(人数)がでます。
なので、①から②を引くとその時間帯にいた人数が計算されます。
③④も同じ原理です。
12:00-13:00が休憩時間の場合で
タイムカードが12:01-12:59だった場合は、
③-(SUM(IF($D$5:$D$24<>"",IF(FLOOR($D$5:$D$24,$I$4)<I5,1,0))
12:01を切り捨てて12:00にします。
④-SUM(IF($E$5:$E$24<>"",IF(CEILING(CEILING($E$5:$E$24,$I$4)+"0:01",$I$4)<=I5,1,0))))
12:59を切り上げて0:01追加して切り上げることで13:00台でカウントをします。
③12:00以降 に1がたつ
④13:30以降 に1がたつ
ので、③-④をすると12:00-13:00の間だけ1が残るのです。
で、(①-②)-(③-④)をするとその時間帯の人数が算出されるということです。
下の図が完成図
数式を入力したら最後に Ctrl + Shift + Enter をします。
これをすることで数式の前後に { }が付き、配列化されるのです。
↑これ、忘れると正しい結果がでませんので。