OpenOfficeで日付の扱いを極める-5『エクセルとOpenOfficeで共通の関数を使う−2』

=IF(DAY(TODAY())-DAY(B2)<0;DAY(TODAY())-DAY(B2)+IF(MONTH(B2)=2;IF(MOD(YEAR(B2);4)>0;28;29);IF(MONTH(DATE(YEAR(B2);MONTH(B2);30+1))>MONTH(B2);30;31));DAY(TODAY())-DAY(B2))

さて、エクセルでは、簡単に=DATEDIF(開始日,終了日,"MD")で求められる年と月を除いた経過日数を、OpenOfficeで求める計算式です。

日数を求めるには、うるう年を考慮に入れる必要があります。

その1と同じデータを使って説明します。

この記事を書いているのが、2011年8月28日なので、今日を2011/8/28と理解していただけますようお願いします。
浜村花子 1965/06/21 46 46 2
B2セルに誕生日が入っているとして

今日の日より誕生日の日が小さい場合、
今日の日から誕生日の日を引いた値に誕生日の月の日数を加えます。
この誕生日の月を求めるのが、
IF(MONTH(B2)=2;IF(MOD(YEAR(B2);4)>0;28;29);IF(MONTH(DATE(YEAR(B2);MONTH(B2);30+1))>MONTH(B2);30;31))
です。
まず、誕生月が2月の場合、誕生るう年を4で割った余りがゼロ以上の場合はうるう年ではないので28日。
誕生月が2月で誕生年を4で割った余りが0の場合をうるう年と判断し、誕生月の日数を29日とします。
IF(MOD(YEAR(B2);4)>0;28;29)
なお、年を4で割ってゼロの場合でもうるう年ではない場合があります。
それは、100で割ってゼロになり、さらに400で割って割り切れない場合です。
1700、1900、2100などがそれにあたります。
このことを考慮に入れてません。
ただし、2000年は400で割り切れるのでうるう年です。

さらに、2月でない場合、誕生日の月の30日、上の例だと、1965年6月30日に1を加えると月が替わるかどうかで月の日数が30日か31日かを判断します。
6月の場合は、6月30日に1を加えると7月になるので、月の日数は30日
7月は30日に1をくわえても31日になり、月が替わらないので月の日数は31日と判断します。
IF(MONTH(DATE(YEAR(B2);MONTH(B2);30+1))>MONTH(B2);30;31)

かなり長くなってしまいましたが、

OpenOfficeで日付の扱いを極める-5『エクセルとOpenOfficeで共通の関数を使う−1』

OpenOfficeで日付の扱いを極める-5『エクセルとOpenOfficeで共通の関数を使う−2』で経過年月日数を求める方法を紹介しました。

OpenOfficeでエクセルと共通の関数を使って経過年月日を求めるサンプルファイルはcalc029.odsをダウンロードしてください。エクセル形式のファイルはcalc029.xlsをダウンロードしてください。


送信者 OpenOffice