EXCELで生年月日に対する今日の年齢を出す方法を探した所、DATEDIF関数なるものを見つけたので挙動の調査。
関数の内容
EXCELのHELP見てみるとこんな感じ
=DATEDIF(開始日,終了日,単位)
開始日から終了日までで、何年たったか数値を返す。
注: 開始日が終了日よりも大きい場合、結果は #NUM
単位 | 戻り値 |
---|---|
“Y” | 期間の年数です。 |
“M” | 期間の月数です。 |
“D” | 期間の日数です。 |
“MD” | 開始日から終了日までの日数です。 日付の月数および年数は無視されます。 重要: 制限事項があるため、”MD” 引数の使用はお勧めしません。 以下の既知の問題のセクションを参照してください。 |
“YM” | 開始日から終了日までの月数です。 日付の日数および年数は無視されます。 |
“YD” | 開始日から終了日までの日数です。 日付の年数は無視されます。 |
挙動テスト
仕様EXCEL: Microsoft Office Standard 2016
テスト内容
入力 | 出力 | 備考 |
=DATEDIF(“2000/1/1″,”2000/12/31″,”Y”) | 0 | 1年過ぎてないので0年 |
=DATEDIF(“2000/1/1”,”2001/1/1″,”Y”) | 1 | 2000/1/1に対して1年経過 |
=DATEDIF(“2000/1/1″,”2000/12/31″,”YD“) | 365 | 2000年はうるう年のため366日の内、365日経過 |
=DATEDIF(“2000/1/1″,”2000/1/1″,”YD“) | 0 | |
=DATEDIF(“2000/1/1”,”2000/1/2“,”YD“) | 1 | |
=DATEDIF(“2000/1/1”,”2001/1/2“,”YD“) | 1 |
1年と1日経過。経過した1日のみ表示。年数分も日にちで欲しければ”D”を使う。EXCELは1900/1/1からの経過日数で日付を取り扱っているので、 =”2001/1/2″-“2000/1/1” と打っても367と出る。 |
=DATEDIF(“2000/1/1”,”2001/12/31″,”YD“) | 365 | ??? 2001年は365日なのに364にならない・・・ |
=DATEDIF(“2001/1/1″,”2001/12/31″,”YD“) | 364 | うるう年じゃない2001年スタートにすると、正しく364となる。 |
=DATEDIF(“2000/1/1”,”2001/2/28“,”YD“) | 58 | 正しく表示される |
=DATEDIF(“2000/1/1”,”2001/3/1“,”YD“) | 60 | お。59とならない。。。 因みに、存在しない”2001/2/29″を入れるとエラーが出る。 |
=DATEDIF(“2000/1/2“,”2001/2/28“,”YD“) | 57 | 正しく表示される |
=DATEDIF(“2000/1/2“,”2001/3/1“,”YD“) | 58 | 正しく表示される |
考察
開始日: 2000/1/1だけでなく、開始日: 2004/1/1でも同様にカウントが58、60と跳んだため、開始日がうるう年の1/1だと出るバグのようです。何かの分枝をしくってるんでしょうね。。。
基本的には問題なさそうですが、少し注意が必要そうです。気になる人は、if分で判定する必要ありそう。
開始日うるう年の1/1→終了日がうるう年じゃない→DATEDIFで3/1までが60日→バグ対応
みたいな感じか。うん、めんどいw
参考(今日の年齢)
=DATEDIF(「誕生日を記入したセル」, TODAY(),”Y”)
※TODAY関数使うと、次開いたときに自動更新されてしまいます。特定の日の年齢を知りたい場合、普通にセルに対象の日付を入れて指定する方が良いです。
コメント