EOMONTH

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

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

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

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

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

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

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


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

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

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

1番面倒な「1月の場合営業日まで数日延ばします」から
例)=EOMONTH(TODAY(),1) 結果は2017/8/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月かどうか

=IF(EOMONTH(TODAY(),1)=1,EOMONTH(TODAY(),1)+DAY(5),EOMONTH(TODAY(),1))
ここの偽に土曜なら+2を組み込みます

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

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

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

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



以上から分かりやすく簡潔にします
  A B C D E F
1            
2   請求日 7月24日 支払い期限 2017/9/30  
3            
4   期限 曜日
5   7月24日 2017 7 24
6   7月25日 2017 7 25
7   7月26日 2017 7 26
から 請求日を セルC2
支払い期限を セルE2とします

月末締め翌月末払いの場合
セルE2
=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))))

月末締め翌々月末払いの場合
セルE2
=IF(EOMONTH(C2,2)=1,EOMONTH(C2,2)+DAY(5),IF(WEEKDAY(EOMONTH(C2,2))=7,EOMONTH(C2,2)+DAY(2),IF(WEEKDAY(EOMONTH(C2,2))=1,EOMONTH(C2,2)+DAY(1),EOMONTH(C2,2))))

DAYTOPEOMONTH
(C) 2001-2017 Digital World