※本記事には広告・アフィリエイトリンクが含まれます。
社員名簿の年齢や勤続年数を、毎年手で書き直していないでしょうか。ExcelのDATEDIF関数を使えば、2つの日付の間が何年、何か月、何日あるかを数式で求められます。Xでも9月から10月にかけて、「=DATEDIF(誕生日,TODAY(),"Y")」で今日時点の年齢を出す例(Xの投稿)や、退職者の勤続年数が増え続けないようにする式を紹介する投稿がありました(Xの投稿)。
一方で、DATEDIFにはMicrosoftが公式に注意を呼びかけている点もあります。この記事では、2026年10月時点で確認できる書式と単位、使い方の注意点を順に紹介します。
DATEDIF関数とは?
まずは、DATEDIF関数がどんな関数なのか、書式とあわせて確かめていきます。Microsoftの説明には、ほかの関数にはない警告文も載っているので、その意味も見ておきましょう。
書式は開始日と終了日と単位の3つ
Microsoftサポートでは、DATEDIF関数を「2 つの日付間の日数、月数、年数を計算します」と説明しています。書式は次のとおりです。
DATEDIF(開始日,終了日,単位)
引数は3つで、どれも省略できない必須の引数です。1つ目の開始日には、期間の最初の日を指定します。2つ目の終了日には、期間の最後の日を指定します。3つ目の単位には、返してほしい情報の種類を文字で指定する決まりです。
開始日の入力方法として、Microsoftは3つの形を挙げています。1つ目は「"2001/1/30"」のように二重引用符で囲んだ文字列、2つ目は36921のようなシリアル値、3つ目はDATEVALUE("2001/1/30")のようにほかの数式や関数の結果です。実務では、日付が入ったセルを参照する形が多いでしょう。たとえばA2に生年月日、B2に基準日が入っているなら、「=DATEDIF(A2,B2,"Y")」と書けます。
ここで出てきたシリアル値は、Excelが日付を扱うしくみにかかわる話です。Microsoftの解説によると、日付は連続したシリアル値として保存され、それを使って計算が行われます。既定では1900年1月1日がシリアル値1で、2008年1月1日は1900年1月1日から39,447日後にあたるため、シリアル値は39448になるそうです。
3つ目の単位は、"Y"や"M"のように二重引用符で囲んで入力します。単位には"Y"、"M"、"D"、"MD"、"YM"、"YD"の6種類があり、どれを選ぶかで結果がまったく変わる点が、この関数のいちばんの特徴といえます。
DATEDIF関数の適用先として、Microsoftのページには、Excel for Microsoft 365、Excel for Microsoft 365 for Mac、Excel 2024、Excel 2021、Excel 2019、Excel 2016などが並んでいました。Windows版だけでなく、Mac版のExcelでも使える関数です。
Microsoftは、DATEDIF関数が年齢を計算する数式で利用すると便利だとも書いています。生年月日と今日の日付から年齢を出す、入社日と基準日から勤続年数を出す、といった使い方が代表的です。
公式ページに警告が載っている理由
DATEDIF関数のMicrosoftサポートのページを開くと、冒頭に「警告」の欄があります。そこには、ExcelではLotus 1-2-3の古いブックをサポートするためにDATEDIF関数が用意されていると書かれていました。Lotus 1-2-3は、かつて広く使われていた表計算ソフトです。その古いファイルとの互換性を保つために残されている関数だということになります。
同じ警告の欄では、DATEDIF関数は特定のシナリオで誤った計算結果を返すことがあるとも説明されていました。詳しくは記事内の「既知の問題」のセクションを見るよう案内されています。この既知の問題は、単位に"MD"を指定した場合のものです。"MD"の注意点は、次の見出しでくわしく見ていきます。
Xでは、DATEDIFは関数の一覧を探しても見つからない「隠し関数」で、入力の途中でヒントも出てこないが、最後まで打ちきればちゃんと動く、と紹介する投稿もありました(投稿1、投稿2)。入力中に候補が出なくても慌てず、書式どおりに打ち込めばよいということです。
もう1つ、Microsoftのページには「ヒント」として、2つの日付の間の日数を求める場合は、後の日付から前の日付を引くだけでよいと書かれています。これは、日付がExcelに数値として保存されているために成り立つ方法です。
つまり、単純な日数だけが必要なら、DATEDIFを使わずに「=B2-A2」のような引き算で済むということです。DATEDIFが本領を発揮するのは、「満何年か」「満何か月か」のように、暦のうえで区切りをまたいだかどうかを数えたいときといえるでしょう。
2026年10月時点のMicrosoftのページでも警告文は残っているので、使う前に既知の問題を知っておくことが大切です。
この警告は、DATEDIFの単独のページだけでなく、Microsoftの「2 つの日付間の差分を計算する」のページの冒頭にも同じ文面で載っています。そのページでは、開始日と終了日を別々のセルに入れてからDATEDIFの式を入力する手順で使い方が説明されていて、注意書き付きではあっても、日付の差を求める方法として案内されている関数だと分かります。DATEDIFのページの対象には、Microsoft 365のExcelやExcel 2024、2021、2019、2016などが挙げられていました。
単位はどう使い分ける?
DATEDIF関数の結果は、3つ目の引数の単位で決まります。6種類の単位は、期間全体を数えるものと、一部を無視して数えるものの2つに分けると整理しやすくなります。
"Y"と"M"と"D"で期間全体を数える
まずは、期間全体を数える3つの単位です。Microsoftの説明では、それぞれ次の値を返します。
"Y":期間内の完全な年数"M":期間内の完全な月数"D":期間の日数
「完全な」という言葉がポイントです。たとえば"Y"は、まるまる1年が何回あったかを数えるので、満年齢や満勤続年数と同じ考え方になります。Microsoftのページの例では、開始日が2001/01/01、終了日が2003/01/01で「=DATEDIF(開始日,終了日,"Y")」とすると、期間内の2年として2が返されていました。
"D"の例も載っています。開始日が2001/06/01、終了日が2002/08/15で単位を"D"にすると、2001/6/1から2002/8/15までの440日として440が返されるそうです。日数については、前の見出しで見たとおり、引き算でも同じように求められます。
"M"は、完全な月数を返す単位です。Microsoftの「2 つの日付の差を計算する」のページでも、"m"は2つの日付間の完全な月数を返すと説明されていました。契約期間が何か月目に入ったか、入社から何か月たったかを数えたいときに使えます。
単位の文字は、Microsoftの「2 つの日付の差を計算する」のページでは"d"や"m"、"y"のように小文字で書かれている箇所もあります。どちらの書き方でも、二重引用符で囲むことを忘れないようにしましょう。
週の数を知りたいときは、"W"のような単位はないため、日数を7で割る方法が紹介されています。同じページでは、"d"で日数を出したうえで、最後に「/7」を付けて1週間の7日で割る例が載っていました。結果は小数になるので、セルの書式を数値にして、小数点以下の桁数を2にするよう案内されています。
Xでは、これまで"Y"、"M"、"D"だけで無理やり計算していたが、"YM"や"MD"も使えると知った、という投稿もありました(Xの投稿)。次は、その一部を無視する単位を見ていきます。
Microsoftの例と同じ2001/06/01から2002/08/15までの期間で考えると、"M"は完全な月数なので14になります。6月1日から翌年の8月1日までで14か月がそろい、8月15日はまだ次の区切りの9月1日に届いていないためです。"D"なら440、"M"なら14、"Y"なら1と、同じ期間でも単位によって数える区切りが違うことが分かります。
"YM"と"YD"と"MD"は一部を無視する
残りの3つの単位は、日付の一部を無視して差を求めます。Microsoftの説明を整理すると、次のとおりです。
"YM":開始日と終了日の月の差。日付の日と年は無視される"YD":開始日と終了日の日の差。日付の年は無視される"MD":開始日と終了日の日の差。日付の月と年は無視される
"YM"は、「何年何か月」の「何か月」の部分を出すときに使います。「2 つの日付の差を計算する」のページでも、"ym"は過去1年間の残りの月数を返すと説明されていました。"Y"で満年数を出し、"YM"で余りの月数を出せば、「○年○か月」の形になります。
"YD"は、年を無視した日数の差です。Microsoftの例では、開始日が2001/06/01、終了日が2002/08/15で単位を"YD"にすると、日付の年数は無視されるため、6/1から8/15までの75日として75が返されていました。同じ2つの日付でも、"D"なら440、"YD"なら75と、結果が大きく変わります。
注意が必要なのが"MD"です。Microsoftは「"MD" 引数には既知の制限があるため、使用はお勧めしません」と明記しています。既知の問題のセクションでは、"MD"は負の値、ゼロ、または不正確な結果を返すことがあると説明されていました。「2 つの日付の差を計算する」のページにも、"md"は不正確な結果を計算する可能性があるため使用は勧めないという警告が載っています。
月をまたいだ後の残りの日数を出したい場合について、Microsoftは"MD"の代わりの方法を紹介しています。くわしくは、次の見出しの「○年○か月○日」の表示のところで見ていきましょう。
単位を選ぶときは、まず「期間全体を数えたいのか」「余りの部分を出したいのか」を決めると迷いにくくなります。満年齢なら"Y"、何か月目かなら"M"、「○年○か月」の月の部分なら"YM"というように、目的に合わせて選ぶのがコツです。
同じ期間で"YM"を指定すると、年を無視した6月1日から8月15日までの完全な月数なので2になります。"Y"の1と合わせれば「1年2か月」と読めるわけです。なお、Microsoftの既知の問題の説明は"MD"だけを対象にしたもので、"YM"や"YD"には同じような警告は付いていません。
年齢や勤続年数を出すには?
DATEDIF関数がよく使われるのが、年齢や勤続年数の計算です。今日の日付を自動で入れる方法と、「○年○か月○日」の形で表示する方法を順に見ていきます。
TODAY関数と組み合わせて今日時点で出す
年齢や勤続年数を「今日時点」で出したいときは、終了日にTODAY関数を使います。Microsoftの「2 つの日付の差を計算する」のページでは、特定の日付を入力する代わりに、数式内でTODAY()関数を使うこともできると説明されていました。たとえばA2に生年月日が入っているなら、「=DATEDIF(A2,TODAY(),"Y")」で今日時点の満年齢を求められます。
TODAY関数は、現在の日付のシリアル値を返す関数です。書式は「TODAY()」で、引数はありません。Microsoftの説明によると、TODAY()関数を使うと、Excelではコンピューターの現在の日付が日付として使われます。後日ファイルを開き直したときには、その日の日付に変わる点に注意するよう書かれていました。
この性質は、名簿の年齢を毎年手で直す手間を省くには便利です。一方で、「2026年10月1日時点の年齢」のように、決まった基準日で数えたい資料には向きません。基準日がある場合は、別のセルにその日付を入力し、そのセルを終了日として参照するほうが、あとから見直したときに結果が変わらずに済みます。
TODAY関数の日付が思いどおりに更新されないときについても、Microsoftは案内しています。[ファイル]タブの[オプション]から[数式]を開き、計算方法の設定で[自動]が選ばれているか確認するよう書かれていました。
退職者がいる名簿では、もう1つ工夫が必要です。終了日をTODAY()のままにすると、退職者の勤続年数が毎年増え続けてしまうためです。入社日がB2、退職日がC2に入っているなら、「=DATEDIF(B2,IF(C2="",TODAY(),C2),"Y")」のように、退職日が空欄の人だけ今日の日付を使う式にすると、退職者の年数は退職日の時点で止まります。
なお、TODAY関数のページには、1963年に生まれた人の今年の誕生日時点の年齢を「=YEAR(TODAY())-1963」で求める例も載っていました。ただし、この式は誕生日の時点の年齢なので、今年の誕生日がまだ来ていない場合は、実際の満年齢より1つ大きくなります。今日時点の満年齢を正しく出したいなら、"Y"を使ったDATEDIFのほうが目的に合っています。
「○年○か月○日」の形で表示する
勤続年数などを「○年○か月○日」の形で表示する方法は、Microsoftの「2 つの日付の差を計算する」のページに手順が載っています。流れは次の3段階です。
- DATEDIFと
"y"で、合計の年数を求める - DATEDIFと
"ym"で、残りの月数を求める - 別の数式で、残りの日数を求める
ページの例では、開始日がD17、終了日がE17に入っていて、結果が「2 年、4 か月、5 日」のようになると説明されています。
3つ目の日数では、"md"を使わない方法が紹介されていました。DATE関数で、終了日と同じ年と月の1日の日付を作り、それを元の終了日から引くというやり方です。例では、終了日の2016年5月6日から、DATE関数で作った2016年5月1日を引いて、5日を求めています。
ここで気をつけたいのは、この方法が「終了月の1日から何日たったか」を数えている点です。開始日が月の1日なら、満月数を数えたあとの残りの日数と一致します。しかし、開始日が15日のように月の途中の場合は、残りの日数とは意味がずれることがあります。具体的な日付で比べてみましょう。開始日が2019年4月1日、終了日が2026年10月26日なら、"Y"の定義では満7年、"YM"では6か月で、満7年6か月にあたる2026年10月1日から25日たっています。DATE関数の方法でも10月26日から10月1日を引いて25日なので、「7年6か月25日」で食い違いはありません。
一方、開始日が2019年4月15日、終了日が2026年10月10日の場合は、満7年5か月にあたるのが2026年9月15日で、そこから終了日までは25日です。ところがDATE関数の方法では、10月10日から10月1日を引いた9日になります。開始日が月の途中になる名簿では、日数の部分をどう扱うかを先に決めておくとよいでしょう。
3つの計算は、1つのセルにまとめることもできます。Microsoftのページでは、アンパサンド(&)と引用符、文字列を使って3つの数式を1つにつなげる方法が紹介されていました。たとえば「=DATEDIF(A2,B2,"Y")&"年"&DATEDIF(A2,B2,"YM")&"か月"」のようにすれば、「○年○か月」の形で表示できます。
数式が長くなるときのヒントとして、Alt+Enterキーで数式に改行を入れると読みやすくなるとも書かれています。数式全体が表示されない場合は、Ctrl+Shift+Uキーを押すよう案内されていました。
エラーや誤差を防ぐには?
DATEDIF関数を使っていると、#NUM!が表示されたり、思っていた数と違ったりすることがあります。よくある原因と、目的によってはほかの関数を使う方法を確かめておきましょう。
#NUM!になるのは開始日が後のとき
DATEDIF関数で#NUM!が表示される代表的な原因は、開始日と終了日の順番です。Microsoftの説明では、開始日が終了日より大きい場合、結果は#NUM!になるとされています。「大きい」というのは、シリアル値が大きい、つまり日付が後だという意味です。
たとえば、誕生日の列と基準日の列を逆に指定すると、開始日のほうが後の日付になり、#NUM!が返されます。引数の順番は、必ず「前の日付、後の日付、単位」と覚えておきましょう。
名簿の一部の行だけ#NUM!になる場合は、その行の日付を確かめてみてください。入社予定日のように、基準日より後の日付が入っている行があると、開始日が終了日より後になってしまいます。こうした行が混ざる表では、IF関数で開始日と終了日を比べ、条件に合わないときは空欄にする、といった対処が考えられます。たとえばA2が開始日、B2が終了日なら、「=IF(A2>B2,"",DATEDIF(A2,B2,"Y"))」のように書けば、開始日が後の行は空欄のまま残せるはずです。空欄になった行は、入力された日付が正しいかどうかを見直す目印にもなるでしょう。
日付の入力方法にも気をつけたいところです。Microsoftは開始日の入力方法として、二重引用符で囲んだ文字列、シリアル値、DATEVALUE関数などの数式の結果を挙げていました。セルに入っている値がExcelに日付として認識されていない場合は、思ったとおりに計算されないことがあります。日付のセルを選んで書式を[標準]に切り替え、数値として表示されるかを見ると、日付として入っているかを確かめられます。
単位の書き方の誤りにも注意が必要です。単位は"Y"や"YM"のように二重引用符で囲んで指定します。引用符を付け忘れたり、6種類以外の文字を入れたりしないよう、入力後に数式を見直しておきましょう。
また、"MD"を使った式で負の値や0が出た場合は、既知の問題にあたる可能性があります。Microsoftは"MD"の使用を勧めていないので、前の見出しで見たDATE関数を使う方法に置き換えるのが無難です。
同じ日付の関数でも、扱いが違うものがあります。MicrosoftのNETWORKDAYS.INTL関数のページによると、この関数は開始日が終了日より後でもエラーにはならず、稼働日数と同じ大きさの負の値を返します。例として、2006/2/28から2006/1/31までを数えると-21が返されると書かれていました。DATEDIFでは同じ順番の誤りが#NUM!になるので、関数ごとの違いとして覚えておくと原因を探しやすくなります。
日数や年の割合はほかの方法もある
目的によっては、DATEDIF以外の方法のほうが向いていることもあります。Microsoftの説明から、代わりになる方法を3つ見ていきます。
1つ目は、日数の引き算です。DATEDIFのページのヒントにあるとおり、2つの日付の間の日数は、後の日付から前の日付を引くだけで求められます。TODAY関数のページにも、「=DATEVALUE("2030/1/1")-TODAY()」で現在の日付と2030/1/1の間の日数を求める例が載っていました。結果を正しく表示するには、セルの表示形式を[標準]か[数値]にする必要があると書かれていました。
2つ目は、YEARFRAC関数です。YEARFRACは、2つの日付の間の日数が1年間に対して占める割合を計算する関数で、書式はYEARFRAC(開始日,終了日,[基準])です。DATEDIFの"Y"が満年数を整数で返すのに対し、YEARFRACは0.58055556のような小数で返します。Microsoftの例では、2012/1/1から2012/7/30までの期間について、基準を省略すると0.58055556、基準に1(実際の日数/実際の日数)を指定すると0.57650273、3(実際の日数/365日)を指定すると0.57808219が返されていました。
YEARFRACの基準は0から4まであり、0または省略は30日/360日(NASD方式)です。日付は文字列で入力するとエラーになることがあるため、DATE関数を使うか、ほかの数式や関数の結果として指定するよう書かれていました。基準が0より小さいか4より大きいと#NUM!が返されるという説明もあります。年利の計算のように、1年のうちどれくらいの割合かを知りたい場面で役立つ関数です。
3つ目は、稼働日の数え方です。土日や祝日を除いた日数を数えたい場合、「2 つの日付の差を計算する」のページでは、NETWORKDAYS.INTL関数を使う方法が紹介されています。DATEDIFの"D"は暦のうえの日数を数えるので、営業日を数えたいときは別の関数を選びましょう。
NETWORKDAYS.INTLの書式は、NETWORKDAYS.INTL(開始日,終了日,[週末],[休日])です。週末は番号で指定し、1または省略なら土曜日と日曜日、11なら日曜日のみが休みになります。「0000011」のように月曜日から始まる7文字の0と1で指定することもでき、休日は日付を入れたセル範囲で渡せます。Microsoftの例では、2006/1/1から2006/1/31までの稼働日は22日と示されていました。
まとめ:DATEDIF関数を使う前に確認したいこと
DATEDIF関数は、2つの日付の間の年数や月数、日数を求める関数です。使う前に確かめておきたい点をまとめます。
- 書式はDATEDIF(開始日,終了日,単位)で、3つとも必須
- 単位は
"Y"、"M"、"D"、"YM"、"YD"、"MD"の6種類 "Y"と"M"は完全な年数と月数を返し、満年齢や勤続年数に使える"MD"は既知の問題があり、Microsoftは使用を勧めていない- TODAY()を終了日にすると、ファイルを開いた日の日付で計算される
- 開始日が終了日より後だと#NUM!になる
- 単純な日数は引き算、年の割合はYEARFRACでも求められる
Microsoftのページでは、DATEDIFはLotus 1-2-3の古いブックをサポートするための関数と位置づけられています。結果が思ったとおりかどうか、いくつかの行で手計算と見比べてから名簿全体に広げると安心です。