わえなび ワード&エクセル問題集

当サイトはWordとExcelの実力を鍛える最高水準の特訓問題集です。リンクを張るのは自由です。みんなで勉強しましょう!

月または年単位の期間の「終了日」をEDATE関数で計算するための基礎知識【Excel】

鉄道などの定期券の有効期限、賞味期限、文書の保存期限、契約更新日など期間の最終日を求めるとき、開始日に月単位または年単位の期間を加算して求めます。そして、通常は開始日の前日の日にちが終了日になります。例えば、開始日が1月28日の場合、終了日は1月27日となります。しかし、2月30日や11月31日のように存在しない日になってしまった場合の処理が難しいです。

ところで、この最終日の計算方法は誰かが勝手に決めているのではなく、日本の「法律」で明確に定められています。ExcelのEDATE関数を用いて期間の終了日を求める場合も、民法をはじめとする期間計算の規定を理解したうえで計算するべきです。

そこで、今回は、月単位または年単位で期間計算を行うための基本的な法律の知識と、EDATE関数を用いた終了日の計算方法について解説します。

目次

1.EDATE関数の基本

EDATE関数の基本的な使い方についてはこちらの記事をご覧ください。

 

2.応当日とは何か

(1)期間計算は民法に従うこと

日本の民事法で最も重要な法律は「民法」です。特に、期間計算は民法総則第6章の規定に従って計算するのが原則です(民法138条)。

(2)応当日がある場合と無い場合に分けて考えること

例えば、1月10日の1か月後は2月10日、2か月後は3月10日です。毎月「10日」は必ず存在します。このように年や月だけを変えたときに対応する日(該当する日)のことを「応当日(おうとうび)」と言います。漢字にご注意ください。「応答」ではありません。

f:id:waenavi:20200407101024j:plain

 

ところが、7月31日の2か月後の9月31日は存在しません。Excelで期間満了日を計算するときは必ず、応当日がある場合と無い場合に分けて考えなければなりません。

f:id:waenavi:20200407101346j:plain

 

3.応当日がある場合の満了日

常に月初(1日)または月の途中から始まることが分かっている場合は、必ず応当日がありますので計算するのが簡単です。

(1)月初から始まる場合

問題

「2021年2月1日から4か月間」の場合、期間の終了日と満了時刻を求めなさい。

f:id:waenavi:20200407102047j:plain

 

解説

4か月間とはいっても月によって日数が異なるので、単に120日を加算すればいいというわけではありません。

f:id:waenavi:20200407102233j:plain

 

民法143条1項は「週、月又は年によって期間を定めたときは、その期間は、暦に従って計算する。」と定めています。簡単に言えば、カレンダーで考えるということです。2月1日から始まる4か月間とはカレンダーのとおり、2月・3月・4月・5月のことです。したがって、終了日は5月31日(末日)になるはずです。

f:id:waenavi:20200407102820j:plain

 

月単位で加算する場合はEDATE関数を使います。しかし、EDATE関数で2月1日の4か月後を求めると6月1日になってしまいます。EDATE関数は応当日を求める関数なので当然のことです。

  • =EDATE(A1,4)

f:id:waenavi:20200407102435j:plain

 

その前日なので1を引きます。

  • =EDATE(A1,4)-1

f:id:waenavi:20200407102457j:plain

 

民法141条によると「期間は、その末日の終了をもって満了する」ので、期間満了時刻は5月31日の24時となります。

f:id:waenavi:20200407102537j:plain

 

(2)月の途中から始まる場合

問題

「2021年2月14日から4か月間」の場合、期間の終了日を求めなさい。

f:id:waenavi:20200407102726j:plain

 

解説

2月の途中から始まる場合の4か月間とは、カレンダーでは最初の月をカウントせず、3月・4月・5月・6月のことです。したがって、終了の月は6月です。4か月間ではなく4か月後と考えたほうが分かりやすいかもしれません。

f:id:waenavi:20200407103058j:plain

 

そして、民法によると、「期間は、最後の週、月又は年においてその起算日に応当する日の前日に満了する」ことになっています(民法143条2項本文)。簡単に言えば「応当日の直前まで」ということです。2月14日に応当する日は6月14日です。その前日の6月13日が終了日です。

f:id:waenavi:20200417205504j:plain

 

応当日はEDATE関数で求められます。

  • =EDATE(A1,4)

f:id:waenavi:20200407103234j:plain

 

「応当する日の前日に満了する」ので、1を引きます。期間満了は2021年6月13日の24時です。

  • =EDATE(A1,4)-1

f:id:waenavi:20200407103258j:plain

 

(3)応当日がある場合は応当日の前日

結局のところ、期間の終了日は、月数を加算した応当日の前日なので「EDATE-1」で求められるということです。ただし、この求め方は応当日が必ず存在することが分かっている場合、つまり1日~28日の場合に限ります。

