DATEDIF関数で年齢・勤続年数・在籍期間を自動計算する|引数の仕組みと注意点、YEARFRAC比較とMOS試験対策

「社員の年齢をExcelで自動表示したい」「勤続年数を年・月・日単位で正確に出したい」――人事・総務の実務で必ず直面するこの課題を解決するのがDATEDIF(デイトディフ)関数です。

DATEDIFは開始日から終了日までの期間を、年・月・日などの単位で返す関数です。Excelの公式ヘルプや関数の挿入ダイアログに表示されない「非公式関数」でありながら、現在もExcel全バージョンで動作します。特に満年齢の計算・勤続年数の算出・在籍期間の集計など、人事・総務業務の定番関数として長年にわたり使われ続けています。

本記事では、DATEDIFの基本構文・引数の一覧・実務シナリオ別の使い方・よくある注意点・YEARFRAC関数との使い分け・MOS試験における日付計算の出題ポイントを体系的に解説します。

目次

DATEDIF関数の基本構文

DATEDIFの構文は次の通りです。

=DATEDIF(開始日, 終了日, 単位)
引数説明省略
開始日期間の起算日(生年月日・入社日など)。日付型のセル参照・DATE関数・文字列日付必須
終了日期間の終了日(TODAY()・特定の計算基準日)。開始日より後の日付でなければならない必須
単位返す値の単位を文字列で指定。”Y”/”M”/”D”/”YM”/”YD”/”MD”の6種類必須

重要:引数の順番は必ず「開始日→終了日」の順です。逆にすると#NUM!エラーが発生します。「古い日付が第1引数、新しい日付が第2引数」と覚えてください。

単位引数の一覧と意味

DATEDIFの第3引数「単位」には6種類の文字列を指定できます。この6種類の使い分けが関数マスターの核心です。

単位返す値典型的な用途
“Y”満年数(端数切り捨て)満年齢・勤続年数(○年)
“M”満月数(端数切り捨て)総勤続月数・契約経過月数
“D”日数総経過日数(TODAY()-開始日と同じ)
“YM”年を無視した月の端数(0~11)「○年○ヶ月」の「○ヶ月」部分
“YD”年を無視した日数(0~365)「○年○日」の「○日」部分(あまり使わない)
“MD”年・月を無視した日の端数(0~30)「○年○ヶ月○日」の「○日」部分

実務でよく使う組み合わせは“Y”(満年数)と”YM”(月の端数)のセットです。「2年3ヶ月」のような表示を作るには、これら2つのDATEDIFを文字列連結します。

実務シナリオ1:満年齢の自動計算

人事管理名簿で最も頻繁に使われる用途が満年齢の算出です。B列に生年月日、C列に「今日の年齢」を表示する例を示します。

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

B2に「1990/4/15」が入っている場合、今日の日付が2026/6/23なら「36」が返ります。誕生日を迎えていれば満年齢が増え、迎えていなければ前年齢のままになるため、法律上の「満年齢」が正確に算出されます。

「○歳○ヶ月」という表示にする場合は次のように年と月を連結します。

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

結果例:「36歳2ヶ月」。”YM”は「年の端数を無視した月数」なので、全体の月数ではなく「3月15日生まれの人が現在3月経過している」という月のみの端数が返ります。

実務シナリオ2:勤続年数・在籍期間の算出

入社日から現在または退職日までの勤続年数を「○年○ヶ月」で表示する典型的な人事業務の例です。D列に入社日、E列に退職日(現職の場合はTODAY())が入っている場合を想定します。

' 勤続年数(年のみ)
=DATEDIF(D2, E2, "Y")

' 勤続○年○ヶ月の表示
=DATEDIF(D2, E2, "Y") & "年" & DATEDIF(D2, E2, "YM") & "ヶ月"

' 勤続○年○ヶ月○日の表示
=DATEDIF(D2, E2, "Y") & "年" & DATEDIF(D2, E2, "YM") & "ヶ月" & DATEDIF(D2, E2, "MD") & "日"

現職社員は退職日セルにTODAY()を固定入力する代わりに、退職日が空白の場合はTODAY()、入力済みの場合はその日付を使うIFを組み合わせると、退職日管理と在籍日数表示を同一セルで扱えます。

=DATEDIF(D2, IF(E2="", TODAY(), E2), "Y") & "年" & DATEDIF(D2, IF(E2="", TODAY(), E2), "YM") & "ヶ月"

実務シナリオ3:契約残日数と期限管理

