日本史と VBA (失敗談)

子供の学年が上がるに連れ、日本史を習うようになりました。
一方、自身の学生時代を振り返ってみましたが、無味乾燥な年代暗記が苦手で、成績も今一つでした。

そこで思いついたのが、以下の切り口による歴史の理解です。
歴史的な出来事が起きたその時、主な歴史上の人物が何歳だったか?
これならば、歴史に興味を持つ切っ掛けになるかも。

単に「面白そう」という理由もあり、あまり深く考えず Excel で表を作成してみました。

f:id:Infoment:20180708220328p:plain

直ぐに、問題に突き当たりました。
Excel は、1900年1月1日以前の日付を、日付として認識してくれないのです。

f:id:Infoment:20180708220944p:plain

そこで、暦が400年周期であることを利用して、1899年以前の日付を先送りにしてみました。

f:id:Infoment:20180708221504p:plain

これならば、上手くいきそうです。早速、未来日に変換する関数を作成してみました。

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年後にしてみました。結果、無事に計算することが出来ました。

f:id:Infoment:20180708222558p:plain

ところで一つ、気になる点がありました。変換対象であるか否かを判別するために 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

これで充分でした。

f:id:Infoment:20180708224015p:plain

VBA でも「1900年より前を日付として認識でない」と思い込んでいたため、無駄なことをしてしまいました(残念!)。

参考まで。