今回は、生年月日(誕生日)の日付データから「現在の年齢」を自動計算する方法を紹介していこう。このような場合は「2つの日付データ」の経過年数/月数/日数を調べる関数DATEDIFを活用するとよい。会員名簿などを効率よく管理する手法として覚えておくと役に立つだろう。
数式では計算できない日付の計算
Excelで会員名簿などを管理する場合に「年齢」の項目を設けたい場合もあるだろう。このような場合に「年齢」を数値データとして直接入力するのは、正直な話、お勧めできる手法とはいえない。というのも「年齢」として入力した数値データは、あくまで「入力時の年齢」でしかなく、月日の経過とともに「誤ったデータ」になってしまうからだ。
そこで「年齢」を管理するときは、各個人の「生年月日」を日付データとして記録しておくのが基本となる。そして、「生年月日」から「現在の年齢」を自動計算して利用するようにする。このような場合に活用できるのが、「2つの日付」の経過年数/月数/日数を計算してくれる「関数DTAEDIF」だ。
具体的な例を使って解説していこう。以下の図は、ある施設の会員名簿をExcelにまとめたものだ。現時点では「年齢」の項目が空欄になっている。これを「更新日」と「生年月日」のデータから自動計算する方法を紹介していこう。
まずは、「更新日」の日付データを入力する。この部分は、そのつど日付データを手入力しても構わないし、関数TODDAY(引数なし)で「今日の日付」を自動入力しても構わない。ここでは、関数TODAYを使用した例を紹介していこう。
関数TODAYを入力したセルは、Excelファイルを開いたときの日付(=今日の日付)が自動入力される仕組みになっている。このため、Excelファイルを開くたびに「更新日」は「今日の日付」に自動更新されることになる。
続いて、「生年月日」から「更新日における年齢」を計算する。日付データを管理するシリアル値は、1日を数値の「1」として扱う仕組みになっている。よって、大雑把な年齢であれば数式で求めることも不可能ではない。
たとえば、(更新日)-(生年月日)の引き算を計算すると、その人が生まれてから現在(更新日)までに過ごした日数を求めることができる。これを365(365日=1年)で割り算すれば、おおよその年齢を計算できることになる。なお、「更新日」の部分は、数式をコピーしたときにセル参照が自動補正されないように「絶対参照」で入力してある。
この数式をオートフィルなどでコピーすると、以下の図のような結果が得られる。あとは、この数値の小数点以下を「関数INT」などで切り捨てるだけ。これで大雑把な年齢を求めることが可能となる。
ただし、この手法で得られる「年齢」は、あくまで「大雑把な年齢」でしかないことを忘れてはいけない。というのも、4年に1回ある閏年(うるう年)を無視して、1年=365日と計算しているからだ。
たとえば、2番目の会員データ(上図で背景が黄色の部分)を見てみると、その「年齢」は23歳として計算されている。更新日(2月27日)の時点で、この人はまだ誕生日(3月2日)を迎えていないので、本当は22歳と計算されなければならない。23歳になるのは3日後なので、この計算方法は数日の誤差を容認する手法となってしまう。
閏年が4年に1回ある(※1)ことを考慮して、1年=365.25日として計算すれば、より正確な年齢に近づくが、それでも若干の誤差が生じることに変わりはない。
(※1)閏年は必ずしも4年に1回とは限らない。西暦が100で割り切れる年は閏年にならない、ただし400でも割り切れる場合は閏年になる、といった特別なルールもある。
実際問題、数式だけで「生年月日」から「年齢」を求めるのは非常に難しい話となる。厳密に「年齢」を計算したいのであれば、Excelに用意されている関数を活用するのがスマートで確実な手法といえる。
関数DATEDIFを使った年齢の算出
「生年月日」から「年齢」を求めるときは、「2つの日付」の経過年数/月数/日数を計算してくれる「関数DATEDIF」を活用するとよい。まずは、関数DATEDIFの書式から紹介していこう。
■関数DATEDIFの書式
=DATEDIF(開始日, 終了日, 単位)
第1引数と第2引数には、計算する期間の「開始日」と「終了日」の日付データをセル参照などで指定する。続いて、第3引数で「経過した年数/月数/日数のどれを求めるか?」を指定する。この部分は以下の文字で指定する。このとき、英文字の前後をダブルクォーテーションで囲む必要があることに注意しておくこと。
"Y" ・・・・ 経過した「年数」を返す
"M" ・・・・ 経過した「月数」を返す
"D" ・・・・ 経過した「日数」を返す
"MD" ・・・・ 年数と月数を除いた形で経過した「日数」を返す(※2)
"YM" ・・・・ 年数と日数を除いた形で経過した「月数」を返す
"YD" ・・・・ 年数を除いた形で経過した「日数」を返す
(※2)既知の問題があるため使用時は注意が必要。詳しくは後述。
今回の例の場合、「生まれた日」から「今日」までが計算する期間になるので、第1引数に「生年月日」、第2引数に「更新日」をセル参照で指定すればよい。「年齢」は、生まれてからの経過年数と考えられるので、第3引数には"Y"を指定する。なお、第2引数は、関数をコピーしたときにセル参照が自動補正されないように「絶対参照」で指定しておく必要がある。
「Enter」キーを押すと、「生年月日」から「更新日」までの経過年数が計算され、その結果が数値データとして表示される。つまり、「年齢」を自動計算できたことになる。
あとは、この関数を他のセルにコピーしていくだけ。これで、Excelファイルを開くたびに、「現在の年齢」を自動計算してくれる表(会員名簿)を作成することができる。
関数を効率よくコピーするには?
続いては、少し余談になるが、数式や関数を効率よくコピーする方法を紹介しておこう。一般的には、オートフィルを使って数式や関数をコピーするのが簡単であるが、データ数が多い場合はそうとも限らない。
たとえば、ここで例として紹介した会員名簿には、全部で500件のデータが入力されている。よって、オートフィルで関数をコピーする場合、500行分だけ画面を延々とスクロールさせながらマウスをドラッグしていく必要がある。
これは「不可能な作業」とまでは言わないが、それなりに時間を要する作業になるし、途中でマウスの左ボタンを離してしまう、などの操作ミスを犯す危険性が高いといえる。さらにデータが増えて数千件、数万件という規模になると、ドラッグ操作によるコピーは非現実的な作業になってしまうはずだ。
そこで、キーボードを使って関数をコピーする方法も覚えておくとよい。順番に解説していこう。
(1)関数を入力したセルを「Ctrl」+「C」キーでコピーする。
(2)「Ctrl」+「End」キーを押して、セルの選択を「表の末尾のセル」へ移動させる。
(3)「←」キーを何回か押して、関数をコピーしたい列の「最下部にあるセル」を選択する。
(4)続いて、「Ctrl」+「Shift」+「↑」キーを押す。
(5)その列のデータ部分が選択された状態になる。
(6)この状態のまま「Ctrl」+「V」キーを押して関数を貼り付ける。
上記に示した手順で関数をコピーすると、画面を延々とスクロールさせることなく、ほんの数秒でコピーを完了することが可能となる。行数が多い表を扱うときの操作手順として覚えておくと役に立つだろう。
話を「年齢」の自動計算に戻そう。関数DATEDIFを使って「年齢」を求めると、数式で年齢を計算したときのように数日の誤差を生じさせることなく、正しい実年齢を計算できるようになる。先ほど不具合が生じていた2番目のデータ(上図で背景が黄色の部分)を見ても、年齢が22歳と正しく計算されていることを確認できるだろう。
これで、いつでも正しい年齢が自動計算されるデータ表に仕上げることができた。関数DATEDIFは「年齢」の計算以外にも応用できるので、実際に試しながら使い方を確認しておくとよいだろう。
関数DATEDIFの応用例
少しだけ応用例も紹介しておこう。関数DATEDIFは「経過年数」を調べる場合だけでなく、「経過日数」を調べる場合にも活用できる。
よくスポーツニュースなどで「XX歳とXXX日で最年少記録を達成・・・」といった話を耳にすることもあるだろう。この「XXX日」の部分をカレンダーを見ながらカウントしていくとなると、それなりに手間のかかる作業となる。このような場合にも関数DATEDIFが活用できる。
「XX歳」の求め方は、先ほど説明した通りだ。以下の図に示した例の場合、「=DATEDIF(C3,C2,"Y")」と関数を入力すると「年数」(実年齢)を求められる。続いて、残りの「日数」を関数DATEDIFで求める。こちらは、第3引数に"YD"を指定すればよい。
すると、「年数」を除いた「残りの日数」だけを計算することができる。今回の例では、「生年月日」が2000年9月3日で、「今日の日付」が2023年2月27日と仮定して計算を行っている。この場合の計算結果は「22歳と177日」という数値になる。
このように関数DATEDIFを使うと、ある期間中に経過した年数/月数/日数を簡単に求めることが可能となる。頻繁に使う関数ではないので、「こういう機能を実現してくれる関数がある」ということだけでも頭の片隅に覚えておくと、いざというときに役に立つだろう。
なお、関数DATEDIFには既知の問題があることにも留意しておく必要がある。この問題は第3引数に"MD"を指定したときに生じるもので、その計算結果が「負の数」や「ゼロ」などの結果になってしまうケースがある。
これについてはマイクロソフトのサポートページにも情報が掲載されているので、気になる方は確認しておくとよいだろう。
逆に考えると、第3引数に"MD"を指定しないのであれば、特に問題なく関数DATEDIFを使えることになる。この部分にさえ注意しておけば、日付計算に使える便利な関数として活用できるだろう。