---topics:時間をsum関数する、floor関数---

其ノ17 Excelと時間 後編

前回の続きです。
前回は、日付を入れれば曜日も埋まる、ってトコまで進んだんですよね※1。 今回は、いよいよ勤務時間の計算をしていきたいと思います。

前回まで
※1 前回まで

時間を入力する

では、勤務時刻を入力していきます。 前回同様、仮データを入れてイメージをつかんでみましょう。
「出社時刻」欄と「退社時刻」欄に適当な値を入れてみます。 試しに、「9時出社、18時退社」ってデータを入れてみてください。 9:00と、「(コロン、半角)」を使って入れてやればOKですので※2

時刻を入力した
※2 時刻を入力した

あと5コくらい入れてみましょうか※3

深夜勤務も想定
※3 深夜勤務も想定

11月25日のところのデータは、深夜勤務を想定してみました。 夜の21:49入りで、翌朝の8:07上がり。 仕事上がりは翌日なので、ホントは26日なんだけど、25日の行に入れています。
ハイ、では、5件データを埋めたところで、問題です。 今、出社時刻と退社時刻を入力しました。 さて、勤務時間はどうやって割り出しますか?
…うーん、とりあえず、上がり時刻から入り時刻を引いてみましょうか。 新しい列を作って、そこで計算をしてみましょう※4

「勤務時間」の列を新しく作る
※4 「勤務時間」の列を新しく作る

できましたら、新しく作った「勤務時間」列に、式を入れていきます※5 ※6
休憩時間のことは、いろいろな理由があって(…こちらにも、解説の都合というものがありまして…すみません…)、今のところはとりあえず無視してください。

退社時刻-出社時刻
※5 退社時刻-出社時刻
11月21日の勤務時間は9時間です
※6 11月21日の勤務時間は9時間です

式を入れました。 ちゃんと勤務時間、割り出せてる感じですね。
では、この式をおしりまでコピーしてあげましょう※7! どうなるかな?

あれ?何だろう「###########」って…
※7 あれ?何だろう「###########」って…

アレ?深夜勤務のところで、変な表示が出ました。
結論から言うと、これは、計算結果がマイナスになってます、というエラーです。 時間がマイナス、という計算結果に対して、Excelが困ってしまったんですな。
では、どうすれば良いのでしょうか?
 ・
 ・
実は、日付と同様、時刻もシリアル値をもっています。 例えば、01:00のシリアル値は、0.41666…です。 これは、1を24で割った値のことです。 前回の話を思い出してください。 日付のシリアル値は、1日ごとに1増えるんでしたね。 だから、1時間経過するときには、それをさらに細分化すれば良い。 1日は24時間だから、1時間は1/24になりますよね。 同様に、06:00のシリアル値は、6/24(6を24で割る)、イコール1/4、小数にすると0.25になります。 12:00は0.5です。
時刻のシリアル値を体験してもらうために、日付のときと同様、数値にして確認してみましょうか。 先ほど入力した時刻を空いてる列にコピって、数値に変換してください※8 ※9

空いてる列にコピって、書式を「数値」にする
※8 空いてる列にコピって、書式を「数値」にする
あれ?0と1だけになった…
※9 あれ?0と1だけになった…

…おっと失敗。 書式を「数値」にするときに、小数点以下を表示しない設定にしてしまったため、無理矢理整数表記になってしまってるんです。
お手数ですが、もう一回設定してやりましょう。 書式を「数値」にするときに、「小数点以下の桁数」ってところを調節してやります。 小数点以下は、5ケタくらい表示されれば良いかな…※10 ※11

書式設定やり直し 「数値」で、小数点以下を表記させる
※10 書式設定やり直し 「数値」で、小数点以下を表記させる
これでOK
※11 これでOK

ハイ、ようやく出ました、シリアル値。 9:00のところは、「0.375」になってますね。これは、9を24で割った値に等しいです。 また、9:07や18:31も、少数で表示されてますね。かなり細かい数字です。 シリアル値で言うと、1分は0.0006944…。 これは、1を24で割って、それをまた60で割った値です。 こんなふうに、Excel内部では、時刻の情報は小数で管理されているんです。

