EOMONTH

EOMONTH(イーオーマンス)は、開始日から起算して、指定された月数だけ前または後の月の最終日に対応するシリアル値を返します。
EOMONTH 関数は、月末に発生する満期日や支払い日の計算に役立ちます。
読み方はEOMONTH(イーオーマンス)ですがエンド・オブ・マンスの略なので覚えやすいです
・関数EOMONTH
・書式=EOMONTH(開始月,月数)
・内容開始日から起算して、指定された月数だけ前または後の月の最終日に対応するシリアル値を返します
使い方
EOMONTH 関数は、月末に発生する満期日や支払い日の計算に役立ちます。
 例)=EOMONTH(TODAY(),1) 結果は2018/7/31
 例)=EOMONTH(TODAY(),2) 結果は2018/8/31

サンプル
  A B C D E F
1            
2   請求日 6月19日 支払い期限 2018/8/31  
3            
4   期限 曜日
5   6月19日 2018 6 19
6   6月20日 2018 6 20
7   6月21日 2018 6 21
指定した日(開始月)から何ヵ月後の月末の日を出します
例)E2の数式 請求日から2ヵ月後の月末
=EOMONTH(C2,2) 結果は 2018/8/31
日時のシリアル値で返されますので年月日で表示したい場合セルの初期設定で変更できます

シリアル値での表示で年月日表示だとエクセルのバージョン違いやコピーしたときに数値化される場合は関数で年月日表示にします
下記の方法はサンプルのように支払い期限などピンポイントの設定時に有効ですが、 日付がシリアル値でなく年月日表示になりますからすべてに設定すると日時のシリアル値としての計算はできなくなります。

まず日付のシリアル値を取得
EOMONTH(C2,2)

年月日の取得方法
年 YEAR(C2) 
月 MONTH(C2) 
日 DAY(C2)

これだと別のセルが必要になります

全部を1つにまとめます
=YEAR(EOMONTH(C2,2))&"年"&MONTH(EOMONTH(C2,2))&"月"&DAY(EOMONTH(C2,2))&"日" 結果 2018年8月31日


もし結果が土日など休日の場合翌日まで延ばします

月末から月初に祭日は1月だけなので
1月は別に計算します

以下の3つを設定します
・土曜日の場合2日延ばします
・日曜日の場合1日延ばします
・1月の場合営業日まで数日延ばします

1番面倒な「1月の場合営業日まで数日延ばします」から
例)=EOMONTH(TODAY(),1) 結果は2018/7/31

ここからだと来月が何月かわかりません
しかし日時はシリアル値で取得されますので

=EOMONTH(TODAY(),1)を
=MONTH(シリアル値)
と組合わせて
=MONTH(EOMONTH(TODAY(),1))
これで来月が取得できます

これが1の時だけ営業日まで5日などのばします
5日間延ばすのは
=EOMONTH(TODAY(),1)+DAY(5)
これが5日延ばした時の数式になります

=IF(論理式,真の場合,偽の場合)

論理式 EOMONTH(TODAY(),1)=1
真の場合 EOMONTH(TODAY(),1)+DAY(5)
偽の場合 EOMONTH(TODAY(),1)

=IF(EOMONTH(TODAY(),1)=1,EOMONTH(TODAY(),1)+DAY(5),EOMONTH(TODAY(),1))
となります

これで「1月の場合営業日まで5日延ばします」がクリアします

次に「土曜日の場合2日延ばします」
=EOMONTH(TODAY(),1)
上記から曜日を取得して土曜の場合2日延ばします

=EOMONTH(TODAY(),1)
上記が土曜の場合を取得します
=WEEKDAY(EOMONTH(TODAY(),1))
WEEKDAY関数で土曜は7なので

=IF(論理式,真の場合,偽の場合)

論理式 WEEKDAY(EOMONTH(TODAY(),1))=7
真の場合 EOMONTH(TODAY(),1)+DAY(2)
偽の場合 EOMONTH(TODAY(),1)

