前回の連載では、簡易的な手法を使って「生年月日」から「年齢」を自動計算する方法を紹介した。ただし、この手法は閏年(うるうどし)を無視しているため、4年に1日ずつ誤差が発生してしまう。そこで、今回は「生年月日」から「正確な年齢」を自動計算する方法を紹介していこう。

  • 生年月日から年齢を自動計算(正確版)

年齢を正確に計算するには?

皆さんは「生年月日」から「年齢」を求めるとき、どのように計算するだろうか? おそらく、以下のように考える方が多いと思われる。

【年齢の計算方法】
(1)「今年の西暦」から「生まれた年の西暦」を引き算する
(2)すでに「今年の誕生日」を迎えている場合は、(1)の結果がそのまま「年齢」になる
(3)まだ「今年の誕生日」を迎えていない場合は、(1)の結果をマイナス1した値が「年齢」になる

上記の処理をパワークエリで実現すれば、正確な年齢を求められる。ということで、その手順を具体的に紹介していこう。

状況を把握しやすいように、今回は「氏名」と「生年月日」だけを記録した以下のデータ表を使って処理手順を解説していこう。

  • 「生年月日」が記録されているデータ表

「今年の年齢」を計算する

それでは、詳細な処理手順を解説していこう。まずは「今日の日付」をデータとして取得する。この処理には、DateTime.LocalNow()というM関数を使用する。

「列の追加」タブにある「カスタム列」をクリックし、「DateTime.LocalNow()」と記述する。なお、新しく作成する列には「今日の日付」という列名を指定した。

  • カスタム列で「今日の日付」を作成する処理

DateTime.LocalNow()は「現在の日時」を自動取得してくれる関数だ。本記事は「2025年2月12日」に執筆しているので、そのときの日時がデータとして追加される。

  • 作成された「今日の日付」

今回の例では「時刻」の部分は必要ないので、データ型を「日付」に変更しておこう。これで「今日の日付」のデータを作成できる。

  • 「今日の日付」のデータ型を「日付」に変更

このデータをもとに「今年の西暦」を作成する。この処理は「日付」コマンドで実現できる。「今日の日付」の列を選択し、「日付」コマンドから「年」→「年」を選択する。

  • 「今日の日付」から「年」だけを取得する処理

「今日の日付」から「年」の部分だけが抜き出され、「2025」という数値が並んだ列が作成される。列名が「年」のままでは紛らわしいので、この時点で列名を「今年の西暦」に変更しておこう。

  • 列名を「今年の西暦」に変更

続いて、「生まれた年の西暦」をデータとして作成する。「生年月日」の列を選択し、「日付」コマンドから「年」→「年」を選択する。こちらも列名を「生まれた年」に変更しておこう。

  • 「生年月日」から「年」だけを取得する処理

  • 列名を「生まれた年」に変更

これで「今年の西暦」と「生まれた年」のデータを作成できた。これらのデータをもとに「今年、何歳になるか?(何歳になる予定か?)」を計算する。「カスタム列」をクリックし、=[今年の西暦]-[生まれた年] と数式を入力する。なお、新しく作成する列には「今年の年齢」という列名を指定した。

  • カスタム列で「今年の年齢」を計算する処理

今回の例では、以下の図のような計算結果が表示された。「カスタム列」の計算結果はデータ型が「指定なし」になっているので、データ型を「整数」に変更しておこう。

  • 算出された「今年の年齢」

  • データ型を「整数」に変更

以上で「今年の年齢」を求める処理は完了。計算の過程で作成した「今年の西暦」と「生まれた年」の列は、もう必要ないので削除しておこう。なお、「今日の日付」の列は以降の処理でも使用するため、そのまま残しておく。

  • 不要になった列の削除

「今年の誕生日」を作成する

先ほど求めた「今年の年齢」は、「今年の誕生日を迎えたらXX歳になる」ということを示した数値となる。とはいえ、まだ「今年の誕生日」を迎えていない人もいるだろう。続いては、「今年の誕生日を迎えているか?」を確認する作業を進めていこう。そのためには、「今年の誕生日」をデータとして作成しておく必要がある。

「日付」コマンドを使って「生年月日」から「月」と「日」を抜き出してもよいが、ここでは別の方法で作業を進めてみよう。「生年月日」の列を選択し、「列の追加」タブにある「抽出」→「最後の文字」を選択する。

  • 「生年月日」から「月/日」の部分だけを抽出する処理(1)

