こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DATEDIF関数と普通の引き算による日数計算

7月25日(セルA1)から7月1日(セルB1)までの日数を計算する場合、B1-A1で日数は出てくるようなんですが、例えば月を跨いだ場合、誤差は出てくるのでしょうか?(閏年や、月ごとの総日数の違いなどにより)

日数計算の場合、DATEDIF関数というものもあるようなのですが、これを使うと日数がマイナスになってしまう場合、エラーになってしまうようです。

後者の方が正確であるならば、DATEDIF関数を使いたいんですが、その場合、引き算の結果がプラスになる場合、マイナスになる場合が混在しているデータで使用する場合、どのような計算式を入力すればよいのかが分かりません。

どなたか御存知の方、よろしくお願いします。
ちなみに、単なる引き算で誤差がでないようでしたら、引き算で処理したいと思っています。

投稿日時 - 2006-07-20 15:33:41

QNo.2287913

すぐに回答ほしいです

質問者が選んだベストアンサー

用途によりますが、単純な日数計算なら基本的には誤差は出ないと思いますよ。
Excel内では、1900年1月1日を1として、1日ごとに1増える計算になっていますので。
ようするに、数字同士の引き算ですからね。

閏年は計算に入っていますし、月ごとの総日数も関係ないですし。

DATEDIFを使うなら、IF関数で大きさを比べて使ってみてはいかがでしょうか?

投稿日時 - 2006-07-20 15:46:48

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

#4 の私の書いたものの修正します。

すでに、ご指摘がありますが、以下の文言は訂正いたします。

>いいえ、OSが、Winでしたら、1900年(1904年)以降、正しく表示します。

1900/3/1 以降からのシリアル値です。見落としていました。現行バージョン、旧バージョンを調べてみましたが、どちらも同じ1900/2/29が出てきますが、本来、その日はありません。

失礼しました。

投稿日時 - 2006-07-22 14:29:48

ANo.5

NCU

1900/2/29 という日付は存在しないのですが、1900年日付システムでは存在しますよね。
つまり、1900年日付システムでの日付シリアルを、「1900/1/1を 1 とする連番」と理解すると、実は 1900/2/29 以降は1日ずれている事になります。

つまり、1900/2/29 をまたぐ日数差の計算は1日ずれてしまいます。逆に言えば 1900/2/29 をまたがない限り日数差は引算で正確に計算できます。

皆それを承知の上で1900年日付システムを使っています。

投稿日時 - 2006-07-20 22:23:32

ANo.4

>B1-A1で日数は出てくるようなんですが、例えば月を跨いだ場合、誤差は出てくるのでしょうか?

いいえ、OSが、Winでしたら、1900年(1904年)以降、正しく表示します。

>単なる引き算で誤差がでないようでしたら、引き算で処理したいと思っています。
そのほうが、自然な考えだと思います。

ここでは、関係がありませんが、DateDif は、"MD", "YD" オプションはバグがありますから、気をつけて使ったほうがよいと思います。"D"なら、同じです。単に、シリアル値からの計算ですから、それなら、使わなくてよいですね。

バグについて、触れられていますが、

http://www.kenzo30.com/zuisou/hanasi3.htm#DATEDIF関数について

"MD", "YD" の計算は、いわゆる「祥月命日」までの計算ですが、英米でも同じ計算をするのか、ちょっと不思議に感じたりします。欧州では、みたことがありませんので、ないような気がします。いずれにしても、仕事では、ちょっと使えないオプションのひとつです。

マイナスになる場合
すでに解答が出ていますが、マイナスが出ないように、ABS() で括ればよいだけです。

これは、ワークシート関数のみに発生します。(VBAにも同様のものがありますが、そちらは、そのようなオプションはありません。)

MS側は、そのバグについて認識してきても、ずっと放置してきた問題のひとつです。

投稿日時 - 2006-07-20 17:54:33

ANo.3

=ABS((DATEDIF(A1,B1+2100,"d")) - 2100)

これでもOK!?

投稿日時 - 2006-07-20 16:25:43

ANo.1

こと日数に関する限り、上記は同じ結果です。
=ABS(A1-A2)
=IF(A1>A2,DATEDIF(A2,A1,"d"),DATEDIF(A1,A2,"d"))
=DATEDIF(MIN(A1,A2),MAX(A1,A2),"d")

投稿日時 - 2006-07-20 15:43:57