ExcelのDATEDIF関数の使い方|年齢・勤続年数を計算

スポンサーリンク

Excelで「この人は今何歳?」「入社から何年経った?」と計算したい場面、ありますよね。生年月日と今日の日付から年齢を出したいのに、ぴったりの関数が見つからない。

そんなときに使えるのが DATEDIF関数 です。この記事では、基本の書き方から6つの単位の違い、年齢・勤続年数の実務パターン、”MD”単位の既知バグと回避策まで解説します。

この記事は次のような人におすすめ

– 生年月日から年齢を自動計算したい
– 入社日から勤続年数を「○年○ヶ月」で表示したい
– DATEDIF関数の6つの単位の違いを知りたい
– “MD”のバグが不安で正しい回避策を知りたい

DATEDIF関数とは?

DATEDIF関数は、2つの日付の間の期間を 年数・月数・日数 で求めるExcelの関数です。

ほかの日付関数との大きな違いは、「○年」「○ヶ月」と単位を選べる点です。年齢計算や勤続年数の算出にぴったりですよ。

DATEDIF関数の読み方と意味

読み方は「デイトディフ」です。Date(日付)+ Difference(差) が語源で、そのまま「日付の差」を意味します。

非公開関数とは何か

DATEDIF関数は、Excelの 非公開関数 です。関数ダイアログや入力補完の候補に表示されません。

もともとLotus 1-2-3という表計算ソフトとの互換性のために残された関数です。Excel 2000のヘルプでは公式に記載されていましたが、現在は通常の関数一覧から外されています。

ただし、動作自体にはまったく問題ありません。すべてのバージョンのExcelで使えます。数式を手入力すれば普通に動きますよ。

廃止される心配はない?

極めて低いと考えてよいでしょう。すべてのExcelバージョンで動作し、Microsoftのサポートページも存続しています。ただし公式サポート対象外なので、将来の仕様変更がゼロとは言い切れません。重要な業務で使う場合は、この点を頭に入れておいてください。

DATEDIF関数の書き方

基本構文と3つの引数

=DATEDIF(開始日, 終了日, 単位)
引数必須/省略可説明
開始日必須期間の始まりの日付(古いほうの日付)
終了日必須期間の終わりの日付(新しいほうの日付)
単位必須結果の形式を指定する文字列

引数の順番に注意してください。開始日が先、終了日が後 です。DAYS関数は「終了日, 開始日」と逆順なので、混同しないようにしましょう。

開始日が終了日より後の日付だと #NUM! エラー になります。DAYS関数のようにマイナスの値は返りません。

日付はセル参照のほか、DATE関数で直接指定することもできます。

=DATEDIF(DATE(2020,4,1), DATE(2026,3,21), "Y")

文字列で "2020/4/1" と書いても動きます。ただしDATE関数のほうが確実に日付として認識されるので安心です。

6つの単位の違い一覧

DATEDIF関数の特徴は、第3引数の「単位」で結果を細かく指定できる点です。

単位意味2020/4/1 → 2026/3/21 の結果
“Y”期間の満年数5
“M”期間の総月数71
“D”期間の総日数2182
“YM”年を無視した端数の月数11
“MD”月と年を無視した端数の日数20
“YD”年を無視した通算日数355

“Y” “M” “D” はそのまま年数・月数・日数を返します。

“YM” “MD” “YD” は 端数を取り出す ための単位です。たとえば「5年11ヶ月20日」のうち、”YM” は「11」の部分だけを返します。

“MD” には既知のバグがあります

“MD” は一部の日付で不正確な値を返します。詳しくはこの記事の後半で解説しています。

DATEDIF関数の基本的な使い方

年数を求める(単位 Y)

A1に「2020/4/1」、B1に「2026/3/21」と入っている場合です。

=DATEDIF(A1, B1, "Y")

結果: 5

開始日から終了日までの満年数が返ります。6年に満たないので「5」です。

月数を求める(単位 M)

同じセルを使って月数を求めてみましょう。

=DATEDIF(A1, B1, "M")

結果: 71

2020年4月から2026年3月までの総月数です。

日数を求める(単位 D)

=DATEDIF(A1, B1, "D")

結果: 2182

総日数が返ります。日数だけならDAYS関数や引き算でも同じ結果になります。

端数の月・日を取り出す(YM/MD)

「5年 11ヶ月 20日」の端数月を取り出すには “YM” を使います。

=DATEDIF(A1, B1, "YM")

結果: 11

年を無視した端数の月数だけが返ります。

同様に、端数の日数は “MD” で取り出せます。

=DATEDIF(A1, B1, "MD")

結果: 20

ただし “MD” には既知のバグがあります。正確な端数日数が必要な場合は、後述の回避策を使ってください。

DATEDIF関数の実務活用パターン

年齢を自動計算する(TODAY関数との組み合わせ)

人事・総務でよく使うのが年齢計算です。A2に生年月日が入っている場合、TODAY関数と組み合わせます。

=DATEDIF(A2, TODAY(), "Y")

TODAY関数はファイルを開くたびに当日の日付を返します。この数式を入れておけば年齢が毎日自動で更新されますよ。

たとえばA2が「1990/5/15」なら、2026年3月21日時点で 35 と表示されます。

勤続年数を「○年○ヶ月」で表示する

入社日(A2)から今日までの勤続年数を「3年5ヶ月」のように表示する方法です。”Y” と “YM” を組み合わせます。

=DATEDIF(A2, TODAY(), "Y") & "年" & DATEDIF(A2, TODAY(), "YM") & "ヶ月"

“Y” で年数、”YM” で端数の月数を取り出し、& で文字列連結しています。

