数え年・満年齢・学齢・・・年齢の計算方法はいくつかありますよね。
普段使用するのは満年齢が多いと思いますが、七五三や厄年なんかは数え年ですし、就学された児童や学生がいる家庭はもちろん社会人になっても給与の関係などで、学齢を使用する機会も結構あります。
早生まれや遅生まれなんてものも関わってくるのでとてもややこしい!ちょちょっとエクセルで計算できればいいのに!
とはいっても計算が得意なエクセルにとってもややこしさは一緒のようで、少し工夫をしないとビタッと合う年齢計算はしてくれません。
そこでこの記事では「エクセルのマクロ機能を使って年齢計算をする方法」について解説します。
コピペで使えるVBAのコードも3つのケース別に用意してありますので、VBA書くの苦手だよって方もぜひご利用ください。
この記事の内容
1. エクセルの年齢計算をややこしくする原因は『閏年』
こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。
まず、エクセルがどの辺りをややこしく思っているのかを知ることが大切。これを知った上で工夫をしていけばOKです!
エクセルは、1900年1月1日を1として、次の日を2、その次の日を3・・・366日後の1901年1月1日を367というように認識しています。この1日分を1とする値はシリアル値と呼ばれます。
シリアル値のすごいところは日付に足し算引き算ができること。例えば2019年5月1日の100日後っていつだろう?なんてのもシリアル値であれば簡単に計算ができてしまいます。
その逆の2019年5月1日から2019年8月9日の日数って何日だろう?なんてのも簡単に計算できてしまうんですね。
日付同士の引き算で日数差が求められるということは、年齢も簡単に計算できそうですが、ここでややこしくしてしまうのが『閏年』の存在です。
毎年毎年365日が1年であれば日数差を365で割ればよいですが、4年に1回366日の年がやってきますよね。
おおまかに計算したい場合は気にしなくてもよいのですが、算出日が誕生日付近だと年齢がズレてしまうことがあります。
そこで、閏年に負けない年齢計算の方法を考えてみましょう。
2. 閏年に負けない年齢計算
日付の差から”年”、”月”、”日”の情報を取得できるDATEDIF関数というものがあります。
とても便利な関数なのですが、なぜか公式ではない『隠し』関数。エクセルのバージョンによっては使えなくなったなんて話もちらほらあったりします。
そのため、この記事ではシンプルなYEAR関数を使って年齢を計算する方法を考えていきます。
2.1 YEAR関数と補正値で作る基本式
YEAR関数というのはシリアル値の”年”の情報を取得する関数です。
2019年5月1日をYEAR関数に入れてやると”2019″という答えが返されます。
この関数を使った、数え年・満年齢・学齢を計算する基本式は以下のようになります。
YEAR(算出日) - YEAR(誕生日) + 補正値
『YEAR(算出日) - YEAR(誕生日)』では閏年もそうでない年も関係なく、年数差を求められます。
つまり、この部分が閏年に負けない計算の要になります。
そして、求めたい年齢の種類(数え年・満年齢・学齢)によって異なる補正値を入れて年齢計算します。この式を年齢計算の基本式とします。
2.2 補正値とは
基本式に入れる補正値は求めたい年齢の種類(数え年・満年齢・学齢)によって異なりますので、それぞれについて解説します。
2.2.1 数え年の場合
数え年は生まれた日に1歳となり、それ以降1月1日を迎えるごとに1歳ずつ年を取っていきます。七五三や厄年など、神社やお寺に関係するような場合によく使われています。
この数え年と基本式とはよく似ていて、補正値はとてもシンプルです。
『YEAR(算出日) - YEAR(誕生日)』は数え年と同様に、1月1日を堺にして値が変わります。
例えば誕生日を1989年1月8日とすると、算出日が2018年12月31日のときは29、2019年1月1日のときは30となりますね。
数え年は『生まれた日に1歳となる』ので、『YEAR(算出日) - YEAR(誕生日)』と常に1だけズレているということになります。
したがって、補正値は常に1となります。
2.2.2 満年齢の場合
満年齢は生まれた日を0歳とし、その以降誕生日を迎えるごとに1歳ずつ年を取っていきます。もっともポピュラーな考え方ですね。
『YEAR(算出日) - YEAR(誕生日)』は1月1日を堺にして値が変わるのに対して、満年齢は誕生日を堺にして値が変わりますので、算出日が誕生日前だと-1のズレがあり、誕生日後だと0のズレ、つまりぴったり同じとなります。
したがって、補正値は算出日と誕生日の関係から-1と0を切り替える必要があります。
2.2.3 学齢の場合
学齢はその年度に何歳になるかというものなので、生まれた日を0歳とする点は満年齢と同じで、年度初めの4月2日に1歳ずつ年を取っていきます。
同じ年に生まれていても早生まれ、遅生まれで学齢が変わってしまうため、補正値の求め方は最も複雑になります。
<早生まれの場合>
算出日が1月1日から4月1日までのときは、ズレが0 つまり 補正値0
算出日が4月2日から12月31日までのときは、ズレが+1 つまり 補正値+1
<遅生まれの場合>
算出日が1月1日から4月1日までのときは、ズレが-1 つまり 補正値-1
算出日が4月2日から12月31日までのときは、ズレが0 つまり 補正値0
したがって、補正値は算出日と誕生日、年度初めの関係から-1と0、+1を切り替える必要があります。
3. コピペで使えるVBA
上記内容をVBAで記述したものを記載しておきます。
いずれもA列(2行目以降)を誕生日、B列(2行目以降)に算出日を入力すると、A列が空白になるまで繰返し年齢計算をしてC列に答えを返していきます。
マクロの編集画面を開いて、Sub ~ End Subまでをコピペして使ってくださいね。
3.1 数え年の場合
VBAコードの説明です。
【A】部
変数の宣言です。
bdは誕生日、cdは算出日、yrは基本式の『YEAR(算出日) - YEAR(誕生日)』、cpが補正値になります。
【B】部
メッセージボックスです。数え年を計算する旨を表示します。
【C】部
計算前の動作になります。A2セルに移動し、C列のセル内容をすべてクリアしたあと、C1に数え年と入力します。
計算中の画面更新をfalseにしていますが、これにより計算時間の短縮をしています。
【D】部
Do until~Loopはかなり使える繰返しの関数です。ここではA列が空白(“”)になるまで繰返し数え年を計算させます。
【D-1】部
A列から誕生日bdを取得し、B列へ移動して算出日を取得します。
yrとして『YEAR(算出日) - YEAR(誕生日)』を計算し、C列へ移動。
数え年の場合は補正値cpは常に1でしたね。
【D-2】部
基本式によって数え年を計算してC列へ入力します。その後、1行下のA列へ戻り、Do until~Loopの繰返しを判断します。
Sub 数え年計算()
‘【A】部
Dim bd, cd As String
Dim yr, cp As String
‘【B】部
MsgBox “A列を生年月日、B列を算出日としてC列に数え年を計算します”
‘【C】部
Range(“A2”).Select ‘A2セルを選択
Range(“C:C”).ClearContents ‘前回の計算結果を削除
Range(“C1”).Value = “数え年” ‘C1セルに項目を追加
Application.ScreenUpdating = False ‘計算中の画面更新を停止
‘【D】部
Do Until ActiveCell.Value = “” ‘A列が空白になるまで繰り返す
‘【D-1】部
bd = ActiveCell.Value ‘誕生日を取得
ActiveCell.Offset(0, 1).Activate ‘1列右に移動(B列へ)
cd = ActiveCell.Value ‘算出日を取得
yr = Year(cd) – Year(bd) ‘算出日と誕生日の年差を計算
ActiveCell.Offset(0, 1).Activate ‘1列右に移動(C列へ)
cp = 1 ‘数え年の補正値は常に1
‘【D-2】部
ActiveCell.Value = yr + cp ‘年差と補正値から数え年を計算してC列へ入力
ActiveCell.Offset(1, -2).Activate ‘次の行のA列に戻る
Loop
End Sub
3.2 満年齢の場合
VBAコードの説明です。
【A】部
変数の宣言です。
bdは誕生日、cdは算出日、yrは基本式の『YEAR(算出日) - YEAR(誕生日)』、mtが算出日と誕生日の月数差、dyが算出日と誕生日の日数差です。cpが補正値になります。
【B】部
メッセージボックスです。満年齢を計算する旨を表示します。
【C】部
計算前の動作になります。
A2セルに移動し、C列のセル内容をすべてクリアしたあと、C1に満年齢と入力します。
計算中の画面更新をfalseにしていますが、これにより計算時間の短縮をしています。
【D】部
Do until~Loopはかなり使える繰返しの関数です。ここではA列が空白(“”)になるまで繰返し満年齢を計算させます。
【D-1】部
A列から誕生日bdを取得し、B列へ移動して算出日を取得します。
yrとして『YEAR(算出日) - YEAR(誕生日)』を計算する他、cpの判断用にmtを『MONTH(算出日) - MONTH(誕生日)』、dyを『DAY(算出日) - DAY(誕生日)』を計算し、C列へ移動します。
【D-2】部
満年齢の場合は誕生日の前か後かで補正値cpを切り替えるのでしたね。
誕生月の場合とそうでない場合とをmtで場合分けをし、さらに誕生日の前か後かをdyで場合分けをさせています。
【D-3】部
基本式によって数え年を計算してC列へ入力します。その後、1行下のA列へ戻り、Do until~Loopの繰返しを判断します。
Sub 満年齢計算()
‘【A】部
Dim bd, cd As String
Dim yr, mt, dy, cp As String
‘【B】部
MsgBox “A列を生年月日、B列を算出日としてC列に満年齢を計算します”
‘【C】部
Range(“A2”).Select ‘A2セルを選択
Range(“C:C”).ClearContents ‘前回の計算結果を削除
Range(“C1”).Value = “満年齢” ‘C1セルに項目を追加
Application.ScreenUpdating = False ‘計算中の画面更新を停止
‘【D】部
Do Until ActiveCell.Value = “” ‘A列が空白になるまで繰り返す
‘【D-1】部
bd = ActiveCell.Value ‘誕生日を取得
ActiveCell.Offset(0, 1).Activate ‘1列右に移動(B列へ)
cd = ActiveCell.Value ‘算出日を取得
yr = Year(cd) – Year(bd) ‘算出日と誕生日の年差を計算
mt = Month(cd) – Month(bd) ‘算出日と誕生日の月差を計算
dy = Day(cd) – Day(bd) ‘算出日と誕生日の日差を計算
ActiveCell.Offset(0, 1).Activate ‘1列右に移動(C列へ)
‘【D-2】部
If mt = 0 Then ‘誕生月の場合
If dy < 0 Then ‘誕生日前の場合
cp = -1 ‘補正値を-1とする
Else ‘誕生日後の場合
cp = 0 ‘補正値を0とする
End If
Else ‘誕生月以外の場合
If mt < 0 Then ‘誕生月前の場合
cp = -1 ‘補正値を-1とする
Else ‘誕生月後の場合
cp = 0 ‘補正値を0とする
End If
End If
‘【D-3】部
ActiveCell.Value = yr + cp ‘年差と補正値から満年齢を計算してC列へ入力
ActiveCell.Offset(1, -2).Activate ‘次の行のA列に戻る
Loop
End Sub
3.3 学齢の場合
VBAコードの説明です。
【A】部
変数の宣言です。
bdは誕生日、cdは算出日、yrは基本式の『YEAR(算出日) - YEAR(誕生日)』、mt1が誕生日と4月2日の月数差、mt2が算出日と4月2日の月数差、dy1が誕生日と4月2日の日数差、dy2が算出日と4月2日の日数差です。
cpが補正値になります。
【B】部
メッセージボックスです。学齢を計算する旨を表示します。
【C】部
計算前の動作になります。
A2セルに移動し、C列のセル内容をすべてクリアしたあと、C1に学齢と入力します。
計算中の画面更新をfalseにしていますが、これにより計算時間の短縮をしています。
【D】部
Do until~Loopはかなり使える繰返しの関数です。
ここではA列が空白(“”)になるまで繰返し学齢を計算させます。
【D-1】部
A列から誕生日bdを取得し、B列へ移動して算出日を取得します。
yrとして『YEAR(算出日) - YEAR(誕生日)』を計算する他、cpの判断用にmt1を『MONTH(誕生日) - 4月』、mt2を『MONTH(算出日) - 4月』、dy1を『DAY(誕生日) - 2日』dy2を『DAY(算出日) - 2日』と計算し、C列へ移動します。
【D-2】部
学齢の場合は早生まれか遅生まれかで補正値が異なります。さらに算出日が4月2日の前か後かで補正値cpを切り替えるのでしたね。
早生まれの場合とそうでない場合とをmt1、dy1で場合分けをし、算出日が4月2日の前か後かをmt2、dy2で場合分けさせています。
【D-3】部
基本式によって数え年を計算してC列へ入力します。その後、1行下のA列へ戻り、Do until~Loopの繰返しを判断します。
Sub 学齢計算()
‘【A】部
Dim bd, cd As String
Dim yr, mt1, mt2, dy1, dy2, cp As String
‘【B】部
MsgBox “A列を生年月日、B列を算出日としてC列に学齢を計算します”
‘【C】部
Range(“A2”).Select ‘A2セルを選択
Range(“C:C”).ClearContents ‘前回の計算結果を削除
Range(“C1”).Value = “学齢” ‘C1セルに項目を追加
Application.ScreenUpdating = False ‘計算中の画面更新を停止
‘【D】部
Do Until ActiveCell.Value = “” ‘A列が空白になるまで繰り返す
‘【D-1】部
bd = ActiveCell.Value ‘誕生日を取得
ActiveCell.Offset(0, 1).Activate ‘1列右に移動(B列へ)
cd = ActiveCell.Value ‘算出日を取得
yr = Year(cd) – Year(bd) ‘算出日と誕生日の年差を計算
mt1 = Month(bd) – 4 ‘誕生日と年取日(4月2日)の月差を計算
dy1 = Day(bd) – 2 ‘誕生日と年取日(4月2日)の月差を計算
mt2 = Month(cd) – 4 ‘算出日と年取日(4月2日)の月差を計算
dy2 = Day(cd) – 2 ‘算出日と年取日(4月2日)の日差を計算
ActiveCell.Offset(0, 1).Activate ‘1行右に移動(C列へ)
‘【D-2】部
If mt1 < 0 Or (mt1 = 0 And dy1 < 0) Then ‘早生まれの場合
If mt2 < 0 Or (mt2 = 0 And dy2 < 0) Then ‘4月2日より前の場合
cp = 0 ‘補正値を0とする
Else ‘4月2日以降の場合
cp = 1 ‘補正値を1とする
End If
Else ‘早生まれでない場合
If mt2 < 0 Or (mt2 = 0 And dy2 < 0) Then ‘4月2日より前の場合
cp = -1 ‘補正値を-1とする
Else ‘4月2日以降の場合
cp = 0 ‘補正値を0とする
End If
End If
‘【D-3】部
ActiveCell.Value = yr + cp ‘年差と補正値から数え年を計算してC列へ入力
ActiveCell.Offset(1, -2).Activate ‘次の行のA列に戻る
Loop
End Sub
4. まとめ
エクセルのマクロ機能を使った年齢計算の方法はいかがでしたか?
どうしてもややこしさは残りますが、シンプルなYEAR関数を使っているので、一度作ってしまえばエクセルのバージョン変更時にも使えなくなる可能性は低いと思います。
コピペで使えるVBAのコードは、初心者の方もぜひご利用ください。