VBAで生年月日から年齢を求める方法
VBAで生年月日から年齢を求める方法には以下の2通りあります。
- ワークシート関数のDATEDIF関数を使う方法
- VBA関数のDateDiff関数を使う方法
どちらでもいいです。
なお、ワークシート関数を使う方法にはWorksheetFunctionプロパティを利用する方法もありますが、WorksheetFunctionプロパティにDateDif関数が存在しないため利用できません。
1. ワークシート関数のDateDif関数を使う方法
Application.Evaluateメソッドを使ってワークシート関数のDATEDIF関数を実行します。
DATEDIF関数から直接年齢が算出できるためコードが単純になります。
1 2 3 4 5 6 7 8 |
Function GetAgeWorksheet(birthday As String) As Integer Dim age As Integer '// 年齢計算 age = Application.Evaluate("DATEDIF(""" & birthday & """, TODAY(), ""Y"")") GetAgeWorksheet = age End Function |
ワークシート関数を使う方法については「VBAからExcelのワークシート関数を使う」をご参照ください。
2. Date型の変数の差から年齢を求める方法
VBA関数のDateDiff関数を使って年齢を求めます。
ただ、DateDiff関数で年齢を求めるには工夫が必要です。
DateDiff関数は年度の差を算出しますので、2017/12/31と2018/1/1のように365日経ってなくても年が変わったら1年としてカウントします。
その問題を回避するために引数の月日が処理日の月日に達しているかをチェックし、未達であれば年数を減らしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Function GetAge(birthday As String) As Integer Dim age As Integer '// 年齢 '// 引数の日付チェック If IsDate(birthday) = False Then GetAge = -1 Exit Function End If '// 年齢計算 age = DateDiff("yyyy", birthday, Now) '// 引数月日がシステム日付に達していない場合 If Date < DateSerial(Year(Now), Month(birthday), Day(birthday)) Then '// 年度差の調整 age = age - 1 End If GetAge = CInt(age) End Function |
使い方
上の2つの年齢計算関数はどちらも同じ使い方になります。
1 2 3 4 5 |
Sub GetAgeTest() Debug.Print GetAge("2017/5/31") Debug.Print GetAge("2017/6/01") Debug.Print GetAge("2018/5/31") End Sub |