かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Google スプレッドシート 自動的に生年月日の列から年齢を計算したい

Spreadsheet に次のような誕生日の入ったデータがあり、自動的に今、何歳なのか表示させたい。

A B C
1 名前 誕生日 年齢
2 星宮いちご 1999/03/15
3 霧矢あおい 1999/01/31
4 紫吹LAN 1998/08/03
5 藤堂ユリカ 1998/12/26
6 大空あかり 2000/04/01
7 神崎美月 1996/09/18
8 北大路さくら 1999/04/06
9 夏樹みくる
10 天羽まどか 2002/02/14

要件の整理

  1. 年齢は今日何歳かで表示する
  2. データが増えていったら自動的に年齢も計算される
  3. 誕生日が未入力の行は年齢計算をスキップする

一度にやろうとすると複雑なので、1つ1つの要件を実現して組み合わせればOK。
問題は分解しましょう。

1. 誕生日から今日何歳かを計算する

誕生日の計算は今年から誕生日の年数を引いて、誕生日の日付がまだ来ていない(今日より後)なら -1 すればOK。 条件分岐は IF(条件, TRUE値, FALSE値) を使う。falseのときの値が不要なら省略可。

# B2: 1999/03/15
=(YEAR(NOW()) - YEAR(B2) + IF(B2 > TODAY(), -1) & ""

=> 20歳
& を使って計算結果に "歳" という文字を結合しています

2. 範囲に自動的に計算結果が入力されるようにする

範囲に計算式を適応するには ARRAYFORMULA 関数を使用します。
ざっくりいうと、計算式に使う対象を範囲にすれば、計算結果が配列で返され該当する範囲に計算結果が表示される。みたいな感じ

上の例だとB列のB2セル以降を自動で計算してC列に結果を入れたいので、C2 セルに計算式を記述します。
自動的に年齢計算した結果を入れるだけでなので 1. の計算式の対象を範囲にすればOK

# C2セルに式を記入
=ARRAYFORMULA( (YEAR(NOW()) - YEAR(B2:B) + IF(B2:B > TODAY(), -1) & "" )

=> C列に年齢を計算した結果が自動的に入る

A B C
1 名前 誕生日 年齢
2 星宮いちご 1999/03/15 20歳
3 霧矢あおい 1999/01/31 20歳
4 紫吹LAN 1998/08/03 21歳
5 藤堂ユリカ 1998/12/26 21歳
6 大空あかり 2000/04/01 19歳
7 神崎美月 1996/09/18 23歳
8 北大路さくら 1999/04/06 20歳
9 夏樹みくる 120歳
10 天羽まどか 2002/02/14 17歳
11 120歳

データが増えれば自動的に誕生日をC列に表示するようにはできましたが、このままでは計算対象のセルが空白の場合もデフォルトの日付?から計算されてしまい値が入力されてしまいます。

3. 誕生日が未入力の場合は年齢計算をしない

IF文を追加して誕生日が空白でなければ、年齢を計算し、空白ならセルを空にします。
空白でないときの条件式は次のような感じ

= B <> ""

他の言語のイメージで B != "" としたら #ERROR になってしまいました…

  1. で作成した計算式に条件を追加します。
# C2セルに式を記入
= IF(B2:B <> "", ARRAYFORMULA( (YEAR(NOW()) - YEAR(B2:B) + IF(B2:B > TODAY(), -1) & "" ), "")

falseのときは明示的に空文字""を返すようにしないとFALSEという文字が入力されてしまう
👇

A B C
1 名前 誕生日 年齢
2 星宮いちご 1999/03/15 20歳
3 霧矢あおい 1999/01/31 20歳
4 紫吹LAN 1998/08/03 21歳
5 藤堂ユリカ 1998/12/26 21歳
6 大空あかり 2000/04/01 19歳
7 神崎美月 1996/09/18 23歳
8 北大路さくら 1999/04/06 20歳
9 夏樹みくる
10 天羽まどか 2002/02/14 17歳
11

 
これで、データがある行だけ自動的に年齢を表示できるようになりました。
いきなり ARRAYFORMULA で式を作ると結果が解りにくい時は、特定のセルで正しく計算できる式を作ってから対象を範囲に変更するとハマりにくいと思います。

ところで、みくる姉さん最年長らしいけど、美月さんの何歳年上なんだ… (ここでメッセージは途絶える


[参考]