以下の図のような設定画面が表示されるので、カウント(文字数)に「5」を指定し、「OK」ボタンをクリックする。

  • 「生年月日」から「月/日」の部分だけを抽出する処理(2)

すると、「生年月日」の列から「後ろの5文字」を抜き出したデータが作成される。つまり、「yyyy/mm/dd」から「mm/dd」の部分だけを抜き出すことになる。結果として、「生年月日」から「月/日」の部分だけを取得することが可能となる。

  • 「生年月日」から抽出された「月/日」のデータ

ただし、現時点ではデータ型が「テキスト」になっている。このままでは計算できないので、データ型を「日付」に変更する。

  • データ型を「日付」に変更

すると、「年」の部分に(今年の西暦)を補完した日付データに変更される。あとは列名を「今年の誕生日」に変更するだけ。これで「今年の誕生日」のデータを作成できたことになる。

  • 列名を「今年の誕生日」に変更

このように「年」が不足しているデータを「日付型」に変更した場合、「今年の日付」として自動処理される仕組みになっている。この仕組みを応用できる場面も多いので、この機会に覚えておくとよいだろう。

誕生日の前後で年齢を補正する

続いては、「今年の誕生日を迎えているか?」を確認して、「正確な年齢」を求める作業を進めていこう。

まずは「誕生日までの日数」を計算する。「カスタム列」をクリックし、=[今年の誕生日]-[今日の日付] と数式を入力する。なお、新しく作成する列には「誕生日までの日数」という列名を指定した。

  • カスタム列で「誕生日までの日数」を計算する処理

計算結果が期間型のデータ(日.時:分:秒)として表示される。これが「今年の誕生日までの日数」となる。

  • 「誕生日までの日数」の計算結果

念のため、各データの見方を説明しておこう。たとえば、上図の1行目には「279.00:00:00」とデータが表示されている。これは「279日後に誕生日を迎える」ということを意味している。一方、2行目のデータは「-39.00:00:00」となっており、マイナスの値になっている。この場合、「すでに39日前に誕生日を迎えている」ということになる。

このままの状態でも構わないが、状況を分かりやすくするために、データ型を「整数」に変更しておこう。すると、誕生日までの日数を「279」や「-39」といった数値に変換できる。

  • 「誕生日までの日数」のデータ型を「整数」に指定

これで「今年の誕生日を迎えているか?」を判断する材料を用意できた。あとは「誕生日までの日数」に応じて、以下のように分岐処理を行えばよい。

◆0より大きい場合
 まだ誕生日を迎えていないので「今年の年齢」からマイナス1する

◆ちょうど0の場合
 今日が誕生日なので「今年の年齢」のままでOK

◆0より小さい場合
 すでに誕生日を迎えているので「今年の年齢」のままでOK

つまり、「誕生日までの日数」が0より大きいときだけ、「今年の年齢」からマイナス1すればよいことになる。これを「条件列」で実現する。

「列の追加」タブにある「条件列」をクリックし、新しい列名に「年齢」と入力する。続いて、「誕生日までの日数」が「0より大きい場合」という条件を指定し、その出力値に =[今年の年齢]-1 という数式を入力する。出力値に数式を指定するときは、最初に「=」の記述が必要だ。忘れないように注意しておこう。

  • 「条件列」の設定(1)

それ以外の場合は、「今年の年齢」の列をそのまま出力すればよい。出力方法に「列の選択」を指定し、「今年の年齢」の列を選択する。

  • 「条件列」の設定(2)

「OK」ボタンをクリックすると「年齢」という列が作成され、そこに補正済みの「正確な年齢」が表示される。

  • 条件列により補正された年齢

これで「正確な年齢」を求める作業は完了となる。計算の過程で作成した不要な列を削除しておこう。

  • 不要になった列の削除

最後に、このデータ表をExcelに出力する。「ホーム」タブにある「閉じて読み込む」をクリックすると、以下の図のような結果を得ることができる。これが作業時における各ユーザーの年齢となる。

  • Excelに出力したデータ表

もちろん、後日に「すべて更新」をクリックして、その時点における「年齢」に更新することも可能だ。つまり、クリックひとつで「現在の年齢」を自動計算できることになる。

同様の処理を「通常のExcelだけで行う」となれば、かなり大変な作業を強いられるだろう。ステップ形式で処理を進められる、パワークエリならではの利点を活かした使い方といえる。

このように、日時の計算にもパワークエリが便利に活用できる。頭の中で描いた処理手順をパワークエリで具現化できるように、各コマンドの使い方や注意点などをよく学んでおくと、きっと役に立つだろう。