=IF(WEEKDAY(EOMONTH(TODAY(),1))=7,EOMONTH(TODAY(),1)+DAY(2),EOMONTH(TODAY(),1))

となります

最後に「日曜日の場合1日延ばします」は
土曜と同じように日曜は1なので

=IF(論理式,真の場合,偽の場合)

論理式 WEEKDAY(EOMONTH(TODAY(),1))=1
真の場合 EOMONTH(TODAY(),1)+DAY(1)
偽の場合 EOMONTH(TODAY(),1)

=IF(WEEKDAY(EOMONTH(TODAY(),1))=1,EOMONTH(TODAY(),1)+DAY(1),EOMONTH(TODAY(),1))
となります

これで3つをクリアしたのでくみあわせれば、、と思いますが
まだ1つ残ってます
「1月の場合営業日まで数日延ばします」が延ばした先が土日だった場合です

IF関数で優先順位をつけて
まず1月かどうか、偽なら土曜、偽なら日曜の順序にします

=IF(論理式,真の場合,偽の場合)

論理式に1月かどうか


ここの偽に土曜なら+2を組み込みます


さらにこの偽に日曜なら+1を組み込みます


以上 完成です
土曜なら+2日、日曜なら+1日、1月は5日以降で土日の場合はプラスします



以上から分かりやすく簡潔にします(表は今日請求日翌々月 月末支払い)
  A B C D E F
1            
2   請求日 6月19日 支払い期限 2018/8/31  
3            
4   期限 曜日
5   6月19日 2018 6 19
6   6月20日 2018 6 20
7   6月21日 2018 6 21
から 請求日を セルC2
支払い期限を セルE2とします

月末締め翌月末 支払期限の場合
セルE2


月末締め翌々月末 支払期限の場合
セルE2


支払期限が月末とは限りません
月末締め翌々月20日 支払期限の場合
翌月末払いの月末を取得したところに20日足せばいい(1月の5日プラスは不要になります)
=IF(EOMONTH(C2,1)=1,EOMONTH(C2,1)+DAY(5),IF(WEEKDAY(EOMONTH(C2,1))=7,EOMONTH(C2,1)+DAY(2),IF(WEEKDAY(EOMONTH(C2,1))=1,EOMONTH(C2,1)+DAY(1),EOMONTH(C2,1))))
上記「月末締め翌月末払いの場合」から「1月の5日プラス」取ります
=IF(WEEKDAY(EOMONTH(C2,1))=7,EOMONTH(C2,1)+DAY(2),IF(WEEKDAY(EOMONTH(C2,1))=1,EOMONTH(C2,1)+DAY(1),EOMONTH(C2,1)))

ここから月末を取得してる「EOMONTH(C2,1)」に「+20」20日足してDAY()も+20増やしてください =IF(WEEKDAY(EOMONTH(C2,1)+20)=7,EOMONTH(C2,1)+DAY(20),IF(WEEKDAY(EOMONTH(C2,1)+20)=1,EOMONTH(C2,1)+DAY(20),EOMONTH(C2,1)+20))
これで月末締め翌々月20日支払期限になります

月末締め翌々月10日支払期限の場合は上記の「+20」の3か所を「+10」に変更、DAY()も+10してください
=IF(WEEKDAY(EOMONTH(C2,1)+10)=7,EOMONTH(C2,1)+DAY(10),IF(WEEKDAY(EOMONTH(C2,1)+10)=1,EOMONTH(C2,1)+DAY(10),EOMONTH(C2,1)+10))



普通に10日締め、20日締め、末締めなら
「DATE」「YEAR」「MONTH」を使うのが一般的ですが
12月の月末は年末です。
また振込みなら期限が土日は無理です
締めの月や曜日を判断して日数を足すのは式が長くなります
もっと簡単な方法があるかもしれませんが参考にしてください

以上 EOMONTHの使い方でした

WEEKDAYTOPHOUR
(C) 2001-2018 Digital World