「月末締め・翌月末払い」の支払期日、毎回カレンダーを見ながら手入力していませんか?
月末は28日・29日・30日・31日と月ごとに変わります。うるう年の2月や、期日が土日に重なる月は特に間違えやすいところです。
スプレッドシートで月末日を出すなら、使うのはこの1式。A2 に基準日を入れておけば、その月の末日が返ってきます。
=EOMONTH(A2,0)
この記事では、月末を起点にした実務の式をまとめました。月初日・月の日数・翌月末払いの支払期日まで、コピペで使える形にしています。ARRAYFORMULA で列ごと一括計算する書き方や、期日が土日のときの前倒しもあわせて見ていきましょう。
スプレッドシートのEOMONTH関数とは?月末日を返す書式と引数
EOMONTH関数は、基準日から指定した月数だけ前後した「月の末日」を返す関数です。読み方は「イーオーマンス」で、End of Month(月の終わり)の略になります。
Googleスプレッドシートでも、Excel と同じ書式で使えます。月ごとの日数やうるう年は関数側で判定されるので、2月が28日か29日かを調べる必要はありません。
書式と引数(月数の符号・小数は切り捨て)
=EOMONTH(開始日, 月数)
| 引数 | 内容 | 例 |
|---|---|---|
| 開始日 | 基準になる日付。日付セルか、DATE関数などで作った日付 | A2、DATE(2024,2,10) |
| 月数 | 何ヶ月後の月末か。0で当月末、正の数で後、負の数で前 | 0、1、-1 |
月数に小数を入れると、小数部分は切り捨てです。公式ヘルプでも、EOMONTH(A2,2.6) は EOMONTH(A2,2) と同じと説明されています。
開始日として認識されるのは、数値として扱われる日付だけ。日付の入ったセル参照か、DATE・DATEVALUE のような日付を返す関数で渡しましょう。
NOTE
式の中に 2024/2/10 のように日付を直書きすると、割り算として計算されてしまいます。公式ヘルプにも、EOMONTH(10/10/2000,1) を 10÷10÷2000 と解釈する例が載っています。式の中で日付を指定するときは DATE(2024,2,10) の形にしてください。
戻り値は日付(数字に見えたら表示形式を変える)
EOMONTH が返すのは日付の値です。セルの表示形式によっては、日付ではなく数字で表示されることがあります。
値そのものは正しいので、慌てなくて大丈夫。直し方は後半の「うまくいかないときの対処」で紹介します。
スプレッドシートで月末・月初・月の日数を出す早見表
月末を起点にすると、月初日や月の日数もまとめて出せます。よく使う式を、基準日セル A2 を使う版と TODAY() を使う版の2系統で並べました。
右端の列は、A2 に 2024/2/10(土)を入れたときの結果です。2024年はうるう年なので、2月末は29日になります。( )内の曜日は確認用に添えました。
| 求めたいもの | 基準日セル A2 版 | TODAY() 版 | A2=2024/2/10 の結果 |
|---|---|---|---|
| 当月末 | =EOMONTH(A2,0) | =EOMONTH(TODAY(),0) | 2024/2/29(木) |
| 翌月末 | =EOMONTH(A2,1) | =EOMONTH(TODAY(),1) | 2024/3/31(日) |
| 翌々月末 | =EOMONTH(A2,2) | =EOMONTH(TODAY(),2) | 2024/4/30(火) |
| 先月末 | =EOMONTH(A2,-1) | =EOMONTH(TODAY(),-1) | 2024/1/31(水) |
| 月初日 | =EOMONTH(A2,-1)+1 | =EOMONTH(TODAY(),-1)+1 | 2024/2/1(木) |
| 翌月初日 | =EOMONTH(A2,0)+1 | =EOMONTH(TODAY(),0)+1 | 2024/3/1(金) |
| 月の日数 | =DAY(EOMONTH(A2,0)) | =DAY(EOMONTH(TODAY(),0)) | 29 |
| 翌々月10日 | =EOMONTH(A2,1)+10 | =EOMONTH(TODAY(),1)+10 | 2024/4/10(水) |
| 月末営業日 | =WORKDAY(EOMONTH(A2,0)+1,-1) | =WORKDAY(EOMONTH(TODAY(),0)+1,-1) | 2024/2/29(木) |
基準日が月末ちょうどなら、当月末はその日のまま返ります。たとえば 2025/3/31 を入れると、当月末は 2025/3/31、翌月末は 2025/4/30 です。
TODAY()で当月末を自動更新する
TODAY関数と組み合わせると、基準日を入力しなくても今月末が出せるのがメリット。
=EOMONTH(TODAY(),0)
TODAY は、再計算のたびに今日の日付を返す関数です。月が変われば結果も翌月の末日に切り替わるので、月次レポートの「締め日」欄を毎月書き換える手間がなくなります。
ただし、過去の請求書の期日には向きません。TODAY 版は日付が動き続けるため、発行日ごとに固定したい期日は A2 版で計算するのが基本です。
月初日と月の日数(DAY関数)
月初日は「先月末の翌日」と考えると簡単です。EOMONTH(A2,-1) で先月末を出し、1を足せば当月の1日になります。
=EOMONTH(A2,-1)+1
月の日数は、月末日の「日」の部分そのもの。DAY関数で月末日から日を取り出すと、28〜31の数値が返ります。
=DAY(EOMONTH(A2,0))
日割り計算の分母にそのまま使えるのが便利なところです。月額が B2、利用日数が C2 なら、=B2*C2/DAY(EOMONTH(A2,0)) で日割り額が出せますよ。
月末締め・翌月末払いの支払期日を列ごと自動計算
ここからは、請求書の一覧表で支払期日を出す例です。A列に発行日を入れると、B〜D列に締め日・支払期日・土日を避けた期日が出る形にします。
請求書一覧の例(発行日→締め日→支払期日)
| A:発行日 | B:締め日 | C:支払期日(翌月末) | D:土日なら直前の平日 | |
|---|---|---|---|---|
| 式(2行目) | 手入力 | =EOMONTH(A2,0) | =EOMONTH(A2,1) | =WORKDAY(C2+1,-1) |
| 2行目 | 2024/1/15(月) | 2024/1/31(水) | 2024/2/29(木) | 2024/2/29(木) |
| 3行目 | 2024/2/10(土) | 2024/2/29(木) | 2024/3/31(日) | 2024/3/29(金) |
| 4行目 | 2025/3/31(月) | 2025/3/31(月) | 2025/4/30(水) | 2025/4/30(水) |
行コピー版なら、B2〜D2 に式を入れて下の行へコピーするだけです。3行目のように翌月末が日曜に当たると、D列では直前の金曜に前倒しされます。
ARRAYFORMULA版と空白除外の安全版
行が増えるたびに式をコピーするのは面倒ですよね。ARRAYFORMULA を使えば、1つの式で列ごと計算できます。
ただし、A2:A をそのまま渡すと、発行日をまだ入れていない空白行にも式が展開されます。意図しない値が並ぶことがあるので、IF で空白行を除外した安全版を使いましょう。
=ARRAYFORMULA(IF(A2:A="","",EOMONTH(A2:A,0)))
B2 にこの式を1つ入れるだけで、A列に日付がある行だけ締め日が出る想定です。C列の支払期日は、月数を1に変えるだけです。
=ARRAYFORMULA(IF(A2:A="","",EOMONTH(A2:A,1)))
ARRAYFORMULA は、結果を下のセルへ自動で広げます。展開先のセルに値が残っているとエラーになるので、B3 以降は空けておいてください。
D列の WORKDAY は、行コピー版で入れておくと安心です。列一括にしたい場合は、数行のテストデータで結果が揃うかを先に確かめましょう。
翌々月10日払いと月末営業日・休日の前倒し(WORKDAY)
「月末締め・翌々月10日払い」なら、翌月末に10を足します。翌月末の翌日が翌々月の1日なので、+10 でちょうど翌々月の10日になる仕組みです。
=EOMONTH(A2,1)+10
A2 が 2024/2/10 なら 2024/4/10(水)、2025/3/31 なら 2025/5/10(土)になります。後者のように土日に当たる場合は、WORKDAY関数で調整しましょう。
=WORKDAY(期日+1,-1)
これは「期日の翌日から1営業日さかのぼる」式です。期日が平日ならその日のまま、土日なら直前の金曜日が返ります。2025/5/10(土)の場合は、2025/5/9(金)になる計算です。
月末営業日も同じ考え方で、=WORKDAY(EOMONTH(A2,0)+1,-1) と書けます。2024年2月なら月末の29日が木曜なので、答えはそのまま 2024/2/29。
WARNING
第3引数を省いた WORKDAY は、土日だけを休日として扱います。祝日も避けたい場合は、祝日の一覧を別の範囲に用意してください。そのうえで WORKDAY(期日+1,-1,祝日の範囲) のように第3引数で渡します。
逆に「休日なら翌営業日に後ろ倒し」という契約なら、=WORKDAY(期日-1,1) を使います。2024/3/31(日)が期日なら、2024/4/1(月)が返る計算です。
EDATE・DATE関数との使い分け
月をまたぐ日付計算には、EOMONTH のほかに EDATE や DATE の組み合わせも使えます。返ってくる日付の基準が違うので、目的で選び分けましょう。
| 方法 | 返す日付 | A2=2024/1/15 の結果 | 向いている用途 |
|---|---|---|---|
=EOMONTH(A2,1) | 1ヶ月後の月末 | 2024/2/29 | 締め日・支払期日 |
=EDATE(A2,1) | 1ヶ月後の同じ日 | 2024/2/15 | 契約更新日・定期タスク |
=DATE(YEAR(A2),MONTH(A2)+2,0) | 1ヶ月後の月末 | 2024/2/29 | DATE で月末を作る書き方 |
「Nヶ月後の同じ日付」がほしいときは、EDATE関数の出番です。31日を起点にしたときの扱いなど、詳しくはEDATE関数の記事で解説しています。
DATE(年,月+2,0) は、「翌々月の0日」がその前日、つまり翌月末日になる性質を使った書き方です。結果は EOMONTH と同じですが、式が長くなります。
月末を出すだけなら、EOMONTH のほうが読みやすいでしょう。共有シートで後から見返す人にも、意図が伝わりやすい書き方です。
EOMONTHがうまくいかないときの対処(数字表示・文字列日付・空白行)
日付ではなく数字が表示される
EOMONTH の結果が数字で表示されたら、セルの表示形式が数値になっています。値は正しいので、表示形式を日付に変えれば解決しますよ。
- 結果のセル(列)を選択します。
- メニューの「表示形式」→「数字」→「日付」を選びます。
文字列の日付でエラーになる(DATEVALUE・DATEで直す)
開始日のセルが日付に見えても、中身が文字列になっている場合も。他のシステムから貼り付けた日付や、書式なしテキストのセルに入れた日付がよくある例ですね。公式ヘルプによると、EOMONTH が認識するのは数値形式の日付だけです。文字列のままでは、エラーや意図しない結果になるおそれがあります。
対処の1つ目は、DATEVALUE で日付の値に直してから渡す方法です。
=EOMONTH(DATEVALUE(A2),0)
文字列の形式によっては、DATEVALUE でも読み取れないことがあります。その場合は DATE関数で日付を組み立て直しましょう。たとえば =EOMONTH(DATE(2024,2,10),0) なら 2024/2/29 が返ります。
空白行に意味のない日付が出る
開始日が空白のセルに EOMONTH を使うと、空白が日付の0のように扱われ、意図しない日付やエラーが出ることがあります。行コピー版なら、IF で空白を除外しておきましょう。
=IF(A2="","",EOMONTH(A2,0))
ARRAYFORMULA で列一括にする場合は、前の章で紹介した安全版がそのまま使えます。
月初が1日ずれる・月数が大きすぎる
月初日の式で +1 を忘れると、1日前の前月末が返ります。結果が1日ずれていたら、=EOMONTH(A2,-1)+1 の形になっているか見直してみてください。
月数に極端に大きな値を入れると、日付として扱える範囲を超えてエラーになるおそれがあります。月数を別セルから参照しているなら、そのセルに年や金額が入っていないか確認しましょう。
よくある質問(FAQ)とまとめ
月初日の求め方は?
=EOMONTH(A2,-1)+1 で求められます。先月末の翌日が当月の1日になる、という考え方です。今月の月初がほしいなら、A2 を TODAY() に置き換えてください。
うるう年は自動で判定される?
はい、EOMONTH 側で判定されます。=EOMONTH(DATE(2024,2,1),0) は 2024/2/29、=EOMONTH(DATE(2025,2,1),0) は 2025/2/28 です。
Excelとの違いは?
EOMONTH(開始日, 月数) という書式は、Excel と同じです。一方で、ARRAYFORMULA で列ごと計算する書き方はGoogleスプレッドシート側のもの。Excel で使う場合はExcelのEOMONTH関数の記事を参考にしてください。
まとめ
スプレッドシートの月末計算は、EOMONTH を起点にするとよく使う実務式の多くを組み立てられます。
- 当月末は =EOMONTH(A2,0)、翌月末は =EOMONTH(A2,1)
- 月初日は =EOMONTH(A2,-1)+1、月の日数は =DAY(EOMONTH(A2,0))
- 翌々月10日払いは =EOMONTH(A2,1)+10
- 土日を避けるなら =WORKDAY(期日+1,-1)(祝日は第3引数で指定)
- 列一括は =ARRAYFORMULA(IF(A2:A=””,””,EOMONTH(A2:A,0)))
年齢・日数・営業日など、ほかの日付計算はスプレッドシートの日付計算ガイドでシーン別に整理しています。まずは =EOMONTH(TODAY(),0) で、今月の末日を表示するところから試してみてください。
