DATEDIF関数の使い方|年齢・勤続年数の出し方と入力候補に出ない理由

DATEDIF関数は、2つの日付の間の「満年数・満月数・日数」を求める関数です。年齢や勤続年数の算出がほぼ唯一の用途と言えるほど、この場面に特化しています。関数の一覧にも入力候補にも表示されないため、名前を最後まで手で打つ必要があります。

この記事でわかること

  • DATEDIF関数の3つの引数と6種類の単位
  • 年齢・勤続年数を「〇年〇ヶ月」で表示する書き方
  • 入力候補に出てこない理由と、正しい入力の手順
  • 基準日を TODAY() にしてはいけない場面
  • #NUM!・#VALUE! が出るときの原因と直し方


目次

DATEDIF関数の構文と引数

構文

=DATEDIF(開始日, 終了日, 単位)
引数指定するもの注意点
開始日期間の始まり(生年月日・入社日など)終了日より後だと #NUM!
終了日期間の終わり(基準日・退職日など)開始日と同じ日でも指定できる
単位何で数えるか"Y" のように " で囲む。省略できない

単位(第3引数)の6種類

単位返るもの
"Y"期間内の満年数
"M"期間内の満月数
"D"期間内の日数
"YM"年を無視した月数(1年未満の端数の月)
"MD"年と月を無視した日数(1ヶ月未満の端数の日)
"YD"年を無視した日数(1年未満の端数の日)

大文字・小文字はどちらでも動きます。使う頻度が高いのは "Y" と "YM" の2つで、この組み合わせが「〇年〇ヶ月」になります。

⚠️ "MD" は結果が0や負の数になる場合があると案内されている単位です。端数の日数が必要なら、"MD" ではなく別の計算で求めるほうが安全です。

DATEDIF関数の使い方|年齢・勤続年数の出し方と入力候補に出ない理由の解説図1

⚠️ 入力候補に出てこない

DATEDIFには、他の関数と違う点が1つあります。

  • 「関数の挿入」ダイアログの一覧に表示されない
  • =DA まで入力しても、入力候補(数式オートコンプリート)に出てこない
  • 入力中に引数のヒント(ツールチップ)が表示されない

