日付データに関連する内容として、今回は関数DATEDIFの使い方を紹介しておこう。この関数は、2つの日付データから期間(年、月、日)を算出する関数で、生年月日から年齢を計算する場合などに活用できる。頻繁に使う関数ではないが、使い方を覚えておくと役に立つだろう。

関数DATEDIFで年齢を自動計算

前々回の連載でも解説したように、Excelは日付データの「1日」を数値の「1」として処理している。では、この仕組みを利用して生年月日から年齢を計算することは可能だろうか?

(今日の日付)-(生年月日)を計算し、それを365で割ればよいと思うかもしれないが、この方法は上手くいかない。というのも、4年に1回、閏年(うるうどし)があるからだ。閏年を含めた計算を行うには、かなり複雑な処理が求められる。

このような場合に活用できるのが関数DATEDIFとなる。まずは、関数DATEDIFの書式を示しておこう。

■関数DATDIFの書式

=DATEDIF(開始日,終了日,単位)

生年月日から年齢を求める場合は、第1引数に「生年月日」、第2引数に「今日の日付」を指定し、第3引数に「年数」を示す"Y"を指定すればよい。

具体的な例で見ていこう。以下は、会員名簿に記録されている「生年月日」ら年齢を計算する場合の例となる。「今日の日付」をそのつど修正するのは面倒なので、ここでは関数TODAYを使用している。TODAYは引数なしで使用できる関数で、自動的に「今日の日付」を入力してくれる関数となる。

関数TODAYを使った「今日の日付」の自動入力

これらの日付データをもとに、関数DATEDIFで年齢を計算する。今回の例では、オートフィルで関数DATEDIFをコピーできるように、第2引数(今日の日付)のセル参照を絶対参照で指定した。

関数DATEDIFを使った「年齢」の計算

オートフィルで関数をコピー

すると、以下の図のような表が完成する。この表を見ると、「今日の日付」(本記事では2016/10/28と仮定)に応じて年齢が正しく計算されているのを確認できる。たとえば、同じ1990年に生まれた深田さんと日野さんを比べると、すでに誕生日を迎えている深田さんは26才、まだ誕生日を迎えていない日野さんは25才と表示されている。

関数DATEDIFにより計算された年齢

このように、関数DATEDIFを使うと「今日の日付」に合わせて年齢を自動計算できるようになる。役に立つ場合もあるので、使い方を覚えておくとよいだろう。

関数DATEDIFで残り日数を自動計算

関数DATEDIFを使って、「月数」や「日数」の期間を求めることも可能だ。月単位で期間を求める場合は第3引数に"M"、日単位で期間を求める場合は第3引数に"D"を指定する。

たとえば、東京オリンピックの開会日まで「あと○日」を求める場合は、以下のように関数DATEDIFを指定すればよい。なお、今回も「今日の日付」の入力には関数TODAYを使用している。

残り日数を求める関数DATEDIF

もちろん、日数を計算するだけなら、単純に2つの日付データを引き算しても構わない。計算結果が日付として表示されてしまう場合は、数式を入力したセルに「標準」や「数値」の表示形式を指定すると、残り日数を表示できるようになる。

残り日数を引き算で計算した場合

関数DATEDIFで経過期間を計算する場合

2つの日付データの差を「○年○カ月○日」と示す方法もある。この場合は、DATEDIFの第3引数に"YM"や"MD"を指定する。具体的な例で見ていこう。

以下の例は、あるサービスの加入期間(○年○カ月○日)を関数DATEDIFで求める場合の例となる。加入期間の「○年」は、DATEDIFの第3引数に"Y"を指定すると計算できる。この考え方は「生年月日」から「年齢」を求める場合と同じだ。

加入年数を求める関数DATEDIF

続いて、第3引数に"YM"を指定した関数DATEDIFで「○カ月」の部分を求める。第3引数に"YM"を指定した場合は、全体の経過期間から「○年」を差し引いた状態で「月数」が表示される。

