メインコンテンツへスキップ
見出し画像

[Excel]DATEDIFの代替といわれるYEARFRACはうるう年の満年齢を正確に計算できない?

    2025/4/20追加 PDF版「日付と時間の入力、表示、計算」を作成しました



    期間計算に関する記事一覧はこちら

    【まとめ】
    ・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関数を巡る年数計算・年齢計算については、本記事で一旦終了とします。長々とした記事をご覧いただき、ありがとうございました。

    あなたへのおすすめ