f:id:waenavi:20200407103321j:plain

 

4.応当日が無い場合

(1)月単位の場合

問題

「2021年10月30日から4か月間」の場合、期間の終了日を求めなさい。

f:id:waenavi:20200407103449j:plain

 

解説

10月30日の4か月後は翌年2月30日ですが存在しません。このように応当日が存在しない場合、上記のルールでは終了日が求められないので問題となります。

f:id:waenavi:20200407103743j:plain

 

民法の規定によると「月又は年によって期間を定めた場合において、最後の月に応当する日がないときは、その月の末日に満了する」ことになっています(民法143条2項但書)。末日の前日ではなく、末日に満了することに注意します。

なぜなら、期間満了は応当日の直前までだからです。

確かに、応答日である2月30日は存在しないのですが、存在しないからといって「応当日(2月30日)の直前までが期間内である」という原則に変わりはないので、月末日である2月28日が期間の最終日になるのです。

f:id:waenavi:20200417210354j:plain

 

2021年10月30日から4か月後をEDATE関数で求めると、2022年2月28日になります。EDATE関数で応当日が無いときは自動的に月末日に補正されます。2月28日は月末にあたるため、この日の24時をもって期間満了となります。

  • =EDATE(A1,4)

f:id:waenavi:20200407103909j:plain

 

(2)年単位の場合

問題

「2020年2月29日から5年間」の場合、期間の終了日を求めなさい。

f:id:waenavi:20200407104038j:plain

 

解説

年単位で応当日が無いのは2月29日だけです。それ以外の日は必ず応当日があります。EDATE関数で5年後=60か月後の応当日を求めると、2025年2月28日となります。平年で2月29日が無い場合は自動的に月末日の2月28日となります。

  • =EDATE(A1,60)

f:id:waenavi:20200407104156j:plain

 

(3)応当日が無い場合は月末日

月数を加算したときに応当日が無い場合、期間の終了日は月末日なので「EDATE」で求められます。

f:id:waenavi:20200407104241j:plain

 

5.月または年単位の終了日の求め方

以上のとおり、民法の規定によると期間の終了日は、応当日がある場合は「EDATE-1」で、応当日が無い場合は「EDATE」です。応当日がある場合だけEDATEから1を引きます。これを1つの式で求めるにはどうすればいいのでしょうか?

(1)応当日の有無の判定

問題

A列の日付を起算日として、B列の月数を経過した時の期間終了日を求めようとしている。起算日に対する応当日がある場合はTRUE、応当日が無い場合はFALSEと表示しなさい。

f:id:waenavi:20200407104452j:plain

 

解説

EDATE関数で応当日を求めると、応当日がある場合は日にちが変わらないのに対して、応当日が無い場合は日にちが変わり、自動的に月末日に補正されます。

f:id:waenavi:20200407105104j:plain

 

したがって、DAY関数で日にちを比較して一致すれば応当日があり、不一致なら応当日が無いことが分かります。

  • =DAY(A2)=DAY(EDATE(A2,B2))

f:id:waenavi:20200407105221j:plain

 

(2)応当日があれば1を引く

問題

A列の日付を起算日として、B列の月数を経過した時の期間終了日を求めなさい。

f:id:waenavi:20200407105427j:plain

 

解説

EDATE関数で月数を加算しますが、応当日がある場合だけ1を引きます。TRUE=1、FALSE=0なので、C列を引けばよいです(参考:【Excel】IF関数が使えない原因は「比較演算」の練習不足である)。

  • =EDATE(A2,B2)-C2

f:id:waenavi:20200407105916j:plain

 

C列の判定式を代入すると次のような数式になります。

  • =EDATE(A2,B2)-(DAY(A2)=DAY(EDATE(A2,B2)))

f:id:waenavi:20200407110041j:plain

 

いっぱんに民法の規定に従って、EDATE関数を用いて期間満了の日を求めるには、EDATE関数から応当日判定式を引きます。

f:id:waenavi:20200407105531j:plain

 

6.別解:前日の応当日?

問題

期間の終了日を求めるのに、応当日の前日とするところを、前日の応当日としてしまった。この数式は正しいと言えるか。

f:id:waenavi:20200407110310j:plain

 

解説

例えば、2月1日からの4か月間の場合、応当日である6月1日から1を引いて5月31日とするのが正しいのですが、誤って、2月1日の前日である1月31日の4か月後と考えても、5月31日となり正しいように見えます。

f:id:waenavi:20200407110346j:plain

 

また、10月30日からの4か月間の場合、10月30日の前日である10月29日の4か月後と考えても、2月29日となり応当日が無い場合も正しい答えが出るように見えます。

f:id:waenavi:20200407110435j:plain

 

