年単位または月単位の契約をして、その期間満了の前に解約の意思を示さなければ同じ期間、同じ条件で自動更新される契約というのはたくさんあります(アパート、インターネット、ジム、スマホ、はてなブログPro・・・)。逆に更新の手続きをしなければ契約が終わってしまうものもあります。
このような契約の場合、最初の契約日から年単位または月単位で加算して、今日の日付を超える(または超えない)日付を求めなければなりません。年単位または月単位で日付を加算するEDATE関数、今日までの年数または月数を求めるDATEDIF関数、さらにその年数または月数を倍数で切り捨てるFLOOR関数の3つの知識が必要となります(それぞれの関数の使い方については説明を省略します)。
そこで、今回は、EDATE関数で年単位または月単位で加算した時に、本日の日付(または基準日)に最も近い日付を求める方法について出題します。
目次
1.EDATE関数(復習)
問題
セルB1に入力した日付を基準日として、2年後、4年後、6年後・・・の日付を求めなさい。ただし、応当日が無い時は月末とする(以下、同じ)。
解説
2年後(=24か月後)の日付を求めるにはEDATE関数を使います(参考:【Excel日付】月単位や年単位の加算、EDATE関数の使い方基本編)。
- =EDATE($B$1,A4*24)
2.年単位、月単位で加算して現在に最も近い日付
(1)次回の誕生日
問題
セルB1に入力した日付を生年月日として、次回の誕生日を求めなさい。また、次回の誕生日までの残り日数を求めなさい。
解説
現在の満年齢はDATEDIF関数で求めることができます。
- =DATEDIF(B1,TODAY(),"Y")
次回の誕生日には現在の満年齢+1の年齢となりますので、生年月日の(現在の満年齢+1)年後となります。
したがって、EDATE関数で次回の誕生日を求めることができます。
- =EDATE(B1,(DATEDIF(B1,TODAY(),"Y")+1)*12)
TODAYを引けば次回誕生日までの残り日数となります。
- =EDATE(B1,(DATEDIF(B1,TODAY(),"Y")+1)*12)-TODAY()
(2)現在を超えない最も近い日付
問題
セルB1に入力した日付に、本日の日付を超えないように3か月単位で加算したとする。現在に最も近い日付を求めなさい。
解説
セルB1の日付から3か月ずつ加算していき、本日の日付を超えるまで加算するのを続け、本日の日付を超えたら加算するのをやめます。
これも、さきほどの誕生日と同じように、DATEDIF関数で月数を求めます。
- =DATEDIF(B1,TODAY(),"M")
これを3で切り捨てると加算すべき月数となります。
- =FLOOR(DATEDIF(B1,TODAY(),"M"),3)
したがって、求める日付はEDATE関数で求められます。
- =EDATE(B1,FLOOR(DATEDIF(B1,TODAY(),"M"),3))
(3)現在を超えた最も近い日付
問題
セルB1に入力した日付に2年単位で加算し、本日の日付を超えたところで加算するのをやめたとする。このときの日付を求めなさい。
解説
セルB1の日付から2年単位で加算していき、本日の日付を超えたところで加算するのをやめます。
本日の日付を超えない日付はさきほどの問題と同様に求められます。開始日から今日までの年数を2の倍数で切り捨てると加算すべき年数になります。EDATE関数を用いる場合は、年数なので12倍します。
- =EDATE(B1,FLOOR(DATEDIF(B1,TODAY(),"Y"),2)*12)
その2年後(24か月後)が求める日付です。
- =EDATE(B1,FLOOR(DATEDIF(B1,TODAY(),"Y"),2)*12+24)
*補足*
細かい話ですが、本日の日付がちょうど応当日(契約更新日)の場合、2年後の日付になります。
これで正しいのですが、もし応当日の場合に次回ではなく本日の日付を表示したいのであれば、基準日を昨日にすればよいです。
- =EDATE(B1,FLOOR(DATEDIF(B1,TODAY()-1,"Y"),2)*12+24)
3.基準日に合わせて加算
問題
セルB1に生年月日、セルB2に免許取得日を入力したとする。免許取得日の24時が経過した後、3回目の誕生日を迎える日を求めなさい。
解説
まず、免許取得日を超えて初めての誕生日を求めます。求め方は前述のとおりです。
- =EDATE(B1,(DATEDIF(B1,B2,"Y")+1)*12)
その2年後が求める誕生日です。
- =EDATE(B1,(DATEDIF(B1,B2,"Y")+3)*12)
4.初回だけ加算する月数、年数が異なる場合
問題
セルB1に入力した日付に最初だけ5年加算し、その後は2年単位で加算し、本日の日付を超えたところで加算するのをやめたとする。このときの日付を求めなさい。
解説
セルB1の日付から2年単位で加算していき、本日の日付を超えたところで加算するのをやめます。ただし、最初に加算するときだけ5年とします。
まず、今日までの年数を計算し、5年を引きます。これは初回更新日からTODAYまでの年数です。
- =DATEDIF(B1,TODAY(),"Y")-5
さらに、2の倍数で切り捨ててから7年を足します(本日を超えないように加算するのであれば5年加算すればよいですが、本日を超えるまで加算するので7年加算する)。
- =FLOOR(DATEDIF(B1,TODAY(),"Y")-5,2)+7
ただし、加算する年数の下限は5年なので、MAX関数で下限を設定します(参考:【Excel関数】最大なのに下限のMAX、最小なのに上限のMIN)。
- =MAX(FLOOR(DATEDIF(B1,TODAY(),"Y")-5,2)+7,5)
これで完成です。
- =EDATE(B1,MAX(FLOOR(DATEDIF(B1,TODAY(),"Y")-5,2)+7,5)*12)
5.EOMONTH関数を使ったほうが良い事例
問題
セルB1に入力した日付に2年単位で加算し、本日の日付を超えたところで加算するのをやめたとする。その月の21日の日付を求めなさい。
解説
2年ごとに加算したときの次回更新日をEDATE関数で求めると、前述のとおり、次のような式になります。
- =EDATE(B1,FLOOR(DATEDIF(B1,TODAY(),"Y"),2)*12+24)
しかし、日にちを固定する場合はEDATE関数ではなく、EOMONTH関数を使うべきです。前月末に21日を加算すればよいです。
- =EOMONTH(B1,FLOOR(DATEDIF(B1,TODAY(),"Y"),2)*12+23)+21
解説は以上です。