契約更新日や支払期日、サブスクリプションの次回請求日など、「基準日から何ヶ月後」「その月の末日」を求める場面は事務作業の中でとても多くあります。こうした計算をDATE関数や単純な足し算で組もうとすると、月によって日数が違う(28日・30日・31日)ことや、うるう年の存在が原因で、意図しない日付になってしまうことがあります。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でよくあるエラー・トラブルと対処法
基準日として参照しているセルが空欄だと、Excel内部では「0」(1900年1月0日相当)として扱われ、そこから月数を引き算すると日付の下限を超えて#NUM!エラーになることがあります。基準日が文字列として入力されている(セルの左寄せで表示されている)場合も、正しく計算されずエラーや誤った結果になります。
対処法として、=IF(A2="", "", EDATE(A2, 12))のように、IF関数で空欄チェックをしてからEDATEを実行する形にしておくと安全です。基準日が文字列扱いになっている場合は、DATEVALUE関数で日付値に変換してから渡すか、そもそも日付として入力し直しましょう。
EDATE・EOMONTHの第2引数は「何ヶ月分ずらすか」を表す数値であり、日付ではありません。初めて使う際に、うっかり比較先の日付セルをそのまま第2引数に入れてしまい、意図しない大きな数値として扱われて極端に離れた日付が返ってくることがあります。
第2引数には「12」「-3」「1」のような整数の月数を指定してください。2つの日付の間が何ヶ月あるかを求めたい場合は、EDATEではなくDATEDIF関数の"m"単位を使うのが適切です。
EDATE・EOMONTHの計算結果は日付のシリアル値として返されますが、セルの表示形式が「標準」のままだと、45678のような数値のまま表示されてしまい、日付だと気づかれないことがあります。
結果セルの表示形式を「日付」に変更してください。数式を入力した直後に自動で日付形式になることもありますが、あらかじめ表示形式を日付に設定してから数式を入力すると確実です。
初心者がつまずきやすいポイントとコツ
- 「暦月」か「日数」かを最初に決める。契約更新日や支払期日のように「同じ日にちの◯ヶ月後」を求めたいのか、納期のように「◯日後」を求めたいのかで、使うべき方法(EDATEか単純な加算か)が変わります。
- 月末を求めたいときは手計算せずEOMONTHに任せる。「翌月1日から1日引く」という手動計算は、月によって結果が変わる分、数式が複雑になりミスの元です。EOMONTH(基準日, 月数)で一発で求められます。
- 2つの日付の差(間隔)を知りたいときはDATEDIFやYEARFRACを使う。EDATE・EOMONTHは「基準日からずらした日付」を求める関数であり、2つの日付の間隔を求める用途には向いていません。
- 結果セルの表示形式を必ず確認する。数値のまま表示されていないか、入力後に一度目視で確認する癖をつけると、後工程での見落としを防げます。
まとめ
EDATE関数は「基準日から〇ヶ月後・〇ヶ月前」の同じ日にちを、EOMONTH関数は「基準日から〇ヶ月後・〇ヶ月前」の月末日を、それぞれ暦の日数差やうるう年を意識せずに正しく計算してくれる関数です。契約更新日や月末締めの支払期日のように、暦月単位で管理すべき日付を単純な日数の足し算で組んでしまうと、月によって結果がずれる原因になります。基準日セルの空欄チェックと、第2引数に月数の整数を渡すという2点さえ押さえておけば、総務・経理の日付管理業務を大きく効率化できる関数です。
よくある質問
関連記事
- DATEDIF関数で勤続年数・年齢を計算する方法|#NUM!エラーの原因と対処法
- YEAR・MONTH・DAY関数の使い方|年度集計がずれる原因と直し方
- NETWORKDAYS関数で稼働日数(営業日数)を計算する方法|祝日リストが反映されない原因と対処法
- TEXT関数で日付・金額の表示形式を自由自在に変える方法|書式コードの意味とよくある失敗