しかし、この考え方は間違いです。3月1日からの4か月間の場合、正しい終了日は5月31日ですが、起算日の前日が31日ではないので正しい答えにはなりません。

f:id:waenavi:20200407110511j:plain

 

そこで「応当日の前日」と「前日の応当日」を求めて比較してみましょう。

  • 応当日の前日:=EDATE(A2,B2)-1
  • 前日の応当日:=EDATE(A2-1,B2)

f:id:waenavi:20200407110728j:plain

 

正しい終了日と比較すると、「応当日の前日」と「前日の応当日」のうち大きいほうを採用すればよいことが分かります。

f:id:waenavi:20200407110801j:plain

 

したがって、MAX関数を用いると正しい日付になります。

  • =MAX(EDATE(A2,B2)-1,EDATE(A2-1,B2))

f:id:waenavi:20200407110833j:plain

 

配列を用いて簡単にすると次のようになります。

  • =MAX(EDATE(A2-{0,1},B2)-{1,0})

f:id:waenavi:20200407110915j:plain

 

7.DATE関数を使うのは間違い

問題

期間の終了日を求めるのにEDATE関数を用いるべきであるにもかかわらず、DATE関数を用いてしまった。DATE関数を用いるのは正しいと言えるか。 

解説

EDATE関数はExcel2007のときに標準の日付関数として搭載された関数です。現在ではサポートされているExcelのすべてのバージョンで使用することができます。しかし、古いWebサイトや書籍にはEDATE関数が使えないユーザのために、DATE関数を用いて求めるという誤った手法を紹介しているものがあるため、注意が必要です。

DATE関数とEDATE関数の違いは、応当日が無い場合の計算が異なることです。例えば、2021/10/30の4か月後をEDATE関数で求めると、応当日が無いため月末の2022/2/28となります。

  • =EDATE(A1,4)-(DAY(A1)=DAY(EDATE(A1,4)))

f:id:waenavi:20200407111733j:plain

 

しかし、DATE関数で4か月後を求めると、応当日の2022/2/30を月末の2日後ととらえて「3月2日」となります。これは民法の規定に反する計算です。したがって、期間の計算にDATE関数を用いるのは間違いです(具体的には2月28日、29日の計算に誤りがある)。

  • =DATE(YEAR(A1),MONTH(A1)+4,DAY(A1))

f:id:waenavi:20200407112037j:plain

 

8.初日不算入の原則と例外

(1)定期券の有効期限

問題

2021/2/1から使える6か月間の定期乗車券の有効期限(乗車できる最終の日)を求めなさい。

f:id:waenavi:20200407112542j:plain

 

解説

定期券や賞味期限、契約更新日など一般的な期間の最終日を求めるとき、開始の日を含むか含まないかによって1日ずれます。

この点について、民法は「日、週、月又は年によって期間を定めたときは、期間の初日は、算入しない」と定め、初日を期間に含めないことを原則としています(140条本文)。これを「初日不算入の原則」といいます。これに従えば、定期券は2021/2/2から起算することになりますが、2月1日の始発から使えるのに2月2日から計算するというのは分かりにくいです。

この大原則には例外があって、「法令若しくは裁判上の命令に特別の定めがある場合又は法律行為に別段の定めがある場合」は民法の規定に従わなくてもよいことになっています(民法138条)。鉄道各社はそれぞれ「旅客営業規則」を定めており、有効期間の開始日を定めた場合はその開始日(開始日が無ければ発行日)を起算日としています。これは初日を算入するという意味です。

JR東日本旅客営業規則 第151条
乗車券類の有効期間は、有効期間の開始日を特に指定して発売したものを除き、当該乗車券類を発行した当日から起算する。

したがって、定期券の開始日を起算日として、EDATE関数の第1引数として用いることは正しいと言えます。

  • =EDATE(B1,6)-(DAY(B1)=DAY(EDATE(B1,6)))

f:id:waenavi:20200407115925j:plain

 

このように、鉄道に限らず、期間の初日を指定して「~の日から~か月間有効」「~を開始日として~年間保存」などと定めた場合は、民法の原則が排除され「初日算入」とみなされます。

 

(2)4月1日生まれの人が早生まれ扱いになる理由

問題

2020年4月1日に生まれた子が満6歳になるのは何年何月何日何時か。また、小学校に入学できるのは何年何月何日か。

f:id:waenavi:20200407120105j:plain

 

解説

まず、4月1日の0時に生まれた子と23時59分に生まれた子では約1日の差があります。

この点について、年齢計算ニ関スル法律(明治35年法律第50号)によると、年齢は出生の日から起算すると定められています(初日算入)。これは民法の初日不算入の原則の例外を定めたものです。したがって、4月1日の何時に生まれたとしても、生まれた4月1日を含めて年齢を計算することになります。