さて、深夜勤務対策です。
ここの表示がおかしくなるのは、計算結果がマイナスになるからです。 だから、対策としては、マイナスにならないようにしてやれば良い。
例えば、TVの深夜番組の予告で、「水曜25:30スタート!」なんて表現、ありますよね。 実際は木曜の01:30のことなんだけど、前日とのつながりで24時間を超えて表現しているわけです。
同様に、11月25日の退社時刻の8:07(実際は11月26日)も、24時間オーバーで表現してやれば良いのでは?※12 ※13

翌日の8:07を、32:07と表現
※12 翌日の8:07を、32:07と表現
エラーはなくなった、が…
※13 エラーはなくなった、が…

エラーは出なくなりました。
32:07も、一回転して通常表記に戻っています。 これで解決、ってコトで良いんじゃないですか? ね?

…ウン、でも、このやり方にひとつだけ難癖をつけると、このやり方だと、入力者が工夫しないといけないんです。 すべての入力者に、「日をまたぐときは、24時間オーバーのかたちで入力してね♪」とお願い・徹底しないといけない。 だけど、一人でもそれを忘れてふつうに8:07と打っちゃうと、エラーになっちゃうワケですよ。
もちろん、入力ルールを徹底するために、マニュアル化することもできます※14。 でも、ここまでやってもやっぱり忘れちゃう人って、いますよね。

例えば、マニュアルを付けてみたり
※14 例えば、マニュアルを付けてみたり

なので、こちらでひと手間加えてやりましょう。
時刻のシリアル値は、00:00が0(ゼロ)、24:00が1です。 だから、「もし計算結果がマイナスになるなら、退社時刻に24:00に該当する値、つまり1を足す」とすれば、マイナスにならないのでは。 なので、式をこんなふうに修正してみました※15

もし計算結果がマイナスなら、1を足す
※15 もし計算結果がマイナスなら、1を足す

式の真ん中辺り、IF関数を使うところがキモですね。 これは、「もし単純に引き算をして結果がマイナスになってしまうようだったら、1を足してください。そうでなければ、そのまま(ゼロを足す)にしてください」という命令です。 ちょっと難しいですが、読み取ってみてください。

ちょっとわかりにくいこの式ですが、もう少しわかりやすくするなら
=if(D2-C2<0,D2+1-C2,D2-C2)
となります。
意味合い的には同じです。 そして、わかりやすさ的にもこちらの方が優れています、が、やや式として冗長ですので、本文のように表現させていただきました。

合点いただけましたら、この式を全セルにコピーしていきましょう。

では、出社時刻と退社時刻、適当で良いですので、最後まで埋めてみてください。 イメージ作りですよ、イメージイメージ。

空白処理とfloor関数

 ・
 ・
入力を進めていて、気になる箇所を見つけてしまいました。 「出社時刻」だけを入力した段階で、勤務時間に値が表示されてしまうんですよ※16

出社時刻しか入れてないのに、勤務時間が出る
※16 出社時刻しか入れてないのに、勤務時間が出る

これは、退社時刻に何も入っていないのを、Excelが0:00、すなわち24:00と理解して、そこまでの勤務時間を計算してしまっているんです。 細かいところなんですが、…少し気になってしまいました。
これを解決するには、前回曜日のところでもやったように、IF関数の空白処理を使えば良い※17。 ちょっとやってみましょう。

もし出社時刻か退社時刻がblancなら、blancを返す
※17 もし出社時刻か退社時刻がblancなら、blancを返す

こんなふうに、式を改良してみました。 「もし出社時刻または退社時刻が空白なら、空白のままにしてください」という命令を付け加えています。
…そろそろ読んでいるみなさんも、「コイツ面倒くさいなー。ちまちま式をいじりやがって」と思ってらっしゃると思うんですが、設計というのは得てして、こんなふうに蛇行しながら進むものなんです。 もちろん、いきなり正しい答えが導き出せれば良いんですけど、わたしたちは神様ではないですから。 なので、もう少し右往左往にお付き合いください。
さて、全部入力、できました?※18

時間を全部入力した
※18 時間を全部入力した

サンプルデータなので、こんな感じで良いでしょう。

さて、このタイムシートにおいて、考慮しなければならない条件があと2つあります。 ひとつは、休憩時間の処理。 もうひとつは、15分刻みにすることです。
まず、休憩時間。 「休憩時間」の欄に、適当な値を入力しましょう。
今回は、全部1時間で良いかな。 で、あとは、これを引けば良い、ですよね。 新しい列を作って、そこで計算してあげましょう※19

