10秒目をつむったら…

勤怠の集計表をエクセルで作成しました。

実際に手計算すると0:00になるのに、関数を組んだところ、###########・・・と表示されます。
どうしてですか?

内容は・・・
『時』『分』を分けてセルに入力(例:A1セル→8、B1セル→:、C1セル→30)すると、
一日の労働時間を求めるようになっており、『残業』、『深夜残業』も求めるようにしています。
さらに表の下部に求められた時間の合計が表示するように作りました。

実際にテストで入力してみたところ、始業が14:00、終業が22:00(休憩なしで、8時間労働)
にすると労働時間が求められ、『深夜残業』が0:00と表示されますが、『残業』が
##############・・・となり、カーソルを合わせると「負の日付又は時間は########と表示します」
とメッセージが表示されます。
しかし、実際は0:00と表示されてきてほしいのですが、上記のように表示され、表下部『残業』合計
が正しい数字になってきません。

いろいろと関数を組みなおしてみたのですが、結果は同じでした。

教えてください。よろしく御願いします。

ちなみに、私が組んだ関数は以下の通りです。

=IF(J6>"22:00",O6-"8:00"-R6-P6,IF(J6<"22:00",O6-"8:00"-P6))

上記セルの内容は以下の通りです。

  J6・・・終業、O6・・・労働時間、R6・・・深夜残業、P6・・・早出時間

 基本となる時間は、
  始業・・・8:30、終業・・・17:30です。

A 回答 (5件)

>ちなみに、私が組んだ関数は以下の通りです。


=IF(J6>"22:00",O6-"8:00"-R6-P6,IF(J6<"22:00",O6-"8:00"-P6))

上記の数式には重要な誤りが2つあります。

まず今回の#####がセルに表示されるのは、計算結果がぴったり「0」でなく、正確にはごくわずか0より小さい値となっているためです。

その原因は、時間などの小数点以下の数字を演算(特に引き算)したときに発生する丸め誤差によるものです。

すなわち、2進数で表せない時間などの数値を引き算すると、本来0となるべき値が0とならずに0よりもわずかに大きいまたは小さい値となるわけです(セルの書式を「数値」にして小数点以下の桁数を15ケタ以上表示してみてください)。

0よりも大きい場合は表示上気がつきませんが、0より小さい値となった場合は、今回のようにエラー表示されることになります。

このような誤差は、時間を引き算したデータで大小の条件判定する場合にも(以上や以下を比較する場合に)出ますので、数式を作成する場合は微小値を加減するなど注意が必要です。

提示された数式のもう1つの重要な誤りは、時間の大小比較で「=IF(J6>"22:00",…」の条件式がありますが、これは左が数値で右が文字列になっているのでいずれの場合もFALSEを返します(文字列は数字よりも大きい)。

正しくは「「=IF(J6>"22:00"*1,…」」のように1を掛けて数値化した値と比較する必要があります(「「=IF(J6-"22:00">0,…」でもOKIです)。
    • good
    • 0

No.3です!


たびたびすみません。

もしかして、浮動小数点の影響かもしれません。
計算結果が表示上(10進数)で「0:00」であっても、2進数で表示する場合は微妙に誤差が生じることがあります。
たぶん限りなく「0」に近いマイナス結果になっているのではないでしょうか?
↓のURLが参考になるかもしれません。

http://support.microsoft.com/kb/78113/ja

解決方法として、ROUND関数等を併用する方法があるみたいです。

的外れなら読み流してくださいね。
何度も失礼しました。m(__)m
    • good
    • 0

こんばんは!


少し気になることがあるので、回答ではないのですが顔を出してしまいました。

もしかしてそのセルの計算結果はマイナスになっているのではないでしょうか?

確認の意味で、当方使用のExcel2003の場合の方法ですけど、
メニュー → ツール → オプション → 「計算方法」 → 「1904年から計算する」 にチェックを入れてみてください。

もし、計算結果がマイナスの場合はマイナス表示されると思います。

万一そうなってしまった場合、希望の結果とは異なってしまいますね!

と言うことは計算式をやり直さないといけないかもしれません。

以上、余計なお世話かもしれませんが、
失礼しました。m(__)m
    • good
    • 0

横幅が足りないからではないでしょうか?

    • good
    • 0

J6セル22:00ぴったりの場合はどうするのでしょう?


とりあえず、文字列をシリアル値に変換、
22:00の場合は 「O6-"8:00"-P6」としました。
=IF(J6>"22:00"*1,O6-"8:00"-R6-P6,O6-"8:00"-P6)
計算内容まで詳しく見ていません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!