スプレッドシートで月末日を求める|EOMONTH関数と支払期日の計算

スポンサーリンク

「月末締め・翌月末払い」の支払期日、毎回カレンダーを見ながら手入力していませんか?

月末は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)+12024/2/1(木)
翌月初日=EOMONTH(A2,0)+1=EOMONTH(TODAY(),0)+12024/3/1(金)
月の日数=DAY(EOMONTH(A2,0))=DAY(EOMONTH(TODAY(),0))29
翌々月10日=EOMONTH(A2,1)+10=EOMONTH(TODAY(),1)+102024/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/29DATE で月末を作る書き方

「Nヶ月後の同じ日付」がほしいときは、EDATE関数の出番です。31日を起点にしたときの扱いなど、詳しくはEDATE関数の記事で解説しています。

DATE(年,月+2,0) は、「翌々月の0日」がその前日、つまり翌月末日になる性質を使った書き方です。結果は EOMONTH と同じですが、式が長くなります。

月末を出すだけなら、EOMONTH のほうが読みやすいでしょう。共有シートで後から見返す人にも、意図が伝わりやすい書き方です。

EOMONTHがうまくいかないときの対処(数字表示・文字列日付・空白行)

日付ではなく数字が表示される

EOMONTH の結果が数字で表示されたら、セルの表示形式が数値になっています。値は正しいので、表示形式を日付に変えれば解決しますよ。

  1. 結果のセル(列)を選択します。
  2. メニューの「表示形式」→「数字」→「日付」を選びます。

文字列の日付でエラーになる(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) で、今月の末日を表示するところから試してみてください。

タイトルとURLをコピーしました