子供の学年が上がるに連れ、日本史を習うようになりました。
一方、自身の学生時代を振り返ってみましたが、無味乾燥な年代暗記が苦手で、成績も今一つでした。
そこで思いついたのが、以下の切り口による歴史の理解です。
歴史的な出来事が起きたその時、主な歴史上の人物が何歳だったか?
これならば、歴史に興味を持つ切っ掛けになるかも。
単に「面白そう」という理由もあり、あまり深く考えず Excel で表を作成してみました。
直ぐに、問題に突き当たりました。
Excel は、1900年1月1日以前の日付を、日付として認識してくれないのです。
そこで、暦が400年周期であることを利用して、1899年以前の日付を先送りにしてみました。
これならば、上手くいきそうです。早速、未来日に変換する関数を作成してみました。
Function DateConv(str As Variant) As Date Dim myReg As RegExp Dim mCase As MatchCollection Dim sMach As SubMatches Set myReg = New RegExp myReg.Pattern = "(^\d{4})\D?(\d{1,2})\D?(\d{1,2})" If myReg.test(str) = True Then Set mCase = myReg.Execute(str) Set sMach = mCase(0).SubMatches DateConv = DateSerial(sMach(0) + 2000, sMach(1), sMach(2)) End If End Function
※「Microsoft VBScript Regular Expressions 5.5」を参照済み
文字列を日付に変換するために、正規表現を用いて年・月・日に相当する数値を抜き出しています。今は21世紀ですから、未来日は2000年後にしてみました。結果、無事に計算することが出来ました。
ところで一つ、気になる点がありました。変換対象であるか否かを判別するために IsDate関数を用いたところ、"1534/05/12" を日付と認識したのです。1900年より遥か昔なのに、どうしてでしょうか。
調べてみたところ、(単に私が知らないだけでしたが)Excel VBA では、
西暦100年1月1日 ~ 西暦9999年12月31日
を日付として認識可能だというのです。ということは、つまり・・・
Function CalcDateDiff(startDate As Date, endDate As Date) As Date CalcDateDiff = DateDiff("yyyy", startDate, endDate) End Function
これで充分でした。
VBA でも「1900年より前を日付として認識でない」と思い込んでいたため、無駄なことをしてしまいました(残念!)。
参考まで。