「契約開始日から3ヶ月後の満了日を出したい」「定期点検の次回日程をまとめて計算したい」――日付に月数を足す作業、手計算でやっていませんか?
月によって日数がバラバラなので、3ヶ月後が何月何日になるか意外と迷いますよね。2月を挟むとさらにややこしくなります。
そんなときに使いたいのがスプレッドシートのEDATE関数です。開始日と月数を指定するだけで、Nヶ月後・Nヶ月前の日付を正確に返してくれます。
この記事では基本の書き方から、契約管理・定期点検などの実務活用例、EOMONTH・DATE関数との使い分けまで紹介します。
スプレッドシートのEDATE関数とは?Nヶ月後の日付を返す関数
EDATE関数(読み方: イーデイト関数)は、指定した日付からNヶ月後(またはNヶ月前)の日付を返す関数です。
名前は英語の「Extended DATE(拡張された日付)」の略です。
たとえば「2026/1/15」の3ヶ月後を求めると「2026/4/15」が返ります。月数にマイナス値を指定すれば過去の日付も取得できます。
EDATE関数でできることをまとめると、次のとおりです。
- 基準日からNヶ月後の同日を自動計算する
- マイナス値でNヶ月前の日付も取得できる
- 月末日が存在しない場合は自動で月末に調整される
- TODAY関数と組み合わせて「今日からN ヶ月後」を動的に計算する
NOTE
EDATE関数はGoogleスプレッドシートの全バージョンで使えます。Excelでも同じ構文で動作するので、ファイル共有時も安心です。
EDATE関数の基本の書き方
構文と引数
=EDATE(開始日, 月数)
カッコの中に「開始日」と「月数」を入れるだけです。引数は2つとも必須です。
引数の詳細
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 開始日 | 必須 | 基準となる日付(セル参照や日付値) |
| 月数 | 必須 | 加算する月数(正の値で未来、負の値で過去) |
月数には整数を指定します。小数を入れた場合は小数部が切り捨てられます。たとえば「2.7」を指定すると「2」として扱われます。
EDATE関数の基本的な使い方
もっともシンプルな使い方です。A1に「2026/1/15」が入っているとします。

=EDATE(A1, 3)
!_images/spreadsheet-edate-function/02_formula_edate-basic.png
結果は「2026/4/15」です。1月15日の3ヶ月後なので、4月15日が返ります。

マイナス値を指定すれば過去の日付も取得できます。
=EDATE(A1, -2)
結果は「2025/11/15」です。2ヶ月前の日付が返りますよ。
TODAY関数と組み合わせれば「今日から6ヶ月後」も簡単です。
=EDATE(TODAY(), 6)
スプレッドシートを開くたびに自動で更新されます。契約期限のアラート管理に便利ですよ。
実務で使えるEDATE関数の活用例3選
契約開始日から満了日を自動計算する
契約管理でもっとも多いパターンです。A列に契約開始日、B列に契約月数が入っているとします。
| A列(契約開始日) | B列(契約月数) | C列(満了日) | |
|---|---|---|---|
| 1 | 2026/1/15 | 3 | =EDATE(A1,B1) → 2026/4/15 |
| 2 | 2026/4/1 | 6 | =EDATE(A2,B2) → 2026/10/1 |
| 3 | 2026/7/10 | 12 | =EDATE(A3,B3) → 2027/7/10 |