満年齢は民法の規定に従って計算します。EDATE関数で6年後を求めると2026/3/31となります。つまり、2026年3月31日の24時を過ぎた時点(誕生日の前日の終了時点)で満6歳となります。4月1日生まれの人は4月1日に満年齢が増えるのではなく、3月末で満年齢が増え、3月末で6歳に達するのです。

  • =EDATE(B1,12*6)-(DAY(B1)=DAY(EDATE(B1,12*6)))

f:id:waenavi:20200407120224j:plain

 

学校教育法(昭和22年法律第26号)によると、3月末までに満6歳に達した子は、その年の4月1日から始まる新学年に入学できます。 4月1日生まれの人も3月末の24時に満6歳に達していれば入学できるので、早生まれ扱いになるのです。

学校教育法第17条第1項本文
保護者は、子の満六歳に達した日の翌日以後における最初の学年の初めから、満十二歳に達した日の属する学年の終わりまで、これを小学校、義務教育学校の前期課程又は特別支援学校の小学部に就学させる義務を負う。

「6歳になる時点」が前年4月1日から3月31日までの人が、4月1日から始まる学年に入学できるので、その入学年は、9か月後の西暦と同じになります。

f:id:waenavi:20200408120354j:plain

 

したがって、9か月後の4月1日が小学校入学日となります。

  • =DATE(YEAR(EDATE(B3,9)),4,1)

f:id:waenavi:20200407121641j:plain

 

ちなみに、2020年4月2日に生まれた人が入学できるのは、2027年なので1学年遅れて入学することになります。

f:id:waenavi:20200407120937j:plain

 

別解

生年月日から入学日を求める場合、生年月日から1日引いた年度に7を足すという方法もあります(参考:【Excel関数】日付から入学年度と卒業年度、学年、3学期制の期間を計算する)。

  • =DATE(YEAR(EDATE(B1-1, -3))+7,4,1)

f:id:waenavi:20200407121850j:plain

 

(3)2月29日生まれの人の誕生日

問題

2020年2月29日に生まれた子が満6歳になるのは何年何月何日何時か。

f:id:waenavi:20200407122041j:plain

 

解説

2月29日に生まれた人は、うるう年でない年には2月29日が無いため、いつ誕生日のお祝いをすればよいのかが問題となります。これについては年単位の応当日が無い場合の民法の規定(143条2項但書)が準用され、2月の月末日の24時となります。EDATE関数で6年後を求めると、2026年2月28日(24時)を過ぎた時点となります。

f:id:waenavi:20200407122116j:plain

 

ちなみに、うるう年の場合は応当日があるため、応当日の前日=2月28日24時となります。したがって、うるう年かどうかにかかわらず、2月29日生まれの人は、2月28日24時の時点で満年齢が増えるということになります。

f:id:waenavi:20200407122211j:plain

 

9.応当日が無ければ月初にする

問題

ある講習で、講習当日の2か月前の応当日を申込開始日とし、応当日が無い場合は翌月の月初にすることを定めたとする。セルA1の日付を講習日として申込開始日を求めなさい。

f:id:waenavi:20200407122859j:plain

 

解説

前述のとおり、民法の規定にかかわらず期間の開始日や終了日を定めるのは自由です。また、応当日が無い場合の処理方法も自由に定めることができます。EDATE関数で応当日を求めた場合、応当日が無ければ月末になります。

  • =EDATE(A1,-2)

f:id:waenavi:20200407122746j:plain

 

これを翌月の月初にする場合、応当日の判定を行い、応当日が無い場合に1日加算すればよいです。

  • =EDATE(A1,-2)+(DAY(A1)<>DAY(EDATE(A1,-2)))

f:id:waenavi:20200407122929j:plain

 

10.EDATE関数が使えない場合について

(1)日単位の計算

日単位、週単位の計算はEDATE関数ではなく、単に日数を足し算をするだけで良いです(参考:【Excel】完全マスター!日付の足し算と引き算を使った日数の計算問題)。 

(2)休日を考慮した満了日

民法142条は、「期間の末日が日曜日、国民の祝日に関する法律(昭和二十三年法律第百七十八号)に規定する休日その他の休日に当たるときは、その日に取引をしない慣習がある場合に限り、期間は、その翌日に満了する。」と定めています。祝日や休日を避ける計算は、WORKDAY関数またはWORKDAY.INTL関数を用いる必要があり、EDATE関数のみで計算することはできません。 

(3)時間の計算

民法139条は、「時間によって期間を定めたときは、その期間は、即時から起算する。」と定めていますが、EDATE関数は時刻の部分を切り捨てるため、時間による期間計算をすることはできません。

 


解説は以上です。


 


Copyright(C)2018-2020 waenavi, All rights reserved. [www.waenavi.com 定礎 平成三十年八月]
Youtube | 公式サイト | twitter | 著作権 | 運営者情報 | お問い合わせ