[Excel]DATEDIFの代替といわれるYEARFRACはうるう年の満年齢を正確に計算できない?
【まとめ】
・YEARFRAC関数は、うるう年の満年齢日に誤りが生じるので注意が必要。
・一方、同条件下でも、DATEDIF関数は誤りが生じない。
目次
【説明(概要版)】YEARFRAC関数
・YEARFRAC関数は、2つの日の経過期間が365日(うるう年なら366日)に占める割合を出す関数(正式サポート)。
=YEARFRAC(日付1,日付2,1)
最後の「1」により「実施の日数=365日(又は366日)」が設定される。
・これをINT関数(小数点以下切り捨て)で括ることにより、満年数が計算できる。
=INT(YEARFRAC(日付1,日付2,1))
・DATEDIF関数同様、日付1の翌日が起算日(1日目)となる(初日不算入の原則と同様)。
・年齢は誕生日が起算日になるので、1を引いておく。
=INT(YEARFRAC(誕生日-1,日付2,1))
これにより誕生日の前の日に年を取る結果となる(法に合致)。
・ただし、うるう日(2/29)が誕生日の場合、うるう日における満年齢到達日に誤りが生じる。
法的には、2/29生まれも、他の日同様、平年もうるう日も、前日(2/28)に年をとる。しかし、YEARFRAC関数では、うるう年は3/1に年を取る計算結果となる。
・うるう日以外の誕生日でも、うるう年の満年齢の計算に誤りが生じる。
【説明(冗長版)】
・YEARFRAC(イヤーフラクション)関数というものがあります。
YEARFRAC 関数 - Microsoft サポート
YEARFRAC関数は、「2つの日付の間の全日数が1年間(366日。うるう年は365日)に対して占める割合を計算します。(複数年なら、複数年の全日数が分母となります。)
*フラクションとは、「部分」「一部」という意味だそうです。
これにより、2つの日付の期間(年単位)が出せます。
WEBでは、DATEDIF関数(公式にはサポートされていない)の代わりに使えるとの説明が多くあります。
果たして、実際に使えるか、後段で検証してみます。(結論は【まとめ】のとおり。)
まずは、YEARFRAC関数の使い方から。
〇YEARFRAC関数の記述方法
Microsoftのサポートページでは、以下の通りとなっています。
=YEARFRAC(開始日, 終了日, 1)
「開始日」という記載ですが、起算日(1日目)は「開始日」の翌日になります(民法の初日不算入の原則と同等)。
これはDATEDIF関数と同じです。
当サイトでは、開始日と起算日の混同を防ぐため、
=YEARFRAC(日付1, 日付2, 1)
とします。
*最後の「1」は省略できません。省略すると、正しい計算が出来なくなります(「1」がないと、月を30日、年を360日で計算してしまうため。)。「1」を入れることで、月も年も実際の日数(365日。うるう年は366日)で計算されます。
「2つの日付の間の全日数が1年間に対して占める割合」なので、答えには小数点以下が出ます(365日=1年ぴったりなら整数)。
答えの1の位が経過年数(満年数)となり、少数点以下を切り捨てると、そのまま満年数として使えます。
小数点以下を切り捨てるため、INT関数で括ります(TRUNC関数も可)。
ROUNDDOWN関数(切り捨て)を利用して説明しているサイトも散見されます。間違いではありませんが、INT関数の方が簡単で間違いが生じづらいと思います。
2つの日付を入れ替えても、同じ結果が出ます。
=YEARFRAC(古い日付、新しい日付,1)でも
=YEARFRAC(新しい日付、古い日付,1)でも
構いません。計算結果は同じです。
〇満年齢の計算
満年齢の計算でも、DATEDIF関数と同じく、誕生日から1を引いた日を入れます(年齢は出生の日が起算日になるため。詳細は、「[Excel]満年齢を出す計算式 DATEDIF関数 その3」参照)。
=INT(YEARFRAC(誕生日-1,日付2,1))
*「日付2」は、この日における満年齢を出したい日付
〇【具体的検証】うるう日が誕生日の場合の満年齢の計算
ここからが具体的な検証になります。
大前提として、「うるう日(2/29)に生まれた人はいつ年を取るか?」ですが、普通の日と同じく「誕生日の前の日」に年を取ります。
2/29の前の日は2/28ですので、2/28に年を取ります。
2/29がない年(平年)でも、同く2/28です。
参考:うるう年をめぐる法令|参議院法制局 (sangiin.go.jp)
YEARFRAC関数では、どうなるか、試してみます。
同時に、DATEDIF関数でも試してみます。
まず、「日付2」(この日に何歳であるかを見る日)が平年の場合。
H24年はうるう年(誕生日を2/29と設定)。
H25年は平年です。
H25年は平年、つまり1年は365日ですが、起算日(1日目)がH24/2/29のため、H25/2/28は366日目となっています。
この例では、YEARFRACT関数もDATEDIF関数も、どちらも正しく、誕生日(2/29)の前日である2/28に年を取っています。
つぎに、うるう年の場合。
H28年(2016年)はうるう年です。
なんと、YEARFRAC関数では、2/29に年を取っています。誕生日当日です。
これは、法的には誤りです。
一方、DATEDIF関数では、平年と同じく、前日の2/28に年を取っています。
念のため、うるう日以外の誕生日も見てみます。
誕生日がH24/3/2の場合。
H24年はうるう年ですが、誕生日はうるう日を過ぎています。
H28年もうるう年です。
こちらでも、YEARFRAC関数では、誕生日当日の3/2に年を取っています。
これは、法的には誤りです。
一方、DATEDIF関数では、平年と同じく、誕生日前日の3/1に年を取っています。
これは、YEARFRAC関数が分数を元にしていることに起因している現象と思われます。
〇検証してみて
検証の結果、以上のとおりとなりました(2024/1月現在)。
現状では、満年齢の計算にはYEARFRAC関数は使用しない方がいいと思われます。
一方、DATEDIF関数では正しい計算結果となりました。
DATEDIF関数は、うるう年が絡むと正しく計算できないといわれていたので、この結果は意外でした。
従って、今のところ、満年齢の計算には、非公式関数であるDATEDIF関数を使った方がいい、という結論になります。
DATEDIF関数を巡る年数計算・年齢計算については、本記事で一旦終了とします。長々とした記事をご覧いただき、ありがとうございました。