月数をセル参照にすれば、3ヶ月契約でも6ヶ月契約でも同じ数式で対応できます。
満了日の30日前にアラートを出す数式も組み合わせてみましょう。
=IF(EDATE(A1,B1)-TODAY()<=30, "更新確認", "")
IF関数(条件に応じて値を切り替える関数)で満了日と今日の差が30日以下になったら「更新確認」と表示します。
定期点検の次回日程を自動計算する
設備やシステムの定期点検スケジュールにも活用できます。A列に前回点検日、B列に点検間隔(月数)が入っているとします。
| A列(前回点検日) | B列(間隔) | C列(次回点検日) | |
|---|---|---|---|
| 1 | 2026/2/10 | 3 | =EDATE(A1,B1) → 2026/5/10 |
| 2 | 2026/3/1 | 6 | =EDATE(A2,B2) → 2026/9/1 |
| 3 | 2026/1/20 | 1 | =EDATE(A3,B3) → 2026/2/20 |
点検が完了したらA列を最新の日付に更新すれば、次回日程も自動で再計算されます。
Nヶ月前の日付を求める(月数にマイナス値)
「過去6ヶ月分のデータを抽出したい」ときに開始日を求められます。
=EDATE(TODAY(), -6)
今日が2026/3/19なら、結果は「2025/9/19」です。
FILTER関数(条件に合うデータだけを抽出する関数)と組み合わせると便利です。A列に日付、B列に売上が入っているとします。
=FILTER(A:B, A:A>=EDATE(TODAY(),-6))
直近6ヶ月分のデータだけが抽出されます。日付の境界が毎日自動で動くので、レポートの更新作業が不要になりますよ。
ARRAYFORMULA関数と組み合わせて複数行まとめて計算する
契約日や点検日が何十行も並んでいると、1行ずつEDATE関数をコピーするのは面倒ですよね。そんなときはARRAYFORMULA関数と組み合わせると便利です。
ARRAYFORMULA関数は、範囲を渡すだけで全行に同じ計算を一括適用してくれる関数です。1つの数式で列全体を処理できます。
A2からA10に契約開始日が入っていて、それぞれの3ヶ月後をC列にまとめて出す例です。
=ARRAYFORMULA(EDATE(A2:A10, 3))
C2に入力するだけで、A2〜A10の各日付から3ヶ月後の日付が一気に表示されます。行ごとに数式をコピーする必要はありません。
ただし、このままだとデータが入っていない空白行に「1900/1/3」のような変な日付が出てしまいます。空白セルをゼロ(つまり日付の起点)として計算してしまうためです。
そこでIF関数で空白を判定して回避します。
=ARRAYFORMULA(IF(A2:A="", "", EDATE(A2:A, 3)))
A列が空白の行は空白のまま、日付が入っている行だけ3ヶ月後を計算します。A2:A のように行番号を省略して列全体を指定すれば、後からデータを追加しても自動で計算されますよ。
月数もセル参照にしたいときは、月数の列を範囲で渡します。A列が開始日、B列が契約月数の場合です。
=ARRAYFORMULA(IF(A2:A="", "", EDATE(A2:A, B2:B)))
これで「3ヶ月契約は3ヶ月後、6ヶ月契約は6ヶ月後」と、行ごとに異なる月数でまとめて計算できます。契約一覧表の満了日を1つの数式で管理できるので、メンテナンスがぐっと楽になります。
EDATE関数の月末日の自動調整を理解する
EDATE関数の重要な特徴が「月末日の自動調整」です。
開始日が1月31日で1ヶ月後を求める場合を見てみましょう。
=EDATE("2026/1/31", 1)
結果は「2026/2/28」です。2月には31日がないため、自動的に2月の末日(28日)に調整されます。
これがDATE関数との大きな違いです。同じ計算をDATE関数でやると結果が変わります。
=DATE(YEAR(A1), MONTH(A1)+1, DAY(A1))
A1が「2026/1/31」の場合、結果は「2026/3/3」です。2月31日は存在しないため、3日分が3月にロールオーバー(繰り越し)されます。
具体的な比較を見てみましょう。
| 開始日 | 月数 | EDATE関数の結果 | DATE関数の結果 |
|---|---|---|---|
| 2026/1/31 | +1 | 2026/2/28(月末に調整) | 2026/3/3(ロールオーバー) |
| 2026/1/31 | +2 | 2026/3/31(31日がある月はそのまま) | 2026/3/31(同じ結果) |
| 2026/3/31 | +1 | 2026/4/30(月末に調整) | 2026/5/1(ロールオーバー) |
| 2026/1/29 | +1 | 2026/2/28(月末に調整) | 2026/3/1(ロールオーバー) |