単純な引き算だと空白のところで#VALUEがでるので、空白処理もしてみました
※19 単純な引き算だと空白のところで#VALUEがでるので、空白処理もしてみました

では次に、15分刻みの処理。
15分単位で切り下げるには、floor関数っていうのを使います。 floor関数って、あまりメジャーじゃないんですが、「指定した基準値の倍数に最も近い値に、数値を切り下げる」という機能をもっています。 式のかたちはこんな↓感じ。

=floor(元となる値,基準値)

で、この「基準値」のところに"0:15"を指定してあげると、8:16は切り下げられて8:15に、8:33は8:30になる、というワケ。 ちょっとやってみましょう※20

「元となる値」は隣のセル 「基準値」は0:15
※20 「元となる値」は隣のセル 「基準値」は0:15

空白処理のところは、もう説明しませんよ。 いえいえ、いじわるしてるわけじゃないですからね。
あと、「基準値」の"0:15"は、「""(チョンチョン)」で囲ってあげてくださいね。 式を入れられたら、全セルにコピーです※21

15分刻みになった
※21 15分刻みになった

この式を使えば、例えば「5分刻みにしたい!」ってときにも、応用できそうですよね。

時間をsumする

さて。いよいよラストミッション、今月の勤務時間を計算するときがやってまいりました。 今月分の合計を割り出したいので、sum関数の出番ですよね。 ちょっとやってみましょう。
合計値を入力するセルを作って…※22

合計値を入れるセルを下段に設ける
※22 合計値を入れるセルを下段に設ける

そこにsum関数を入れる。 範囲は、一番右の列でOKですよね。 すると…※23 ※24

計算範囲は、15分刻みに加工した列
※23 計算範囲は、15分刻みに加工した列
え?18:30?
※24 え?18:30?

え? 18時間30分って、1か月の労働時間として短くない?
 ・
 ・
そんなわけありません(笑) かと言って、Excelが悪いわけでもありません。
これは、時間の値が24時間で一周して、ぐるぐる廻ってしまっているから起こる現象です。 だから、このままだと合計値を出せないんです。

でね、結論から言うと、この問題に対処するには、「00:00」表記をやめて、「数値」にしないといけないんです。
では、数値にするにはどうするかというと…、
…「00:00」表記の背後にはシリアル値がある、という話を先にしましたよね。 01:00のシリアル値は1/24(24分の1)でした。 02:00のシリアル値は2/24(24分の2)です。 これを、01:00は数値の「1」、02:00は「2」になるようにしたい。 であれば、24倍すれば求める数値になるのでは?※25

24倍する
※25 24倍する

ということで、24倍すると…※26

ん?
※26 ん?

ん?いや、めげないめげない。
列を新しく作るときに、僕は「列の挿入」を使ったんですが、そのときに隣の書式もコピーしちゃったみたいです。 なので、書式を数値に変えてあげましょう。 そうすれば。※27 ※28

書式を「数値」に 小数点以下は2ケタ(0:15刻みなので)
※27 書式を「数値」に 小数点以下は2ケタ(0:15刻みなので)
小数表記になった
※28 小数表記になった

小数表記にできました。 もう、8:00じゃないですよね。 小数の8.00になってますね。
では、できましたら、あらためてコイツを合計してください※29 ※30 ※31

sum関数の範囲を最右列に
※29 sum関数の範囲を最右列に
書式は「数値」です
※30 書式は「数値」です
今月の勤務時間は162.50時間です
※31 今月の勤務時間は162.50時間です

合計、出せました! 数値に変換してから合算する、というのがポイントですね。

さて、計算はこれで終わりなんですが…、
作業列がたくさんありますね。 計算のため必要だったとはいえ、「勤務時間」の他に「休憩を引いた値」「15分刻みに」「数値に」とあって、できれば1列で済ませた方がスマートです、が、1列で計算を済ませる仕方については、みなさんの方で考えてみてください。 余力のある方だけで良いですよ。
あ、いちおう念のため、僕が作ったサンプルデータをアップしておきます。

式などの参考に。
ではでは。

Copyright(C)森田表計算