「満年齢」を算出することができない、というのがそれです。
じゃあ、ApplicationオブジェクトのWorksheetfunctionコレクションからDATEDIFを、と言いたくなりますがこれが使えない関数なのです。
でも指定日付時点年齢はどうしても必要で、それを手打ちにするのはちょっとレコード数的に現実的じゃないよ、という事で代替手段を考えました。それが以下。
- worksheetfunctionでDAYS360関数を利用し、日付間の日数を求める。
- 1を/360して、年数にする。
- 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 件のコメント:
コメントを投稿