- ベストアンサー
ExcelのDatedif関数の不具合について
- =DATEDIF関数の挙動による日数計算の不具合について説明します。
- 日付が1日変わっても日数は同じとなり、使用上の不都合が生じている状況について詳しくお伝えします。
- このバグによる不具合を修正する方法についても解説します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>やはりユーザー定義関数を作るしかないですか。 >しかしこれを使うと、自分で使う分には良いのですが、祝日等のメンテナンスが必要になるので、 >他の人に気軽に渡せないのですよね。 質問の事例を解決するユーザー定義関数を作って見ました。 =DateDif_YD("2010/4/20","2012/3/20") や =DateDif_YD(A1,A2) A1は開始日セル、A2は終了日セルのように使います。 『祝日等のメンテナンスが必要になるので』とありますが、何も関係しないよう思います。 ワークシート関数のDateDifとVBAのDateDiffの仕様の違いはありますが、この計算には祝日等は関係しないでしょう。ご参考に。 Public Function DateDif_YD(DateFrom As Date, DateTo As Date) Dim yearAdd As Integer '年部分を計算しないようにするために加算すべき年数 '加算する年数を求める While DateAdd("yyyy", yearAdd + 1, DateFrom) <= DateTo yearAdd = yearAdd + 1 Wend '年数を加算すれば期間は1年未満にるので "d" で求める DateDif_YD = DateDiff("d", DateAdd("yyyy", yearAdd, DateFrom), DateTo) End Function
その他の回答 (3)
- TK1961
- ベストアンサー率35% (16/45)
指定単位YDの意味が「1年未満の日数」となっているところがミソなんでしょうね。一年、と漠然と云った場合、何日に換算するかが、エクセル上はきちんと定義されていたと記憶しています。 エクセルには、よく読まないと判らない規則がいっぱいあって、私もよくヘマをしますが、必ず、どこかに書いてあったりします。 反面、古いバージョンからヘルプの間違いがずっと残っている、との指摘もありますが・・・。 用語上の問題でしょうが、Dにすると、ちゃんと1日違ってきますから、仕様と云う他はないのではないでしょうか? 別の関数を使うか、Dの指定にして、IFを組み合わせて計算を修正する他はないと思います。
お礼
汎用関数の限界なのでしょうかね。 有り難うございました。
- nishi6
- ベストアンサー率67% (869/1280)
業務上、期間計算、日数計算は多用しています。 しかし、Excelのワークシート関数を期間計算に直接使う事はありません。値が信用できないのが原因です。 信用というより、ワークシート関数の返す値が、こちらのオモワクと異なる場合が多いからといったほうが適切でしょうか。 概算計算等の場合は、ワークシート関数を直接使ったりします。 財務関数なども同じ考えかたで扱っています。 計算結果が?な例に =DATEDIF("2002/3/31","2003/3/1","md") 『= -2 』になる などもあります。 正確な期間計算を行う場合は、経過日数(終了日-開始日)を基準に、 その業務で必要な要件を満たすユーザー定義関数を作っています。 要件としては、 期間計算は年単位か(年齢計算など) 期間計算は年月単位か、端数の日の処理は?(年齢計算や利息計算など) 期間計算は日単位か(利息計算など) 両端の日を算入するかしないか(利息計算など) その日の前日で1ヶ月経過か当日か(期間計算のきめ方) 将来の日付にありえない日があった場合の計算(1月30日の1ヶ月後は?) 現価計算の途中計算の端数処理指定(ワークシート関数では指定できない) 終価計算の途中計算の端数処理指定(ワークシート関数では指定できない) ・・・・・・ などがあり、組み合せも色々ありますが、その要件に合うよう、VBAで対応しています。質問の例についても、ユーザー定義関数を作ることになります。
お礼
確かにDATEDIF関数はいろいろ問題がありますね。 やはりユーザー定義関数を作るしかないですか。 しかしこれを使うと、自分で使う分には良いのですが、祝日等のメンテナンスが必要になるので、他の人に気軽に渡せないのですよね。 丁寧な回答有り難うございました。
- peso
- ベストアンサー率41% (40/97)
なぜこうなるはわかりませんが、もともとExcel用の関数として提供されているものではないためかもしれません。 修正としては式が多少複雑になりますが、 =DATE(1,MONTH(B1),DAY(B1))-DATE(IF(B1>=A1,1,0),MONTH(A1),DAY(A1)) このような感じで出来ます。(A1に開始日、B1に終了日が入っている場合) ただ、この式ではうるう年は無視しています。
お礼
すばやい回答、有り難うございます。
お礼
>祝日等のメンテナンスが必要になるので』とありますが、何も関係しないよう思います。 大変失礼しました。workday関数と混同していました。営業日数を求めるときにもユーザー定義関数を用いたことがあったもので。 関数を記述いただき大変助かりました。有り難うございました。