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つあります。
- 「関数の挿入」ダイアログの一覧に表示されない
=DAまで入力しても、入力候補(数式オートコンプリート)に出てこない- 入力中に引数のヒント(ツールチップ)が表示されない
古い表計算ソフトとの互換のために残されている関数で、Excelの標準的な関数一覧とは別の扱いになっているためです。動作しないわけではなく、手で打てば正しく計算されます。
- セルに
=DATEDIF(と最後まで手入力する(候補は出ません) - 開始日・終了日・単位を、カンマ区切りで自分で並べる
- 単位は
"Y"のように必ず"で囲む
引数のヒントが出ないぶん、引数の順番を間違えたときにその場で気づけません。開始日が先、終了日が後という順番だけは覚えておいてください。逆に書くと #NUM! になります。
基本の使い方:年齢を出す
A2に生年月日、B1に基準日が入っているとします。
=DATEDIF($A2, $B$1, "Y")
"Y" は満年数なので、誕生日を迎えていない年は加算されません。結果は数値で返るため、そのまま平均や度数分布の計算にも使えます。
⚠️ 基準日を TODAY() にしてよい場面・いけない場面
今日時点の年齢なら =DATEDIF($A2, TODAY(), "Y") と書けます。ただしTODAY関数はファイルを開くたびに再計算されるため、過去に作った名簿を数ヶ月後に開くと、当時と違う年齢が表示されます。
- よい場面: 常に「今日現在」を見たい進行中の管理表
- いけない場面: 「〇月〇日時点」で確定させたい帳票・提出資料
後者では、基準日をB1などのセルに手入力し、$B$1 で参照してください。基準日が明示されているぶん、後から見返したときの再現性も上がります。

結果が日付になってしまうとき
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本出しておき、その列を参照するほうが軽くなります。

うまくいかないときの原因と直し方
| 症状 | 主な原因 | 直し方 |
|---|---|---|
#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" で問題になることはほとんどありません。
似た関数との使い分け
| 関数 | 対応バージョン | 返すもの・選ぶ場面 |
|---|---|---|
| DATEDIF | 2016〜 | 2日付の間の満年数・満月数(年齢・勤続年数) |
=B2-A2 の引き算 | 2016〜 | 日数。DATEDIFの "D" と同じ |
| DAYS | 2016〜 | 2日付の間の日数(引き算と同じ結果) |
| YEARFRAC | 2016〜 | 期間を年単位の小数で返す |
| EDATE | 2016〜 | 〇ヶ月後の同じ日の日付 |
| EOMONTH | 2016〜 | 〇ヶ月後の月末の日付 |
| WORKDAY | 2016〜 | 土日祝を除いた〇営業日後の日付 |
判断は単純です。欲しいものが「期間の長さ」なら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年です。給与規程などで別の数え方をしている場合は、規程側の定義に合わせて計算式を組み替えてください。
まとめ
- 引数は開始日・終了日・単位。開始日が先。逆だと
#NUM! - 関数の一覧・入力候補に出ないので、名前は最後まで手入力する
- 「〇年〇ヶ月」は
"Y"と"YM"の組み合わせ。"M"は通算月数 - 確定させたい帳票では、基準日をセルに固定して
TODAY()を使わない - 日数だけなら引き算で足りる。欲しいのが日付ならEDATE・EOMONTH
※関数の対応バージョンはExcelの一般提供時点の情報にもとづいています。お使いの環境や更新プログラムの適用状況により、利用できる関数や表示が異なる場合があります。年齢の数え方は制度や規程によって異なる場合があるため、公的な手続きに用いる数値は各制度の定めを確認してください。