古い表計算ソフトとの互換のために残されている関数で、Excelの標準的な関数一覧とは別の扱いになっているためです。動作しないわけではなく、手で打てば正しく計算されます。

  1. セルに =DATEDIF( と最後まで手入力する(候補は出ません)
  2. 開始日・終了日・単位を、カンマ区切りで自分で並べる
  3. 単位は "Y" のように必ず " で囲む

引数のヒントが出ないぶん、引数の順番を間違えたときにその場で気づけません。開始日が先、終了日が後という順番だけは覚えておいてください。逆に書くと #NUM! になります。


基本の使い方:年齢を出す

A2に生年月日、B1に基準日が入っているとします。

=DATEDIF($A2, $B$1, "Y")

"Y" は満年数なので、誕生日を迎えていない年は加算されません。結果は数値で返るため、そのまま平均や度数分布の計算にも使えます。

⚠️ 基準日を TODAY() にしてよい場面・いけない場面

今日時点の年齢なら =DATEDIF($A2, TODAY(), "Y") と書けます。ただしTODAY関数はファイルを開くたびに再計算されるため、過去に作った名簿を数ヶ月後に開くと、当時と違う年齢が表示されます。

  • よい場面: 常に「今日現在」を見たい進行中の管理表
  • いけない場面: 「〇月〇日時点」で確定させたい帳票・提出資料

後者では、基準日をB1などのセルに手入力し、$B$1 で参照してください。基準日が明示されているぶん、後から見返したときの再現性も上がります。

DATEDIF関数の使い方|年齢・勤続年数の出し方と入力候補に出ない理由の解説図2

結果が日付になってしまうとき

26 と出るはずのセルに 1900/1/26 のような日付が表示されることがあります。これは参照元のセルから日付の表示形式が引き継がれた状態です。セルを選び、「ホーム」タブの表示形式を「標準」に戻せば数値になります。


実務でよく使う4パターン

① 勤続年数を「〇年〇ヶ月」で出す

"Y" と "YM" を文字列としてつなぎます。

=DATEDIF($A2,$B$1,"Y")&"年"&DATEDIF($A2,$B$1,"YM")&"ヶ月"

"YM" は「満年数を引いた残りの月数」なので、0〜11の値になります。"M"(通算の月数)と取り違えると「26年314ヶ月」のような表示になります。

② 在籍月数・経過日数を出す

欲しいもの数式
通算の月数=DATEDIF($A2,$B$1,"M")
通算の日数=DATEDIF($A2,$B$1,"D")

日数だけなら、DATEDIFを使わず =$B$1-$A2 と引き算しても同じ結果になります。日数の計算にDATEDIFは必要ありません。

③ 退職者を含む名簿で終了日を切り替える

在籍中は基準日、退職者は退職日を終了日にしたい場合は、IF関数で終了日を差し替えます。

=DATEDIF($A2, IF($C2="", $B$1, $C2), "Y")

C列(退職日)が空欄なら基準日、入っていればその日付を終了日として使う形です。

④ 年齢で区分を分ける

DATEDIFの結果は数値なので、そのまま判定に渡せます。

=IF(DATEDIF($A2,$B$1,"Y")>=65, "65歳以上", "64歳以下")

同じ列を何度も計算させたくない場合は、年齢を作業列に1本出しておき、その列を参照するほうが軽くなります。

DATEDIF関数の使い方|年齢・勤続年数の出し方と入力候補に出ない理由の解説図3

うまくいかないときの原因と直し方

症状主な原因直し方
#NUM!開始日が終了日より後になっている引数の順番を入れ替える
#NUM!単位の綴りが違う("YY" など)"Y" "M" "D" "YM" "MD" "YD" のいずれかにする
#VALUE!日付が文字列として入っている左寄せなら文字列。DATEVALUE関数で変換するか入力し直す
#NAME?関数名の綴り違い・全角になっているDATEDIF を半角で入力し直す(DATEDIFF ではない)
日付が表示される表示形式が日付を引き継いだ表示形式を「標準」に戻す
開くたびに値が変わる終了日に TODAY() を使っている基準日をセルに固定して参照する
月数が異常に大きい"YM" の代わりに "M" を使っている端数の月は "YM"
入力候補が出ない仕様(一覧に載っていない)最後まで手入力する
年齢が1つずれる満年齢と数え方の前提が違う下の注記を確認する

⚠️ 年齢の「1つずれる」について

DATEDIFの "Y" は、誕生日の当日に1つ増える計算をします。一方で、制度や手続きによっては誕生日の前日に年齢が加算される扱いがあり、その場合はDATEDIFの結果と1つずれる日が生じます。

公的な手続きや契約に使う年齢は、その制度で定められた数え方を確認してから計算式を決めてください。社内の名簿や統計用途であれば、DATEDIFの "Y" で問題になることはほとんどありません。


似た関数との使い分け

関数対応バージョン返すもの・選ぶ場面
DATEDIF2016〜2日付の間の満年数・満月数(年齢・勤続年数)
=B2-A2 の引き算2016〜日数。DATEDIFの "D" と同じ
DAYS2016〜2日付の間の日数(引き算と同じ結果)
YEARFRAC2016〜期間を年単位の小数で返す
EDATE2016〜〇ヶ月後の同じ日の日付
EOMONTH2016〜〇ヶ月後の月末の日付
WORKDAY2016〜土日祝を除いた〇営業日後の日付

判断は単純です。欲しいものが「期間の長さ」ならDATEDIF、「ある日付」ならEDATE・EOMONTH・WORKDAY。

YEARFRACという代替

年数を小数で取れるYEARFRAC関数を、INT関数で切り捨てて年齢に使う書き方もあります。

=INT(YEARFRAC($A2, $B$1, 1))

こちらは関数の一覧に表示されるため、入力候補から選べます。ただし第3引数(基準)の指定で結果が変わるため、どの基準で数えているかを理解したうえで使う必要があります。年齢・勤続年数の用途では、単位の意味が明快なDATEDIFのほうが読み違いは起きにくくなります。


よくある質問

Q1:DATEDIFはどのバージョンで使えますか?

Excel 2016以前の古いバージョンからMicrosoft 365まで、いずれの環境でも動作します。ただしどのバージョンでも関数の一覧・入力候補には表示されないため、手入力する点は変わりません。

Q2:入力候補に出ないので、綴りが合っているか不安です。

正しく入力できていれば、確定した時点で計算結果が返ります。#NAME? が出るなら綴りか全角の問題です。DATEDIFF と F を2つ書く間違いが多いので、そこを確認してください。一度書いた式は、コピーして使い回すほうが確実です。

Q3:「〇年〇ヶ月〇日」まで出したいのですが。

"Y" と "YM" に加えて日の端数が必要になりますが、その端数を返す "MD" は結果が正しくならない場合があると案内されています。日単位まで厳密に必要なら、基準となる日付そのものを表示して読み手に判断してもらうか、年月の表示にとどめる設計にするほうが安全です。

Q4:開始日と終了日が同じ日だとどうなりますか?

"Y" "M" "D" のいずれも 0 が返ります。エラーにはなりません。入社日当日の勤続年数を0年と表示したい場合は、そのまま使えます。

Q5:月の途中で入社した場合、勤続年数はどこで1年になりますか?

"Y" は満年数なので、入社日と同じ月日を迎えた時点で1年になります。たとえば4月15日入社なら、翌年の4月14日までは0年、4月15日で1年です。給与規程などで別の数え方をしている場合は、規程側の定義に合わせて計算式を組み替えてください。


まとめ

DATEDIFの要点
  • 引数は開始日・終了日・単位。開始日が先。逆だと #NUM!
  • 関数の一覧・入力候補に出ないので、名前は最後まで手入力する
  • 「〇年〇ヶ月」は "Y" と "YM" の組み合わせ。"M" は通算月数
  • 確定させたい帳票では、基準日をセルに固定して TODAY() を使わない
  • 日数だけなら引き算で足りる。欲しいのが日付ならEDATE・EOMONTH

※関数の対応バージョンはExcelの一般提供時点の情報にもとづいています。お使いの環境や更新プログラムの適用状況により、利用できる関数や表示が異なる場合があります。年齢の数え方は制度や規程によって異なる場合があるため、公的な手続きに用いる数値は各制度の定めを確認してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、白石です。製造業の生産管理で15年、毎日の実績集計と帳票づくりをExcelでやってきました。マクロを組もうとして早々に挫折し、そこからは「関数と表の機能だけでどこまでやれるか」でしのいできた口です。部門では「この集計どうやるの」と聞かれる係になり、聞かれた内容を手元にメモし続けました。そのメモがいつのまにか、関数名ではなくやりたいことから引く形になっていて、それがこのサイトのもとになっています。Excelは同じことをやるのに何通りもやり方があって、しかもバージョンによって使える関数が違います。ここでは実際に動かして確かめた式だけを載せ、つまずきやすいところと使えないバージョンを先に書くようにしています。

目次