いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)年齢からあり得る生年月日を求める

 基本的に満年齢から生年月日を求めることはできません(一意に定まらない)が、ある日においてある年齢の者がいつごろ生まれたのか絞り込むことはできます。
 これをExcelでやってみます。

  • EDATE関数を使って、満年齢と基準日に基づき生年月日の範囲を求めることができます。

あり得る最も古い/新しい生年月日を求める

 次の画像では、B3セルに年齢(満年齢)が、C3セルにその年齢である日付(基準日)が入力されています。
 言い換えれば「その日においてその年齢である者がいる」ということです。
 このとき考え得る最も古い生年月日と最も新しい生年月日を求めてみます。



 先に最も新しい日付から求めます。
 E3セルに「=EDATE(C3,-B3*12)」と入力します。結果はシリアル値(数値)となるので…



 表示形式を日付に変えると最も新しい生年月日が表示されました。

 E3セル

=EDATE(C3,-B3*12)

 EDATE関数は基準日(第1引数)のnか月後やnか月前の日付を求める関数です。
 これを利用して、C3セルの日付から「年齢×12か月前」の日付、つまり「年齢と同じ年数前」の日付を求めています(マイナスの符号に注意)。これがあり得る最も新しい生年月日です。



 続いてD3セルに次の式を入力して最も古い生年月日を求めています。
 (表示形式は日付に直しています。以下の画像でも同様です)

 D3セル

=EDATE(C3,-B3*12-12)+1

 上記の「最も新しい生年月日」からさらに12か月(1年)前の日付を求め、それに1日足しています。これがあり得る最も古い生年月日です。

ランダムな生年月日を求める

 次の画像では、年齢と基準日に基づいてあり得る生年月日のうち、1つの日付をランダムに求めています。

 D3セル

=RANDBETWEEN(EDATE(C3,-B3*12-12)+1,EDATE(C3,-B3*12))

 RANDBETWEEN関数と上記の2つの結果を組み合わせています。RANDBETWEENの第1引数(最小値)として最も古い日付を、第2引数(最大値)として最も新しい日付を指定することで、その期間内の日付が得られるというわけです。

あり得るすべての生年月日を求める

 次の画像では、年齢と基準日に基づいてあり得る生年月日をすべて並べています。

 D3セル

=SEQUENCE(EDATE(C3,-B3*12)-EDATE(C3,-B3*12-12),1,EDATE(C3,-B3*12-12)+1)

 SEQUENCE関数の第3引数(初期値)として最も新しい日付を、第1引数(行数=表示する日数)として「最も新しい日付-最も古い日付+1」を指定しています。
 第1引数は単純に記すと「EDATE(C3,-B3*12)-(EDATE(C3,-B3*12-12)+1)+1」ですが1が相殺されて上記のようになります。

「今日」を基準にする場合

 上記の各式中における基準日つまり「C3」を「TODAY()」に代えると、今日(システムの日付)時点でその年齢である者の生年月日が求められます。
 次の画像は「あり得る最も古い/新しい生年月日」の例についてTODAY関数に代えたものを2023年12月18日に実行した様子です。

 C3セル
 D3セル

=EDATE(TODAY(),-B3*12-12)+1
=EDATE(TODAY(),-B3*12)

備考

 DATE関数を使って、たとえば最も新しい生年月日を「=DATE(YEAR(C3)-B3,MONTH(C3),DAY(C3))」のように求める方法も考えられます。
 これでもほとんどの場合は上記の式と同じ結果になりますが、基準日がうるう年における2月29日だと3月の日付が返ってしまいます。

 この例に限らずDATE関数を使ってn年前・後の日付を求めようとすると同じ問題が起こりますので、注意する必要があります。