2014年2月12日水曜日

VBAで満年齢を計算したい

Excelワークシート上で年齢を求めるのはDATEDIF関数を利用すれば良いんですが、VBAで似た“Datediff”関数を使おうとすると、思わぬ落とし穴があります。
「満年齢」を算出することができない、というのがそれです。

じゃあ、ApplicationオブジェクトのWorksheetfunctionコレクションからDATEDIFを、と言いたくなりますがこれが使えない関数なのです。

でも指定日付時点年齢はどうしても必要で、それを手打ちにするのはちょっとレコード数的に現実的じゃないよ、という事で代替手段を考えました。それが以下。

  1. worksheetfunctionでDAYS360関数を利用し、日付間の日数を求める。
  2. 1を/360して、年数にする。
  3. 2をINTして整数部分のみ取り出す。

今回は文字列型配列dset()に読み込んだデータを格納したり書き出したりするということでこんなコードになるんですが(部分)


 dset(6) = CStr(INT(Application.Worksheetfunction.Days360(DateValue(dset(5)), _
  Datevalue(dset(0))) / 360))

とりあえずは合ってると思うんだけど、閏年とか大丈夫かなぁ?と心配になります。それにWorksheet関数を利用してるってのはどうにもスマートさに欠ける気がする。

ってことで全て設定し終わった後ググってみました。そしたらあるじゃありませんかもっとスマートな方法が!

誕生日から年齢を求める(DateDiff、他)

結局孫引きになってますが(汗) 上記のコードの場合、こんな風に変えればいいかと。

 dset(6) = DateDiff("yyyy", DateValue(dset(5)), DateValue(dset(0)) + _
  (Format(DateValue(dset(5)), "mmdd") > Format(DateValue(dset(0), "mmdd"))

で、リンク先最後の記述通りFunctionプロシージャを作っておくと、色々応用が利くかもしれません。

Private Function GetAge(BirthDay as String, Dday as String) as String

 Dim fBirthday as Date  '日付型計算用
 Dim fDday as Date      '日付型計算用
 Dim CalcAge as Integer '年齢用整数型

 fBirthday = DateValue(Birthday) : fDday = dateValue(Dday)
 CalcAge = DateDiff("yyyy", fBirthday, fDday) + (Format(fBirthday, "mmdd") _
  > Format(fDday, "mmdd")

 GetAge = CStr(CalcAge)

End Function

今回は他で同様の年齢算出を使う機会がないのでPrivateレベルにしてますが、基幹システムなど特定のフォーマットに基づいたデータを扱うのであれば、もう一歩進んでクラス化してしまうという手もありますね。

0 件のコメント:

コメントを投稿