契約更新日や支払期日、サブスクリプションの次回請求日など、「基準日から何ヶ月後」「その月の末日」を求める場面は事務作業の中でとても多くあります。こうした計算をDATE関数や単純な足し算で組もうとすると、月によって日数が違う(28日・30日・31日)ことや、うるう年の存在が原因で、意図しない日付になってしまうことがあります。EDATE関数とEOMONTH関数は、この「暦月単位の計算」を正確かつ簡単に行うための関数です。この記事では、両関数の使い方と、実務でつまずきやすいポイントを解説します。

EDATE・EOMONTHの基本構文

EDATE関数は、基準日から指定した月数だけ前後にずらした「同じ日にち」の日付を返します。EOMONTH関数は、基準日から指定した月数だけ前後にずらした月の「末日」を返します。

=EDATE(開始日, 月数) / =EOMONTH(開始日, 月数)

例:契約開始日が2026年4月15日で、1年後の契約更新日を求める場合
=EDATE(A2, 12) → 2027年4月15日
契約開始月の末日(月末締め日)を求める場合
=EOMONTH(A2, 0) → 2026年4月30日
翌月末を支払期日にする場合
=EOMONTH(A2, 1) → 2026年5月31日

月数にはマイナスの値も指定できます。=EDATE(A2, -3)とすれば「3ヶ月前」の日付が求められるため、契約の更新案内を送るタイミングを逆算する(更新日の1ヶ月前にアラートを出すなど)用途にも使えます。

「日数を足す」計算との使い分け

EDATE・EOMONTHのような暦月単位の関数と、単純に日数を加算する方法は、どちらも「先の日付」を求める点は同じですが、適した場面が異なります。

EDATE・EOMONTH(暦月単位)

  • 「1ヶ月後」「3ヶ月後」など暦の月数で計算
  • 契約更新日・請求サイクル・月末締めに向く
  • 月の日数差・うるう年を自動で吸収する

日付+日数(例:+30)

  • 「〇日後」という厳密な日数で計算
  • 納期・保証期間・配送予定日に向く
  • 月をまたぐと基準日によって着地月がずれる

たとえば「契約は1年ごとに自動更新」という条件であれば、365を足すのではなくEDATE(開始日, 12)を使うべきです。うるう年をまたぐ契約では365日と1年(12ヶ月)が一致しないため、+365で計算すると更新日が本来より1日ずれてしまう年が出てきます。

実務でのよくある使用シーン

総務担当者であれば、賃貸契約やリース契約の一覧表で、契約開始日からEDATE関数を使って自動更新日・満了日を算出し、更新案内を出すべき時期をIF関数と組み合わせて自動でハイライトする、という運用がよく見られます。経理担当者であれば、「月末締め・翌月末払い」という取引条件をEOMONTH(請求日, 1)で自動計算し、支払期日を手入力せずに請求書発行日から自動で算出する場面で重宝します。人事担当者であれば、試用期間の満了日(入社日からEDATEで3ヶ月後を計算)や、資格の有効期限管理にも応用できます。

EDATE・EOMONTHでよくあるエラー・トラブルと対処法

#NUM!エラー(基準日セルが空欄・文字列のまま)

基準日として参照しているセルが空欄だと、Excel内部では「0」(1900年1月0日相当)として扱われ、そこから月数を引き算すると日付の下限を超えて#NUM!エラーになることがあります。基準日が文字列として入力されている(セルの左寄せで表示されている)場合も、正しく計算されずエラーや誤った結果になります。

例:まだ契約開始日が未入力のA2セルに対して=EDATE(A2, 12)を組むと#NUM!エラーになる

対処法として、=IF(A2="", "", EDATE(A2, 12))のように、IF関数で空欄チェックをしてからEDATEを実行する形にしておくと安全です。基準日が文字列扱いになっている場合は、DATEVALUE関数で日付値に変換してから渡すか、そもそも日付として入力し直しましょう。

第2引数に日付を入れてしまう間違い

EDATE・EOMONTHの第2引数は「何ヶ月分ずらすか」を表す数値であり、日付ではありません。初めて使う際に、うっかり比較先の日付セルをそのまま第2引数に入れてしまい、意図しない大きな数値として扱われて極端に離れた日付が返ってくることがあります。

誤り例:=EDATE(A2, B2) ※B2に日付が入っていると数万ヶ月分ずれた日付になる

第2引数には「12」「-3」「1」のような整数の月数を指定してください。2つの日付の間が何ヶ月あるかを求めたい場合は、EDATEではなくDATEDIF関数の"m"単位を使うのが適切です。

結果がシリアル値(数値)のまま表示される

EDATE・EOMONTHの計算結果は日付のシリアル値として返されますが、セルの表示形式が「標準」のままだと、45678のような数値のまま表示されてしまい、日付だと気づかれないことがあります。

例:=EDATE(A2, 12)の結果セルが「2027/4/15」ではなく「46127」と表示される

結果セルの表示形式を「日付」に変更してください。数式を入力した直後に自動で日付形式になることもありますが、あらかじめ表示形式を日付に設定してから数式を入力すると確実です。

初心者がつまずきやすいポイントとコツ

まとめ

EDATE関数は「基準日から〇ヶ月後・〇ヶ月前」の同じ日にちを、EOMONTH関数は「基準日から〇ヶ月後・〇ヶ月前」の月末日を、それぞれ暦の日数差やうるう年を意識せずに正しく計算してくれる関数です。契約更新日や月末締めの支払期日のように、暦月単位で管理すべき日付を単純な日数の足し算で組んでしまうと、月によって結果がずれる原因になります。基準日セルの空欄チェックと、第2引数に月数の整数を渡すという2点さえ押さえておけば、総務・経理の日付管理業務を大きく効率化できる関数です。

よくある質問

EDATE関数で#NUM!エラーが出るのはなぜですか?
EDATE関数は、計算結果がExcelで扱える日付の範囲(1900年1月1日以降)を外れると#NUM!エラーになります。よくあるのは、第1引数の基準日を空欄セルのまま参照してしまい、0(1900年1月0日扱い)から大きくマイナスの月数を引いてしまうケースです。基準日のセルが本当に日付として入力されているか、参照先が空欄になっていないかを確認してください。また、第2引数に日付そのものを入れてしまう誤りもよく見られます。第2引数は「何ヶ月分ずらすか」という数値です。
「30日後」を+30で計算するのとEDATEで1ヶ月後を計算するのは何が違いますか?
日付に30を足す方法は、月によって日数が28日から31日までばらつくため、基準日によって「1ヶ月後」からずれてしまいます。たとえば1月31日に30を足すと3月2日になり、1ヶ月後のつもりが翌々月にずれ込みます。EDATE関数は暦の上での「同じ日にちの1ヶ月後」を正しく計算するため、契約更新日や支払期日のように暦月単位で管理したい日付にはEDATEを使うべきです。日数単位で厳密に管理したい場合(納期を30日後にするなど)は、そのまま+30の加算で問題ありません。
月末が31日の月と30日の月が混在していても、EOMONTHなら正しく計算できますか?
はい。EOMONTH関数は、指定した月の実際の末日(28日・29日・30日・31日のいずれか)を自動で判定して返します。うるう年の2月末(29日)も正しく計算されるため、DATE関数で「翌月の1日から1日引く」といった手動計算をする必要がありません。月末締め・翌月末払いのような支払条件を数式化する際は、EOMONTHを使うことでうるう年や月ごとの日数差を意識せずに済みます。

関連記事

→ 日付関数の数式を作ってみる ← 記事一覧に戻る