[[20040428132300]] 『残業時間』(なな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『残業時間』(なな)

以下のような表を作成しています。残業時間の出し方に苦労してます。

   始業時間 終業時間 残業時間 

X   8:00    17:30   0:30

Y   8:00    17:45   0:30

Z   8:00    14:00   0:00

労働時間は休憩時間込みで9時間(始業時間、就業時間は関係なく、早出や遅刻は無し)

残業時間は30分単位で未満については切り捨て

Zさんのように労働時間9時間未満の人は残業時間に0:00と表示

IFやFLOORをつかって

IF(C2-B2<"9:00","0",FLOOR(C2-B2-"9:00","0:30""))

と入力したのですが、何か違うみたいです。

何が違うのか、正しい算出方はどうしたらよいか教えてください。


=TEXT(IF(INT((C2-B2)*1440)<INT(("9:00")*1440),"0",FLOOR(INT((C2-B2)*1440)-INT("9:00"*1440),INT("0:30"*1440))/1440),"[h]:mm")

 定数部分を数値化して

=TEXT(IF(INT((C2-B2)*1440)<540,"0",FLOOR(INT((C2-B2)*1440)-540,30)/1440),"[h]:mm")

 C2-B2<"9:00"の部分は数値と文字列の比較になるので、必ずFALSEになります。
比較の両辺ともが数値である必要があります。
C2-B2の部分は誤差が出る可能性があるため、1440倍してINT関数で整数部分に丸め、
誤差を吸収します。式の計算内容としては分単位の計算になります。
最後にTEXT関数で時間の文字列に修正表示していますので、
表示形式で時間表示設定の場合はTEXT関数を省略できます。
(KAMIYA)

ありがとうございます。うまくできました。

ただ、関数初心者なので上記の説明が半分ほどしか理解できません。

もっと、勉強します。


 テストしてたらアラが見つかりました。修正します。
=TEXT(IF(ROUND((C2-B2)*1440,0)<540,"0",FLOOR(ROUND((C2-B2)*1440,0)-540,30)/1440),"[h]:mm")

TEXT(数値,"[h]:mm")
数値を「時間:分」のテキスト形式に変換、表示します。
IF(条件,真のとき,偽のとき)
これは説明いらんでしょう。
ROUND((C2-B2)*1440,0)<540(IFの条件部分)
(C2-B2)*1440でC2-B2の分数を求めます。これが、9時間*60分より小さいかどうかを比較します。ROUND関数を使用しているのは誤差が小数部分に反映されるので、これを四捨五入して整数になるようにします。
"0"
これも説明が要らないでしょうが、単に「0」でも可。
FLOOR(ROUND((C2-B2)*1440,0)-540,30)/1440(IFの偽の部分)
実際の残業時間の計算の部分です。分単位での残業時間数を求め、それを
30分単位でまるめます。最後に1440で割っているのは、今まで分数単位で計算していたものをエクセルが時間として管理しているシリアル値という数値に戻すためです。
シリアル値
エクセルが数値を日付・時間と認識している場合にこのように呼びます。
1900年1月1日を「1」とし、これを起点とする数値、と説明されています。
「1.5」という数値は日付・時間と認識された場合、「1900年1月1日 12:00:00」と認識されています。
時間の誤差
上記説明のように24時間経過すると時間の数値は1ずつ増えていくわけですが、
1を24で割っても割り切れません。また、パソコン内部で扱える小数の桁数も
限られているので、どうしても誤差を含んだ数値になります。何回か足したり引いたりしているうちにその誤差が顕著になる場合(30分と表示されていても実際には1*10のマイナス15乗だけ足りないとか、多いとか)があるので、TIMEVALUE("0:30")と比較しても「違うよ」と言われる場合があるのです。

((KAMIYA)


またわからないことが出てきて、確認していましたら

こんなに丁寧に説明が・・感謝・感謝です。

残業時間を0:30表記ではなく、0:50表記にする場合は計算方法が

違うのでしょうか??

また、0:30表記のとき合計時間を出すにはSUM関数ではダメですか?

どうも0:00になってしまいます。


 >残業時間を0:30表記ではなく、0:50表記にする場合は計算方法が
0:50表記というのは?
50分単位の時間調整をするということでしょうか?
いや、どうもこれ現実的ではないですね。
1:30(時間:分)を1.50(時間単位)にするという意味でしょうね。
前の説明のようにシリアル値は「1」を24時間とみなす数値ですから、
単純に24倍すれば時間単位の数値になる(はず)です。
 ="1:30"*24(=1.5)
 
 >また、0:30表記のとき合計時間を出すにはSUM関数ではダメですか?
 =TEXT(IF(ROUND((C2-B2)*1440,0)<540,"0",FLOOR(ROUND((C2-B2)*1440,0)-540,30)/1440),"[h]:mm")
この関数は最終的に「文字列」を表現します。
また、SUM関数は「文字列」を無視して集計します。
結果的にSUM関数では「0」にしかなりません。
 
集計の式に工夫
 =SUM(1*(D2:D10)) とセルに入力しEnterで確定せずに、Shift+Ctrl+Enterで確定。
 {=SUM(1*(D2:D10))} と中カッコで囲まれ、数値として計算してくれます。数値で表示される場合は表示形式を時間に変更してください。
残業計算式を数値が返るようにする
数値として計算するには数式から一番外側のTEXT関数を取り去ってやることで良いでしょう。
 =IF(ROUND((C2-B2)*1440,0)<540,"0",FLOOR(ROUND((C2-B2)*1440,0)-540,30)/1440)
この場合も、表示形式を「時間」にすることで時間表示になります。
 
(KAMIYA)

上記の残業計算式を〜と、いうのを入力したら、使い心地のいいものになりました。

ありがとうございました。(ちょっと、遅くなっちゃった)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.