「契約開始日から3ヶ月後の満了日を出したい」「入社日から試用期間の終了日を知りたい」。スプレッドシートの台帳で、こうした日付の計算に手間取っていませんか?
月ごとに日数が違うので、○ヶ月後を手で数えるとズレやすいもの。1月31日の1ヶ月後のように、存在しない日付が絡むとさらに迷いますよね。
そこで使えるのが、スプレッドシートのEDATE関数です。開始日と月数を渡すだけで、○ヶ月後・○ヶ月前の日付が返ってきます。
この記事では、やりたいこと別の数式早見表と月末の扱いをまず押さえます。後半では、ARRAYFORMULAで台帳の列をまとめて計算する方法と、困ったときの対処法を紹介します。
スプレッドシートのEDATE関数とは|○ヶ月後・○ヶ月前の日付を返す
EDATE関数(読み方: イーデイト)は、開始日から指定した月数だけ進めた日付を返す関数です。月数をマイナスにすれば、○ヶ月前の日付も出せます。
たとえば「2026/1/15」の3ヶ月後なら「2026/4/15」。日はそのままで、月だけを動かすのが基本の動きです。移動先の月にその日がないときは、その月の末日に合わせてくれます。
構文と引数(=EDATE(開始日, 月数))
書き方はシンプルで、カッコの中に開始日と月数を入れるだけです。
=EDATE(開始日, 月数)
引数は2つあり、どちらも省略できません。
| 引数 | 必須/任意 | 指定するもの |
|---|---|---|
| 開始日 | 必須 | 基準になる日付。日付が入ったセルや、DATE関数などで作った日付 |
| 月数 | 必須 | 動かす月数。プラスで未来、マイナスで過去 |
開始日には、日付が入ったセルを指定するのが基本です。Googleの公式ヘルプでは、関数で作った日付も渡せると案内されています。DATE・DATEVALUE・TO_DATE など、日付を返す関数が対象です。
対応バージョン: Googleスプレッドシート。ExcelでもEDATE関数は使えます(Excel 2007以降は標準搭載。2003以前は分析ツールの追加が必要)。
やりたいこと別 数式早見表
A2に開始日「2026/1/15」が入っている場合の数式をまとめました。検索してきた目的に近い行から、そのまま使ってみてください。
| やりたいこと | 数式 | 結果(A2=2026/1/15) |
|---|---|---|
| 3ヶ月後 | =EDATE(A2, 3) | 2026/4/15 |
| 6ヶ月前 | =EDATE(A2, -6) | 2025/7/15 |
| 1年後 | =EDATE(A2, 12) | 2027/1/15 |
| 今日から3ヶ月後 | =EDATE(TODAY(), 3) | シートを開いた日で変わる |
| 3ヶ月後の前日(満了日) | =EDATE(A2, 3)-1 | 2026/4/14 |
| 3ヶ月後の月末 | =EOMONTH(A2, 3) | 2026/4/30 |
1年後は「12ヶ月後」として月数で指定するのがポイント。満了日の「前日」と「月末」の違いは、実務例の節で詳しく見ていきます。
EDATE関数の基本の使い方と月末日の扱い
ここからは、基本の書き方を1つずつ確認していきます。どれも数式は短いので、手元のシートで試しながら読んでみてください。
セル参照で○ヶ月後を出す
A2に開始日「2026/1/15」、B2に月数「3」が入っているとします。C2に次の数式を入れましょう。
=EDATE(A2, B2)
結果は「2026/4/15」です。月数をセルに分けておけば、B2を書き換えるだけで6ヶ月後や12ヶ月後に切り替えられます。
マイナスの月数で○ヶ月前を出す
月数にマイナスの値を入れると、過去の日付が返ります。
=EDATE(A2, -2)
A2が2026/1/15なら、結果は「2025/11/15」。年をまたぐ場合も、年の繰り下がりまで自動で計算してくれます。
TODAY関数と組み合わせて今日から○ヶ月後を出す
開始日にTODAY関数を使うと、「今日から○ヶ月後」をいつでも最新の日付で出せます。
=EDATE(TODAY(), 6)
今日が2026/10/21なら、結果は「2027/4/21」です。シートを開いた日に合わせて結果が変わるので、期限までの目安を確認する欄に向いています。
ただし、契約日のように記録として残す日付にTODAYを使うのは避けましょう。翌日には値が変わってしまいます。
月末日は自動で調整される
EDATE関数の大事な特徴が、月末日の自動調整です。開始日の「日」が移動先の月に存在しないとき、その月の末日が返ります。
では、同じ計算をDATE関数で書くとどうなるでしょうか。=DATE(YEAR(A2), MONTH(A2)+1, DAY(A2)) では、はみ出した日数が翌月に繰り越されます。
| 開始日 | 月数 | EDATEの結果 | DATE関数の結果 |
|---|---|---|---|
| 2026/1/31 | 1 | 2026/2/28(月末に調整) | 2026/3/3(繰り越し) |
| 2026/1/29 | 1 | 2026/2/28(月末に調整) | 2026/3/1(繰り越し) |
| 2026/3/31 | 1 | 2026/4/30(月末に調整) | 2026/5/1(繰り越し) |
| 2026/1/31 | 2 | 2026/3/31(そのまま) | 2026/3/31(同じ) |
| 2024/1/31 | 1 | 2024/2/29(うるう年の月末) | 2024/3/2(繰り越し) |
| 2024/2/29 | 12 | 2025/2/28(月末に調整) | 2025/3/1(繰り越し) |
2024年はうるう年なので、1/31の1ヶ月後は2/29になります。うるう日の2/29から1年後は、2025年に2/29がないため2/28です。
「3/31の1ヶ月後は4/30」のほうが、実務の感覚に近いはず。月をまたぐ期日を出すなら、DATE関数よりEDATE関数が扱いやすいでしょう。
TIP
EDATEの結果にさらにEDATEを重ねると、月末がずれることがあります。1/31の1ヶ月後は2/28で、その1ヶ月後は3/28です。毎月の日付を並べるときは
=EDATE(開始日, 2)のように、開始日から累計の月数で計算しましょう。
月数の小数は切り捨てられる
公式ヘルプによると、月数の小数部分は切り捨てられます。=EDATE(A2, 2.6) は =EDATE(A2, 2) と同じ結果です。
落とし穴になりやすいのが、年数の列をそのまま月数に渡すケース。「1.5(年)」を渡すと、18ヶ月後ではなく1ヶ月後として扱われます。年数の列を使うなら、=EDATE(A2, C2*12) のように12を掛けて月数に直してから渡しましょう。
半月のような細かい指定もできません。15日後まで足したいなら、=EDATE(A2, 1)+15 のように日数を後から足します。マイナスの小数は0の方向への切り捨てです。=EDATE(A2, -1.5) は =EDATE(A2, -1) と同じで、A2が2026/1/15なら2025/12/15になります(-2ではありません)。
実務で使えるEDATE関数の活用例
ここでは、契約・支払・試用期間・リマインドの4パターンを順に見ていきます。続いて契約台帳の列をARRAYFORMULAで一括計算し、最後に近い関数との使い分けを整理します。
契約満了日は「○ヶ月後の前日」で出す
開始日を1日目として数える契約では、満了日は「○ヶ月後の前日」になります。4/1開始の1年契約なら、満了日は翌年の3/31です。
=EDATE(A2, B2)-1
EDATE(A2, B2) だけだと翌年の4/1になり、1日ずれてしまいます。ただ、満了日の数え方は契約ごとに異なるもの。-1を付けるかどうかは、契約書の期間の定めに合わせて決めてください。
支払期日・試用期間の終了日を出す
支払期日が「請求日の2ヶ月後の同日」なら、そのままEDATEで出せます。
=EDATE(A2, 2)
一方、「翌月末払い」のように月末で締める条件なら、EOMONTHのほうが向いています。請求日が2026/10/21なら、=EOMONTH(A2, 1) の結果は2026/11/30です。=EDATE(A2, 1) では2026/11/21になり、月末にはなりません。
試用期間の終了日も、契約満了日と同じ考え方です。入社日が2026/4/1で試用期間が3ヶ月なら、=EDATE(A2, 3)-1 で2026/6/30。こちらも就業規則の数え方に合わせて、-1の有無を決めましょう。
○ヶ月前のリマインド日を出す
「満了日の1ヶ月前に更新案内を出す」といった運用では、マイナスの月数を使います。C2に満了日が入っているなら、次の数式です。
=EDATE(C2, -1)
満了日が2027/3/31なら、リマインド日は2027/2/28。ここでも月末の自動調整が働きます。リマインド日を過ぎたら目印を出したい場合は、IF関数と組み合わせましょう。
=IF(TODAY()>=EDATE(C2, -1), "更新案内", "")
過去の一定期間を抽出したいときも、同じ考え方が使えます。A列に日付、B列に売上がある表から、直近6ヶ月分を取り出す数式です。
=FILTER(A2:B, A2:A>=EDATE(TODAY(), -6))
今日が2026/10/21なら、2026/4/21以降の行が残ります。境界の日付が毎日自動で動くため、レポートの期間を手で直す必要はありません。
ARRAYFORMULAで台帳の列をまとめて計算する
行が増えるたびに数式をコピーするのは手間です。ARRAYFORMULA関数で囲めば、1つの数式で列全体を計算できます。
まずは範囲を固定した基本形。C2に入れると、A2〜A10それぞれの3ヶ月後が縦に並ぶ想定です。
=ARRAYFORMULA(EDATE(A2:A10, 3))
ただ、このままではA列が空白の行にも日付が出てしまいます。空白が0、つまり日付の起点(1899/12/30)とみなされるためです。3ヶ月後なら、空白の行には1900/3/30という意味のない古い日付が返ります。
実務では空白判定のIFを付けて、月数もB列から行ごとに渡しましょう。満了日を出すので、最後に-1も入れます。
=ARRAYFORMULA(IF(A2:A="", "", EDATE(A2:A, B2:B)-1))
なお、IFで空文字と混ぜたこの式の結果は、日付ではなくシリアル値の数字で表示されます(2026/4/14なら「46126」)。結果の列を選んで、「表示形式」→「数字」→「日付」に変えてください。
D列のリマインド日も、満了日の列を参照して同じ形で一括計算できます。こちらも数字で出るので、同じように日付へ変えます。
=ARRAYFORMULA(IF(C2:C="", "", EDATE(C2:C, -1)))
C2とD2にこの2つを入れた台帳は、次のとおりです。
| 行 | A 開始日 | B 月数 | C 満了日 | D 更新案内日(1ヶ月前) |
|---|---|---|---|---|
| 2 | 2026/1/15 | 3 | 2026/4/14 | 2026/3/14 |
| 3 | 2026/4/1 | 12 | 2027/3/31 | 2027/2/28 |
| 4 | 2026/7/10 | 6 | 2027/1/9 | 2026/12/9 |
| 5 | 2026/10/1 | 24 | 2028/9/30 | 2028/8/30 |
| 6 | (空白) | (空白) | (空白) |
3ヶ月契約も2年契約も、1本の数式で行ごとに違う月数を計算できるのが便利なところ。A2:A のように終わりの行番号を省けば、あとから追加した行にも自動で広がります。
月数が未入力の行も空白にしたいなら、条件を (A2:A="")+(B2:B="") に変えてください。どちらかが空白の行は計算されなくなります。
NOTE
ARRAYFORMULAの結果が広がる先のセル(C3以下など)に値が残っていると、展開できずにエラーになります。数式を入れる列の下は空けておきましょう。
EOMONTH・WORKDAYとの使い分け
EDATEは「月単位で、同じ日」を出す関数です。月末や営業日を基準にしたいときは、別の関数を選びましょう。
| やりたいこと | 使う関数 | 2026/1/15起点の例 |
|---|---|---|
| ○ヶ月後の同じ日 | EDATE | =EDATE(A2, 2) → 2026/3/15 |
| ○ヶ月後の月末 | EOMONTH関数 | =EOMONTH(A2, 2) → 2026/3/31 |
| ○営業日後(土日を除く) | WORKDAY関数 | =WORKDAY(A2, 10) → 2026/1/29 |
契約満了日や次回点検日ならEDATE、月末締めの支払期日ならEOMONTH。「10営業日以内に納品」のような期限はWORKDAYと覚えておくと迷いません。
EDATE関数がうまくいかないときの対処法とExcelとの違い
EDATEの数式自体は短いぶん、うまくいかない原因は開始日の渡し方や表示形式に集まりがちです。症状別に原因と対処を見ていきましょう。
日付ではなく数値で表示される
結果が「46127」のような数字で出たら、セルの表示形式が数値になっています。=EDATE(A2, 3) のように単独で使うと日付で表示されますが、次のような式は数字で返ります。
IF(…, "", EDATE(…))のように空文字と混ぜたARRAYFORMULA=EDATE(A2, 1)+MOD(A2, 1)のように時刻を足した式
スプレッドシートの日付は、1899/12/30を0とした通し番号(シリアル値)で管理されています。46127は2026/4/15を表すシリアル値で、計算そのものは合っています。
対処は、表示形式を日付に変えるだけ。
- 結果のセルを選択する
- メニューの「表示形式」→「数字」→「日付」を選ぶ
#VALUE! エラーになる
#VALUE! が出るときは、開始日か月数が数値として読めていない可能性があります。
| 原因 | 確認方法 | 対処 |
|---|---|---|
| 開始日が文字列になっている | =ISNUMBER(A2) がFALSEになる | =EDATE(DATEVALUE(A2), 3) のように日付へ変換する |
| 月数のセルに文字が入っている | 「3ヶ月」のように単位まで入力している | 月数のセルは数字だけにする |
外部から貼り付けたデータやCSVの取り込みでは、日付が文字列のまま入ることがあります。左寄せで表示されている日付は、まずISNUMBERで確かめてみてください。
空白行に古い日付が出る
開始日が空白のセルをEDATEに渡すと、空白が0として扱われます。=EDATE(空白セル, 3) は1900/3/30、5ヶ月後なら1900/5/30です。ARRAYFORMULAで列全体を指定したときに目立つ症状で、開始日も月数も空白の行は、起点の1899/12/30が返ります。
1セルずつの数式なら、IFで空白を判定して回避します。
=IF(A2="", "", EDATE(A2, 3))
列全体を一括計算する場合は、前の節で紹介した IF(A2:A="", "", …) の形を使ってください。
日付を数式に直接入力すると結果がおかしくなる
=EDATE(2026/1/31, 1) のように引用符なしで日付を書くと、公式ヘルプのとおり割り算として扱われます。「2026÷1÷31」で約65という小さな数になり、結果は1900/4/5という、まったく違う古い日付になります。
引用符で囲んだ "2026/1/31" は、日付として解釈され、=EDATE("2026/1/31", 1) は2026/2/28を返します。ただ、公式ヘルプが案内する渡し方ではありません(ISNUMBER("2026/1/31") はFALSEで、文字列のままです)。数式の中に日付を直接書くなら、DATE関数で組み立てるのが確実です。
=EDATE(DATE(2026, 1, 31), 1)
結果は2026/2/28。月末の自動調整も、セル参照のときと同じように働きます。
Excel版のEDATE関数との違い
構文と基本の動き(小数の切り捨て・月末の調整)は、ExcelとGoogleスプレッドシートで共通です。違いが出るのは、日付の起点や列の一括計算のやり方です。
| 項目 | Googleスプレッドシート | Excel |
|---|---|---|
| 構文 | =EDATE(開始日, 月数) | 同じ |
| 月数の小数 | 切り捨て | 切り捨て |
| 月末の調整 | 1/31の1ヶ月後は2/28 | 同じ |
| 日付の起点 | 1899/12/30が0 | 1900/1/1が1 |
| 結果の表示 | 単独なら日付で表示。IFと混ぜたARRAYFORMULAなどは数字になるので表示形式を「日付」に変更 | シリアル値で返り、表示形式で日付にする |
| 列の一括計算 | ARRAYFORMULAで囲む | 1セルずつコピーが基本(範囲を渡したときの挙動は版で異なる) |
| 開始日が文字列 | DATEVALUEで変換すると確実 | 問題が起きることがある(公式の注意書き) |
起点の数え方は違っても、現在の日付なら両者のシリアル値は同じ数字になります。ファイルをやり取りしても、通常の業務の日付で結果がずれることはまずありません。
Excelで使う場合の手順や画面は、ExcelのEDATE関数の使い方で解説しています。
EDATE関数に関するよくある質問
年単位(2年後・3年後)で足すには?
月数に12の倍数を指定します。2年後なら =EDATE(A2, 24)、3年後なら =EDATE(A2, 36) です。
C列に年数を入れている台帳なら、=EDATE(A2, C2*12) と書けば年数を変えるだけで計算できます。年単位の期間を小数で求めたいなら、YEARFRAC関数を試してみてください。
時刻付きの日付を渡すと時刻はどうなる?
結果の時刻は落ちます。2026/1/15 14:30に =EDATE(A2, 1) を使うと、返るのは「2026/2/15 0:00」です。時刻まで残したい場合は、元の時刻部分を足し戻します。
=EDATE(A2, 1)+MOD(A2, 1)
MODで取り出しているのは、シリアル値の小数部分(時刻)です。結果は数字(46068.604…)で表示されるので、表示形式を「日時」にすると14:30まで確認できます。
○ヶ月後の月末や月初を出すには?
月末なら、使い分けの表で紹介したEOMONTHの出番。=EOMONTH(A2, 3) で、A2の3ヶ月後の月末が返ります。
月初が欲しいときは、前の月の月末に1を足すのが定番。A2が2026/1/15なら、=EOMONTH(A2, 2)+1 で3ヶ月後の月初「2026/4/1」が出ます。
まとめ
スプレッドシートのEDATE関数は、開始日から○ヶ月後・○ヶ月前の日付を返す関数です。ポイントを振り返っておきましょう。
- 構文は
=EDATE(開始日, 月数)。マイナスの月数で過去の日付も出せる - 移動先の月にその日がないときは月末に調整される(1/31の1ヶ月後は2/28)
- 月数の小数は切り捨て。年数は12を掛けて整数の月数で渡す
- 契約満了日は「○ヶ月後の前日」になることが多く、
=EDATE(A2, B2)-1で出せる - 台帳では
=ARRAYFORMULA(IF(A2:A="", "", EDATE(A2:A, B2:B)-1))で列を一括計算 - 数値で表示されたら表示形式を「日付」に、数式に日付を直接書くならDATE関数で
逆に「2つの日付の間が何ヶ月か」を数えたいときは、DATEDIF関数の出番です。年齢や営業日など、ほかの日付計算もまとめて知りたい方はスプレッドシートの日付計算ガイドへ。シーン別に使う関数を整理しています。
まずは手元の台帳で、=EDATE(A2, 3) から試してみましょう。

