日本史と VBA (失敗談)
子供の学年が上がるに連れ、日本史を習うようになりました。
一方、自身の学生時代を振り返ってみましたが、無味乾燥な年代暗記が苦手で、成績も今一つでした。
そこで思いついたのが、以下の切り口による歴史の理解です。
歴史的な出来事が起きたその時、主な歴史上の人物が何歳だったか?
これならば、歴史に興味を持つ切っ掛けになるかも。
単に「面白そう」という理由もあり、あまり深く考えず 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年より前を日付として認識でない」と思い込んでいたため、無駄なことをしてしまいました(残念!)。
参考まで。