- ベストアンサー
DATEDIF関数
少し前にもDATEDIF関数の事で質問を出したのですが、 その作業中のことです。 開始日から終了日までの、期間月数を出すため、 =DATEDIF(N40-DAY(N40),DATE(YEAR(N41),MONTH(N41)+1,0),"M") という数式を入れています。 (N40が開始年月・N41が終了年月です) 年月のみの入力なので、開始年月は日を相殺し、終了年月はその月末を出すようにしてます。 で、大抵の値では上手くいくのですが、 開始年月 2000/9 終了年月 2004/4 の時だけ上手くいきません。 本当は「44」という値が欲しいのに、「43」になります。 どうやら終了年月が絡んでいるっぽいのですが、何が悪いのかが分かりません。 分かる方がいらっしゃったら教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
式中の N40-DAY(N40) や DATE(YEAR(N41),MONTH(N41)+1,0) は、日にゼロを指定している為、日付シリアル値は「開始年月の前月の末日」と「終了年月の末日」になります。 DATEDIFの単位に"M"を指定した場合に返される値は「満月数」ですから「開始年月の前月が大の月」かつ「終了年月が小の月」の場合、日数が「満一ヶ月に1日足りない日数」になります。 開始年月 2000/9 終了年月 2004/4 の場合、 2000/9の前月の2000/8が31日までの大の月 2004/4が30日までの小の月 になりますから、これは「43ヶ月と30日」で、満43月と計算されます。 正しく計算するなら 「開始年月の1日(ついたち)」から「終了年月の1日(ついたち)」までの満月数+1 とすべきです。 以下の式が正しい式です。 =DATEDIF(DATE(YEAR(N40),MONTH(N40),1),DATE(YEAR(N41),MONTH(N41),1),"M")+1 日付を正確に計算したいなら、 DATE(YEAR(N41),MONTH(N41)+1,0) のような「12月だったらDATEに指定した月が13月になる」とか「0日」とか、年や月を跨ぐ計算を排除すべきです。年や月を跨ぐと期待しない結果になりますので。
その他の回答 (3)
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 開始と終了を含む期間延べ月数を求めるなら、DATEDIF関数を使用しなくても出来ます。 =(YEAR(N41)-YEAR(AN40))*12+MONTH(N41)-MONTH(N40)+1
お礼
ホントだ!!!このままコピペして使わせて頂きました。私がちょっと難しく考えすぎてたんでしょうか。有難うございました!
- mshr1962
- ベストアンサー率39% (7417/18945)
1日はどの月でも固定ですが末日は28~31まで変化します。 N40-DAY(N40)は、開始日の前月末日 DATE(YEAR(N41),MONTH(N41)+1,0)は終了日の月末日 =DATEDIF(N40-DAY(N40),DATE(YEAR(N41),MONTH(N41)+1,0),"M") =DATEDIF("2000/8/31","2004/4/30","M") =(2004-2000)*12+(4-8)-(30<31)*1 =4*12-4-1=43 1日で比較すれば =DATEDIF(N40-DAY(N40)+1,DATE(YEAR(N41),MONTH(N41)+1,1),"M") =DATEDIF("2000/9/1","2004/5/1","M") =(2004-2000)*12+(5-9)-(1<1)*1 =4*12-4-0=44 となります。 =DATEDIF(N40-DAY(N40)+1,N41-DAY(N41)+1,"M")+1 でも同様の結果になります。
お礼
早速のお返事、有難うございました。 実際の数値に置き換えて式を考えた事がなかったので、 とても参考になりました。
- hinebot
- ベストアンサー率37% (1123/2963)
開始年月 2000/9 終了年月 2004/4 なら、3年(=36ヶ月)と7ヶ月で「43」で合ってませんか?
お礼
そうだったんですねー。30日だと満月数にカウントしてくれないんですね(T_T) 勉強になりました。これから気をつけて使わねば…です。