EDATE関数(イーデイト)は、指定された日付から数か月後、または数か月前の日付を求める関数です。月単位または年単位で日付を計算することができます。
ところで、EDATE関数は、DATE関数と名前が似ていますが、DATE関数とは全く関係ありません。EDATEとは、Expiration Date(エクスピレーション・デイト)の略と言われており、有効期限や満期日という意味です。お金の支払いに限らず、食品の有効期限や製品の保証期間などの期日は、通常「月単位」「年単位」で計算するため、このような関数名になっているのではないか考えられます。
そこで、今回は、EDATE関数の基本的な使い方について解説します。
目次
1.EDATE関数の基本
(1)1か月後の日付、数か月後の日付
問題
セルA1に入力した日付の1か月後の日付を求めなさい。また、3か月後の日付を求めなさい。
解説
セルA1に入力されている日付はシリアル値です(参考:【Excel】日付の「シリアル値」を本気で理解するには何を練習するべきか?)。EDATE関数は基準となる日付と加算する月数を指定します。月は数値で指定します。
- =EDATE(起算日,月)
1か月後の日付は第2引数を1にします。関数の戻り値は日付のシリアル値です。
- =EDATE(A1,1)
したがって、表示形式を変えることによって、求める日付になります(以下、同じ)。
また、3か月後の日付は3です。月を加算したことによって翌年以降の日付になることもあります。
- =EDATE(A1,3)
(2)表示形式
問題
セルA1は西暦で入力されている。EDATE関数を用いて求めた3か月後の日付を和暦にしなさい。
解説
表示形式で和暦にします(参考:【Excel】表示形式はセルの書式設定なのでセルの値は変わらない(表示形式の基本))。
表示形式はセルの書式であり、それぞれのセルの設定によって決まるため、関数の使用と各セルの表示形式は無関係です。したがって、参照元が西暦で、EDATEの答えを和暦にしても何ら問題はありません。
(3)1か月前の日付、数か月前の日付
問題
セルA1に入力した日付の1か月前の日付を求めなさい。また、3か月前の日付を求めなさい。
解説
月単位で過去の日付を求める場合は、第2引数をマイナスにします。1か月前の日付は-1にします。
- =EDATE(A1,-1)
また、3か月前の日付は-3です。月を減算したことによって昨年以前の日付になることもあります。
- =EDATE(A1,-3)
(4)0か月後の日付
問題
B列に-5から5までの整数を入力した。セルA1に入力した日付の5か月前から5か月後までの日付を求めなさい。
解説
基準となる日付を絶対参照とし、月数を参照することによって1か月おきの日付を求めることができます。
- =EDATE($A$1,B3)
EDATE関数の第2引数を0にすると、0か月後なので元の日付と同じ答えになります。
2.年単位の場合
(1)年は月の12倍
問題
セルA1に入力した日付の1年後、半年後、3年前の日付を求めなさい。また、セルB1に入力した年数を加算した日付を求めなさい。
解説
年単位で日付を求める場合もEDATE関数を使います。ただし、12倍するのを忘れてはいけません。1年後の場合、第2引数を12にします。
- =EDATE(A1,12)
半年は、6か月のことなので6です。
- =EDATE(A1,6)
また、3年前の場合は-36です。
- =EDATE(A1,-36)
セルに年数を入力した場合は12倍します。
- =EDATE(A1,B1*12)
(2)満60歳の誕生日
問題
セルA1に生年月日を入力した場合、満60歳の誕生日を求めなさい。
解説
還暦を満年齢で計算する方法と、数え年で計算する方法がありますが、最近は60歳の誕生日を迎えた時点で還暦のお祝いをすることが増えてきました。誕生日を計算するのはEDATE関数です。
- =EDATE(A1,60*12)
3.日単位・週単位の場合はEDATEではない
(1)1日単位の加減算は足し算・引き算で良い
問題
セルA1に入力した日付の3日後の日付と2週間前の日付を求めるのに、EDATE関数を用いるのは適切と言えるか。
解説
Excelでは、1日=24時間を「1」として表します。したがって、Excelに「1」と入力すると、日付の計算では1日=24時間と解釈します。
したがって、3日後の日付を求めるには、単に3を加算すればよいです(参考:【Excel】完全マスター!日付の足し算と引き算を使った日数の計算問題)。
また、2週間前の日付を求めるには14を引けばよいです。1日単位または1週間単位の日付の加減算をするのに、Excel関数を使うのは間違いです。
(2)EDATE関数を使う理由
問題
月単位、年単位の加減算をするのにEDATE関数を用いるのはなぜか。
解説
4月10日と5月10日の間の日数は30日間ですが、5月10日と6月10日の間の日数は31日間です。
このように同じ1か月でも日数が異なるので、「1か月を加算する」という場合、30日を加算するのか31日を加算するのかが分かりません。1か月の日数に関係なく月を加算するにはEDATE関数を使います。
また、1年を加算する代わりに365を加算しても良いですが、うるう年の場合は366日となります。1年の日数に関係なく年を加算するにはEDATE関数を使います。
4.日付文字列の場合
(1)シリアル値に変換する必要は無い
問題
2020年2月2日の2か月後を求めるため、「=EDATE("2020/2/2",2)」と入力した。この数式は正しいと言えるか。
解説
「=EDATE("2020/2/2",2)」と入力して、表示形式を日付にすると、2020/4/2となり正しい数式であることが分かります。
EDATE関数の第1引数である日付は原則として、日付のシリアル値を指定する必要があり、文字列を入力した場合はエラーになることがあります。本来なら、日付を表す文字列はシリアル値にするため、1をかけるか0を足すなどして数値化する必要があります(参考:【Excel】TEXT関数で数値を日付や時刻のシリアル値に変換する、日付の変換方法まとめ)。
- =EDATE("2020/2/2"*1,2)
しかし、EDATEをはじめとする日付の関数は、日付に変換できる日付文字列を引数とした場合は自動的に数値化する仕様なので、このような演算が不要です。したがって、「=EDATE("2020/2/2",2)」と入力すればよいです。
このほか、Excelが日付文字列として解釈できる次のような記述もOKです。
- =EDATE("H30-1-1",2)
- =EDATE("平成30年1月1日",2) ※「西暦2020年」は不可
(2)ダブルクォートは必要
問題
2020年2月2日の2か月後を求めるため、「=EDATE(2020/2/2,2)」と入力したところ、1901年7月19日となった。この理由を述べなさい。
解説
「=EDATE(2020/2/2,2)」と入力すると、1901/7/19となり数式が誤っていることが分かります。ダブルクォーテーションをつけずに、引数としてスラッシュを用いると割り算となります。「2020/2/2」は2020÷2÷2=505となります。
シリアル値505=1901年5月19日なので、2か月後は7月19日です。
(3)8桁の数値
問題
セルA1に「20200202」と入力されている。2020年2月2日の2か月後を求めるため、「=EDATE(A1,2)」と入力したところエラーになった。数式を修正しなさい。
解説
8桁で日付を表した数値はシリアル値ではありません。8桁の数値を日付のシリアル値に変換するにはTEXT関数を使います(参考:【Excel】TEXT関数で数値を日付や時刻のシリアル値に変換する、日付の変換方法まとめ)。
- =TEXT(A1,"#-00-00")
TEXT関数の戻り値は文字列なので、本来なら数値化する必要がありますが、前述のとおり、EDATE関数の引数として用いる場合は数値化する必要はありません。
- =EDATE(TEXT(A1,"#-00-00"),2)
5.シリアル値の範囲を超えたらエラー
問題
「=EDATE("10000/1/1",1)」「=EDATE("2000/1/1",100000)」と入力したところ、いずれもエラーになった。その理由を述べなさい。
解説
Excelが日付として認識できる範囲は1900年から9999年までです。EDATE関数の引数にこの範囲を超える日付を入力するとエラーになります。
また、日付が正常な範囲内であったとしても、計算した結果がシリアル値の範囲を超える場合もエラーとなります。
6.該当する日付が無い場合
(1)同じ月の月末になる
問題
EDATE関数を用いて「2021年5月31日」の6か月後、3か月前の日付を求めなさい。
解説
6か月後の日付を求めます。2021/11/31ではなく、2021/11/30になります。
3か月前の日付を求めます。2021/2/31ではなく、2021/2/28になります。
2月30日、2月31日、4月31日、6月31日、9月31日、11月31日は存在しない日付です。また、うるう年以外の2月29日も存在しません。EDATE関数で存在しない日付となった場合は、同じ月の月末の日付になります。
うるう年の2月の場合は2月29日になります。
(2)答えが同じになることがある
問題
2021年5月26日~6月1日の3か月前の日付をそれぞれ求めなさい。
解説
3か月前の日付を求めます。5月28日~31日についてはすべて2月28日になります。
(3)入れ子にすると結果が異なることがある
問題
セルA1に入力した日付の、1年後の日付を求めるのに、「=EDATE(EDATE(A1,6),6)」としてもよいか。
解説
1年後の日付を求めるのであれば、月数を12とすればよいです。
- =EDATE(A1,12)
12か月を6か月+6か月として、EDATE関数を2回使うと5月30日になってしまいます。それは、6か月後の11月31日が存在せず、11月30日として計算するからです。
7.小数の場合
(1)月の小数部分は切り捨て
問題
EDATE関数の第2引数に「2.5」「-2.5」と指定すると、それぞれどのような日付になるか。
解説
EDATE関数の第2引数を「2.5」にすると、2か月後の日付になります。このように、第2引数を小数にすると、小数点以下は切り捨てとなり、小数点以下を入力していないのと同じになります。
また、「-2.5」にすると、2か月前の日付になります。マイナスの場合も小数点以下は切り捨てとなります。つまり、ROUNDDOWNと同じです(参考:【Excel関数】ROUNDUPとROUNDDOWN、切り上げ、切り捨て、四捨五入の練習問題)。
(2)半月とは何ぞ
問題
セルA1に入力した日付の2か月半後の日付を求めるのに、EDATE関数を用いるのは適切と言えるか。
解説
2か月半後の日付を求めようとして、「=EDATE(A1,2.5)」と入力したとしても、小数点以下切り捨てで2か月後の日付となります。
1か月の日数が月によって異なるため、1か月の半分(半月)が何日を指すのか分かりません。EDATE関数を用いたとしても、半月後の日付を求めることは不可能です。半月とは何かを定義したうえで、日数を足し算で加算するべきです。例えば半月=15日とするのであれば「=EDATE(A1,2)+15」です。
(3)補足:2か月後と3か月後の真ん中
例えば、2か月後と3か月後の日付のちょうど真ん中の日付を求めるのであれば、平均をすればよいです。ただし、平均すると「0.5日」が発生することがありますので、切り捨ての場合はINT、切り上げの場合はROUNDUPをします(参考:【Excel関数】ROUNDUPとROUNDDOWN、切り上げ、切り捨て、四捨五入の練習問題)。
(4)起算日が小数の場合も切り捨て
問題
セルA1に「2020/2/2 12:30」と入力した。EDATE関数を用いて3か月後の日付を求めなさい。
解説
セルA1に「2020/2/2 12:30」と入力しています。シリアル値は「43863.52083」です。このうち、整数部分の「43863」が日付、小数部分の「.52083」が時刻を表します。
EDATE関数を用いてセルA1の3か月後を求めます。
シリアル値が整数になります。
時刻を表示すると「2020/5/2 00:00」となります。1か月後の日付にはなりますが、時刻は0時になってしまいます。EDATE関数の第1引数に小数のシリアル値を入れた場合も切り捨てで、整数として計算するため、時刻の部分が消えてしまいます。
時刻の部分を表示するには、小数部分をMOD関数で求めて加算します。
- =EDATE(A1,3)+MOD(A1,1)
解説は以上です。