A2が「2022/10/1」なら「3年5ヶ月」のように表示されます。

さらに日数まで含めた「○年○ヶ月○日」の表示も可能です。ただし “MD” にはバグがあるため、次の代替式を使ってください。

=DATEDIF(A2,TODAY(),"Y")&"年"&DATEDIF(A2,TODAY(),"YM")&"ヶ月"&(TODAY()-EDATE(A2,DATEDIF(A2,TODAY(),"M")))&"日"

日数部分でEDATE関数を使い、”MD” のバグを回避しています。

契約の残り期間を表示する

契約終了日(B2)までの残り期間を表示する例です。開始日にTODAY関数を指定します。

=DATEDIF(TODAY(), B2, "Y") & "年" & DATEDIF(TODAY(), B2, "YM") & "ヶ月"

TODAY関数(今日)が開始日、B2(契約終了日)が終了日です。順番を逆にすると#NUM!エラーになるので注意してください。

“MD”単位の既知バグと回避策

どんな場合に不正確な値になるか

“MD” は月末日をまたぐ特定の日付で、負の値や不正確な値を返します。Microsoftも公式に「MDの使用は推奨しない」と警告しています。

具体的な問題例を見てみましょう。

開始日終了日“MD” の結果正しい値
2016/1/312016/3/1-21
2016/1/302016/3/1-11
2016/3/312016/5/101

1月31日から3月1日は1日の差のはずなのに、結果は「-2」です。このように月末付近の日付で計算が狂います。

なお、”Y” “M” “YM” は基本的に安全です。ただし、うるう年が絡む特殊なケース(例: 2020/2/29 → 2021/2/28)では、”MD” 以外の単位でも予期しない値を返すことがあります。通常の日付ペアでは心配いりませんが、2月29日を含む計算は結果を確認しておくと安心です。

代替式で正確に端数日数を求める方法

“MD” の代わりに、次の式を使えば正確な端数日数が求められます。

=B1 - EDATE(A1, DATEDIF(A1, B1, "M"))

仕組みはこうです。

  1. DATEDIF(A1, B1, "M") で完了した月数を求める
  2. EDATE関数で開始日をその月数分だけ進める
  3. 終了日との差が正確な端数日数になる

先ほどの問題例(2016/1/31 → 2016/3/1)で試すと、結果は正しく 1 になります。

“MD” を使っている数式があれば、この代替式に置き換えることをおすすめします。

DATEDIF / DAYS / YEARFRAC 三者比較

3関数の特徴と適切な使い分け

日付の差を求める関数は3つあります。それぞれ得意分野が違います。

比較項目DATEDIFDAYSYEARFRAC
返す値年/月/日(6単位)日数のみ小数の年数
引数の順番開始日, 終了日終了日, 開始日開始日, 終了日, 基準
公式関数かいいえ(非公開)はい(2013以降)はい
年齢計算最適(整数で正確)不向きうるう年で誤差あり
主な用途年齢・勤続年数日数差・残日数利子・利回り計算
既知のバグMD単位なしなし

DAYS関数は日数を返す公式関数です。YEARFRAC関数は小数の年数を返し、財務計算で使われます。

判断フロー|何を計算したいかで関数を選ぶ

  • 年齢や勤続年数を「○年○ヶ月」で出したい → DATEDIF関数
  • 日数の差だけをシンプルに求めたいDAYS関数または引き算
  • マイナスの値がほしい(期限超過の判定)DAYS関数
  • 利率や利回りの年数計算 → YEARFRAC関数
  • Excel 2010以前で日数を計算したい → DATEDIF関数または引き算

日数だけならDAYS関数が公式関数で安心です。年数や月数が必要になったらDATEDIF関数の出番、と覚えておきましょう。

よくあるエラーと対処法

エラーが出たときは、次の表を参考にしてみてください。

エラー・症状原因対処法
#NUM!開始日が終了日より後日付の順番を確認する。古いほうが第1引数
#NUM!単位の文字列が無効“Y” “M” “D” “YM” “MD” “YD” のいずれかを指定する
#VALUE!日付として認識できない値セルが正しい日付データか確認する。文字列ならDATE関数を使う
#NAME?関数名のスペルミス“DATEDIFF”(Fが2つ)は間違い。正しくは “DATEDIF”
入力補完に出ない非公開関数のため正常です。「=DATEDIF(」と手入力してください
結果が0になる期間が単位に満たない“Y” は満1年に達しないと0を返します。”M” や “D” で確認してみてください

まとめ

DATEDIF関数は、2つの日付の期間を年数・月数・日数で求められる関数です。

  • =DATEDIF(開始日, 終了日, 単位) で期間を計算する
  • 6つの単位で 年数(“Y”)・月数(“M”)・日数(“D”) を使い分けられる
  • “YM” で端数の月数、“MD” で端数の日数を取り出せる
  • TODAY関数と組み合わせれば 年齢や勤続年数が毎日自動更新 される
  • “MD” には既知のバグ がある。代替式 =終了日-EDATE(開始日,DATEDIF(開始日,終了日,"M")) を使おう
  • 非公開関数だが 全バージョンで動作 し、廃止リスクは極めて低い
  • 日数だけならDAYS関数、年数・月数ならDATEDIF関数

年齢計算や勤続年数の管理に、ぜひDATEDIF関数を活用してみてください。日付計算の関数を網羅的に知りたい方は、Excelの日付計算を完全攻略もあわせてチェックしてみてください。

関連記事

関数一覧

どちらの関数一覧からでも各関数の解説記事へアクセスできます。

エラー値についてのまとめ記事

タイトルとURLをコピーしました