契約期限・保証期限・試用期間の残り日数を表示する場合は、開始日と終了日を入れ替えて「今日→期限日」の方向で計算します。

' 残り日数
=DATEDIF(TODAY(), F2, "D")

' 残り○ヶ月○日
=DATEDIF(TODAY(), F2, "M") & "ヶ月" & DATEDIF(TODAY(), F2, "MD") & "日"

F2に契約満了日が入っている場合、残り0日以下になると#NUM!エラーが出ます。期限切れの場合に「期限切れ」と表示するにはIFERRORを組み合わせます。

=IFERROR(DATEDIF(TODAY(), F2, "D") & "日", "期限切れ")

DATEDIFの注意点と落とし穴

注意点1:関数の挿入ダイアログに表示されない

DATEDIFはExcelの公式関数リストに掲載されていないため、「関数の挿入」ダイアログで検索しても見つかりません。Lotus 1-2-3との互換性のために残された関数であり、Microsoftの公式ドキュメントからも外れています。使用する場合はセルに直接=DATEDIF(と入力してください。入力補完(IntelliSense)も表示されませんが、正しく入力すれば現行のExcel全バージョンで動作します。

注意点2:開始日>終了日で#NUM!エラー

DATEDIFは開始日が終了日より後の日付になると#NUM!エラーを返します。TODAY()を第2引数に使う場合、将来の日付(契約開始日がまだ来ていないなど)を第1引数にすると必ずエラーになります。IFで開始日と終了日の大小を確認してからDATEDIFに渡すか、IFERRORでエラーを処理してください。

注意点3:”MD”引数はうるう年で誤差が出ることがある

DATEDIFの”MD”引数(月・年を無視した日数の端数)は、特定の月末日付の組み合わせで誤った値(−1日など)を返すバグが報告されています。例えば「1月31日~3月1日」の”MD”は実際には1日のはずですが、月によっては誤差が生じることがあります。

対処法:「○年○ヶ月○日」の「○日」部分だけが必要な場合は、DATEDIFの”MD”の代わりに次の式で算出する方が安全です。

' "MD"の代替(月・年を引いた日数の端数)
=DAY(B2) - DAY(A2) + IF(DAY(B2) < DAY(A2), DAY(EOMONTH(A2, 0)), 0)

ただし「○年○ヶ月」までの表示で十分な場合は"Y"と"YM"のみを使えば"MD"のバグは無関係です。

注意点4:日付が文字列として保存されていると誤動作する

「1990/04/15」や「19900415」が文字列として保存されているとDATEDIFは正しく計算できません。セルの左上に緑の三角マーク(エラーインジケーター)が表示されている場合は数値型に変換が必要です。DATEVALUE()関数・「テキストから列へ」・「セルの書式設定」で日付型に変換してから使用してください。

YEARFRAC関数との使い分け

日数ベースの年齢・期間計算にはYEARFRAC関数も使えます。DATEDIFとは計算ロジックが異なるため、用途によって使い分けが必要です。

=YEARFRAC(開始日, 終了日, [基準])
比較項目DATEDIFYEARFRAC
返す値の型整数(年・月・日のいずれか)小数(1.75年など)
年齢計算での使い方=DATEDIF(誕生日, TODAY(), "Y") で満年齢(整数)=INT(YEARFRAC(誕生日, TODAY())) で満年齢(整数)
計算基準の選択カレンダーの実日数ベースで固定実日数/実日数・30/360・30/実など基準を選択可能
財務・利率計算への適合不向き債券計算・年利計算の国際基準に対応可能
公式サポート非公式(Microsoftドキュメント非掲載)公式サポート済み
MOS試験出題稀(出ても知識問題レベル)より出題されにくい(財務系科目向け)

結論:人事・一般業務での満年齢・勤続年数はDATEDIF("Y")が直感的で使いやすいです。財務計算や利率計算が絡む場合はYEARFRACの基準引数で日数計算方式を指定します。

TODAY関数・DATE関数との組み合わせパターン

DATEDIFは単体で使うよりも、TODAY関数やDATE関数と組み合わせることで真価を発揮します。代表的なパターンを示します。

パターン1:今日時点の満年齢を常に最新化する

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

TODAY()はファイルを開くたびに自動更新されるため、常に最新の満年齢が表示されます。「年齢が自動で更新されるリスト」はExcelの定番業務ファイルの一つです。

パターン2:年度末時点の年齢を固定計算する

' 特定年度末(例:2027年3月31日時点)の満年齢
=DATEDIF(B2, DATE(2027, 3, 31), "Y")

年度末・決算期末などの特定日時点での年齢・期間を固定して算出したい場合は、TODAY()の代わりにDATE関数で基準日を指定します。

パターン3:IF関数と組み合わせた入力チェック

' 生年月日が未入力の場合は空白を返す
=IF(B2="", "", DATEDIF(B2, TODAY(), "Y") & "歳")

データ未入力行でDATEDIFを実行すると#VALUE!エラーになります。IFで空白チェックをしてからDATEDIFを実行することで、リスト全体に数式をコピーしても未入力行にエラーが出ません。

エラー別の原因と対処法

エラー主な原因対処法
#NUM!開始日が終了日より後・単位の文字列が不正日付の順序を確認。単位に"Y"/"M"/"D"/"YM"/"YD"/"MD"以外の文字列を指定していないか確認
#VALUE!日付が文字列として保存されている・セルが空白DATEVALUE()で日付型に変換。IFで空白チェックを追加
#NAME?関数名のスペルミス(DATEDIFFと入力するなど)関数名はDATEDIFが正しい(Fは1つ)
意図しない値"MD"引数のバグ・日付の書式設定ミス"MD"の代替式を使用。セルの書式設定で日付型を確認

MOS試験でのDATEDIFと日付計算の出題ポイント

MOS Excel試験においてDATEDIF自体が直接問われることは稀ですが、日付計算スキル全体は「数式と関数の使用」スキル項目で頻出です。試験で実際に出やすい日付関数と組み合わせを確認しておきましょう。

  • TODAY・NOW関数:現在の日付・時刻を返す。TODAY()を使った「今日から○日後」の計算は頻出
  • DATE関数:年・月・日を引数にして日付型を返す。DAY/MONTH/YEAR関数で日付を分解する操作とセット
  • DATEDIF関数:MOS試験では「年齢計算に使われる関数の名前を答える」「引数の単位を選ぶ」知識問題として出る場合がある
  • EDATE・EOMONTH関数:月末・満了日計算。DATEDIFと同様に人事・契約管理場面で出題
  • NETWORKDAYS・WORKDAY関数:営業日ベースの期間計算。DATEDIF(カレンダーベース)との違いを理解する

MOS試験 日付計算関連チェックリスト

確認ポイント操作内容難易度
DATEDIF基本構文の入力=DATEDIF(開始日, 終了日, "Y")を正しく入力できる★★☆
単位引数の使い分け"Y"/"YM"/"MD"の意味と用途を正確に答えられる★★☆
TODAY()との組み合わせTODAY()を第2引数に使い常時更新される年齢計算式を作成できる★☆☆
文字列連結で「○年○ヶ月」表示&演算子でDATEDIF結果と文字列を連結できる★★☆
IFERRORとの組み合わせ期限切れ・空白時のエラーを処理できる★★★
DATEDIFと他日付関数の違いTODAY/DATE/EDATE/NETWORKDAYSとの用途の違いを説明できる★★☆

まとめ:DATEDIFは人事・総務の必須関数

本記事のポイントをまとめます。

  • DATEDIFの役割:開始日と終了日の差を年・月・日単位で返す。満年齢・勤続年数・契約残日数の算出に直結
  • 引数の6種類:"Y"(満年数)/"M"(総月数)/"D"(総日数)/"YM"(月の端数)/"YD"(年無視の日数)/"MD"(日の端数)。実務では"Y"と"YM"のペアが最頻出
  • 非公式関数だが現役:関数の挿入ダイアログには表示されないが、現行Excelで動作する。直接入力すれば問題なく使える
  • "MD"のバグに注意:月・年の端数を無視した日数はうるう年周辺で誤差が出る場合がある。「○日」の精度が必要な場面では代替式の使用を検討する
  • TODAY()との組み合わせ:ファイルを開くたびに年齢・勤続年数が自動更新される。基準日を固定したい場合はDATE関数で指定する
  • YEARFRAC関数との使い分け:人事・一般業務はDATEDIF、財務・利率計算が絡む場合はYEARFRAC
  • IFとIFERRORで堅牢化:空白行・期限切れ・開始日>終了日のケースをIFで事前防止し、想定外の誤りはIFERRORで処理する

DATEDIFを習得すると、社員名簿・契約管理台帳・保証期限リストなど、日付を扱うあらゆる業務ファイルの計算精度が大幅に向上します。TODAY()との組み合わせで「開くたびに最新の情報になる動的リスト」を作り、手動入力ミスを根本からなくしましょう。MOS試験においては日付関数ファミリー全体の相互理解を深めることが得点につながります。

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

この記事を書いた人

目次