「○カ月」の部分を求める関数DATEDIF

最後に、第3引数に"MD"を指定した関数DATEDIFで「○日」の部分を求める。この場合は、全体の経過期間から「○年○カ月」を差し引いた状態で「日数」が表示される。

「○日」の部分を求める関数DATEDIF

これらの関数をオートフィルでコピーすると、各会員の加入期間を一覧表示できる。「今日の日付」を関数TODAYで入力しておけば、ファイルを開く毎に、加入期間が「今日の日付」で再計算されるようになる。

オートフィルで関数DATEDIFをコピー

そのほか、第3引数に"YD"という単位を指定することも可能である。この場合は、経過期間から「○年」を差し引いた状態で「日数」が表示される。「18才と248日」のように、「年数」と「日数」で期間を示したい場合に活用するとよいだろう。

関数DATEDIFを使用する際の注意点

これで関数DATEDIFの使い方をひととおり解説できたことになるが、この際に注意しておくべき点が一つある。それは「月数」の考え方だ。

たとえば、「7/31の1カ月後の日付は?」と質問すると、ほぼ全員が8/31と回答するであろう。では、「7/31の2カ月後の日付は?」と訊いた場合はどうであろうか? 9/31と答えたいところであるが、9月は30日までしかないので、そういう訳にはいかない。となると、9/30もしくは10/1ということになる。9/30では1日足りないような気がするし、10/1では1日多いような気がしてしまう。

このような場合、Excelでは10/1を「7/31の2カ月後」とする仕組みになっている。関数DATEDIFの第3引数に"YM"、"MD"を指定した検証表を作成したので、こちらを参考にしながら話を進めていこう。

「月数」と「日数」の考え方を検証した表

この表を見ると、7/31の1カ月後は8/31、2カ月後は10/1になることを確認できる。そして、10/2が「2カ月と1日後」、10/3が「2カ月と2日後」、…という数え方になる。さらに日付を進めていくと、10/31が「3カ月と0日後」になり、11/1は「3カ月と1日後」という結果になる。

各月について、1日(ついたち)の日付をピックアップしてみると、

09/01 1カ月と1日後
10/01 2カ月と0日後
11/01 3カ月と1日後

となり、同じ1日(ついたち)でも月によって「○日後」の数値は変化してしまう。

日数が28日(または29日)しかない2月が絡むと、さらに不思議な現象が発生する。2016年は閏年で少し例外的になるので、2/29がない2015年の1/31を起点に検証してみよう。

「月数」と「日数」の考え方を検証した表

この表を見ると、「1/31の1カ月後」は3/3ということになる(閏年でない場合)。この考え方は前述の例と同じ。2月は28日しかないので、その3日後の3/3が「1/31の1カ月後」となる考え方だ。

ただし、3/1の経過期間が「1カ月と-2日」、3/2の経過期間が「1カ月と-1日」と表示されていることにも注意しなければならない。○カ月("YM")だけを見た場合は、3/1の時点で「1か月後」に達する計算になる。

このように、関数DATEDIFの"YM"と"MD"には独特の計算方法がある。「最初の1カ月は無料」とか、「入会から6カ月以内に退会すると違約金が発生」といったサービスを管理する際に関数DATEDIFを使えそうだが、「月数」や「日数」の考え方に相違が生じる場合もあり、利用にあたっては十分な検証が必要となる。

そのほか、Excelのバージョンに応じて計算結果が異なるというバグも報告されている。年単位で期間を求める場合は特に問題なく使えるようであるが、単位に"YM"や"MD"、"YD"を指定する場合は十分に動作を検証しておく必要がある。正直な話、実務に使用するのは少し怖い、と言えるかもしれない。

そもそも、「1カ月」という単位そのものの捉え方が非常に難しく、企業によって「1カ月」の規定が異なる場合もある。関数DATEDIFは非常に便利な関数であるが、使用にあたっては入念な検証が必要になることも覚えておこう。