月末日が絡む計算では、EDATE関数のほうが直感的な結果を返してくれます。「3月31日の1ヶ月後は4月30日」と解釈されるのは自然ですよね。
TIP
「月末日を必ず月末に維持したい」場合はEDATE関数、「厳密に同じ日付を保ちたい」場合はDATE関数と使い分けましょう。
EOMONTH関数との使い分け
EDATE関数とよくセットで紹介されるのがEOMONTH関数(読み方: イーオーマンス関数)です。
EOMONTH関数は「Nヶ月後の月末日」を返す関数です。構文はEDATE関数とほぼ同じです。
=EOMONTH(開始日, 月数)
両者の違いを比較表で整理しましょう。
| 項目 | EDATE関数 | EOMONTH関数 |
|---|---|---|
| 返す日付 | Nヶ月後の同日 | Nヶ月後の月末日 |
| 2026/1/15の2ヶ月後 | 2026/3/15 | 2026/3/31 |
| 2026/1/31の1ヶ月後 | 2026/2/28(月末に調整) | 2026/2/28(月末日) |
| 主な用途 | 契約満了日・次回点検日 | 月末締め・支払期日 |
| 月末の扱い | 存在しない日は月末に調整 | 常に月末日を返す |
使い分けの目安はシンプルです。
- 「Nヶ月後の同じ日」がほしい → EDATE関数
- 「Nヶ月後の月末日」がほしい → EOMONTH関数
たとえば「毎月15日が支払日」ならEDATE関数、「毎月末が締め日」ならEOMONTH関数を選びます。
NOTE
当月の末日を求めるだけなら
=EOMONTH(TODAY(), 0)が最も簡単です。DATE関数の=DATE(YEAR(TODAY()), MONTH(TODAY())+1, 0)でも同じ結果が得られますが、EOMONTHのほうが数式がシンプルですよ。
WORKDAY関数との使い分け
「Nヶ月後」ではなく「N営業日後」を求めたいときは、EDATE関数ではなくWORKDAY関数を使います。
WORKDAY関数は、開始日から指定した営業日数(土日を除いた日数)だけ進んだ日付を返す関数です。構文は次のとおりです。
=WORKDAY(開始日, 日数, [休日])
EDATE関数とWORKDAY関数は、どちらも「未来の日付」を計算しますが、数える単位がまったく違います。EDATE関数はカレンダーの月単位、WORKDAY関数は土日を除いた営業日単位です。
両者を比較表で整理しましょう。
| 項目 | EDATE関数 | WORKDAY関数 |
|---|---|---|
| 数える単位 | 月数(カレンダー月) | 営業日数(日単位) |
| 土日の扱い | 区別せず同日を返す | 土日をスキップする |
| 祝日の考慮 | なし | 休日リストを指定可能 |
| 2026/1/15から | +1ヶ月 → 2026/2/15 | +10営業日 → 2026/1/29 |
| 向いている用途 | 契約満了日・定期更新・Nヶ月後の日付 | 請求支払期限・納品日・検収期限 |
使い分けの基準は「月で数えるか、営業日で数えるか」のひと言に尽きます。
- 「3ヶ月後」「半年後」など月単位で考える → EDATE関数
- 「10営業日以内」「5営業日後」など営業日単位で考える → WORKDAY関数
たとえば「契約満了は6ヶ月後」ならEDATE関数、「請求書発行から10営業日以内に入金」ならWORKDAY関数が適しています。土日や祝日をまたぐ納期管理では、営業日で数えるWORKDAY関数のほうが実態に合いますよ。
EDATE関数のよくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
| #VALUE! | 開始日が日付として認識されていない | セルの値が日付型か確認する。文字列の場合はDATEVALUE関数(日付文字列を日付値に変換する関数)で変換する |
| #VALUE! | 月数に数値以外が入っている | 月数のセルに文字列が混ざっていないか確認する |
| 数字が表示される | 表示形式が「数値」になっている | セルの表示形式を「日付」に変更する |
開始日が文字列になっているとき
「2026/1/15」と手入力した値が文字列として認識されるケースがあります。セルの左上に小さな三角マークが出ていたら文字列の可能性があります。
=EDATE(DATEVALUE("2026/1/15"), 3)
DATEVALUE関数で文字列を日付値に変換すれば解決します。ただし最初からDATE関数で日付を作成するほうが確実です。
日付でなく数字が表示されるとき
EDATE関数の結果が「46112」のような数字で表示される場合は、セルの表示形式が「数値」になっています。
セルを選択して「表示形式」メニューから「日付」を選べば正しく表示されます。関数自体は正常に動作しているので安心してください。
EDATE関数に関するよくある質問
Q1. 結果が数値で表示される場合はどうすればよいですか?
セルの表示形式を「日付」に変更してください。EDATE関数は内部的に日付シリアル値(1900年からの通算日数)を返すため、セルが数値書式のままだと「46112」のような数字で表示されます。
セルを選択して「表示形式」メニューから「日付」を選べば、正しい日付表示に切り替わります。関数の計算結果は正常なので、見た目の問題だけですよ。
Q2. ExcelのEDATE関数と同じ構文で使えますか?
はい、まったく同じ構文で使えます。=EDATE(開始日, 月数) という書き方はExcelとGoogleスプレッドシートで完全に共通です。
月末日の自動調整など、動作仕様も同じです。ExcelファイルをGoogleスプレッドシートに取り込んでも、EDATE関数を含む数式はそのまま動作するので、ファイル共有時も安心してください。
Q3. 月数に小数を指定するとどうなりますか?
小数点以下が切り捨てられます。たとえば =EDATE(A1, 2.6) は =EDATE(A1, 2) と同じ結果になり、2ヶ月後の日付が返ります。
「1.5ヶ月後」のような半月単位の計算はEDATE関数ではできません。日数で調整したい場合は、結果に日数を足す(例: =EDATE(A1,1)+15)といった工夫が必要です。
Q4. 年単位で加算するにはどうすればよいですか?
月数に12の倍数を指定します。1年は12ヶ月なので =EDATE(A1, 12) で1年後、=EDATE(A1, 24) で2年後、=EDATE(A1, 36) で3年後の日付が求められます。
「契約は2年更新」のような年単位の管理では、=EDATE(A1, 契約年数*12) のように年数に12を掛ける書き方にすると、セルに年数を入れるだけで計算できて便利ですよ。
Q5. 負の月数を使って過去の日付を求められますか?
求められます。月数にマイナス値を指定すると、その分だけ過去の日付が返ります。=EDATE(A1, -3) ならA1から3ヶ月前の日付です。
「3ヶ月前の月初から集計したい」「半年前のデータ開始日を出したい」といった過去基準の計算で活躍します。TODAY関数と組み合わせた =EDATE(TODAY(), -6) なら、常に「今日から半年前」を動的に求められますよ。
まとめ
EDATE関数は、指定した日付からNヶ月後・Nヶ月前の日付を返す関数です。
ポイントを整理します。
- 構文は
=EDATE(開始日, 月数)の2引数。月数にマイナス値で過去の日付も取得できる - 月末日が存在しない場合は自動で月末に調整される(1/31の1ヶ月後は2/28)
- 契約満了日・定期点検日・データ抽出期間の計算に最適
- ARRAYFORMULA関数と組み合わせれば、列全体の日付を1つの数式で一括計算できる
- 「Nヶ月後の同日」はEDATE関数、「Nヶ月後の月末日」はEOMONTH関数
- 「N営業日後」を求めたいときはWORKDAY関数を使う
- DATE関数はロールオーバーするため月末日の扱いに注意
- DATEDIF関数は逆に「2つの日付の差を月数で計算する」ときに使う
まずは =EDATE(TODAY(), 3) で今日から3ヶ月後の日付を求めるところから試してみてください。
