和暦は突然改元されるので、史料に書かれた日付が実在するのか逐一確認する必要がある*1。架空の年号*2としてよく知られるのは未来年号である。未来年号で書かれているからといってただちに偽文書であるとはいえないが、内容を読む上で避けて通れない作業である。年号と干支が一致しない場合、どちらを採用するのか、それとも別の年代か、あるいはそもそも文書自体が「『神の手』によって創り上げられた作品」(意図は問わない)なのかという問題もある*3。
今日使われる歴史的事件名と同時代に記された年代が食い違うケースは珍しくない。たとえば秀吉による最初の「唐入」は天正20年からだが、12月8日「文禄」に改元されたので一般には「文禄の役」と呼ばれる。また嘉永7年11月4日と5日に起きた東海地震、南海地震は11月27日に「安政」に改元されたため「安政」地震と呼ばれる。歴史叙述上問題ない*4が、同時代史料に安政東海地震や安政南海地震が起きた年代が「安政元年」と記されていることはありえない*5。逆に改元されても旧来の年号を引き続き使用する例はよく見られる。
ちなみにポルトガル宣教師たちは「年号」を以下のように説明している。
Nengǒ(ネンガゥ)
年号、日本で頻繁に変わる、時代の通称
(『邦訳日葡辞書』458頁)
ここで「①日本で、②頻繁に変わる」という部分が重要である。 明やベトナムが一世一元制であり、改元が新皇帝践祚の翌年元日に行われるのに対して、という含意なのだろう。
註:文禄5年は10月27日に改元されたのでそれより前の「閏7月」は慶長1年ではなく文禄5年でなければならない。文書に「慶長元年閏7月」と記されていればその日付は未来年号である。
ただし本記事では地方暦は扱わない、というより扱えない。もとより地方暦を網羅することなど不可能なことである。京暦と地方暦が異なる例として有名なのは天正10年閏12月の件であろう。京暦では置かれなかったが、東国では置かれた形跡がある*6。置かれたとすれば京都と当該地域は1ヶ月ほど時差が生じる。
使用例
天正20年12月7日はまだ改元前なので「天正20壬辰年」と返す例。
翌8日「文禄」に改元されたので「文禄1壬辰年」と返す例。
文禄2年1月は小の月、29日までしかないので実在しない旨返す例。
VBAコードを除いた雛形はこちらから。
コード
Private Sub 年号判定_Click()
Dim i As Long, j As Long, SerialNo As Long
Dim 年月 As String, 日 As Long
Dim row As Long, column As Long
年月 = Range("Q1").Value
日 = Range("U1").Value
row = WorksheetFunction.XMatch(年月, Range("H3:H2006"), 1)
column = WorksheetFunction.XMatch(日, Range("I2:AL2"), 1)
SerialNo = WorksheetFunction.Index(Range("I3:AL2006"), row, column)
i = Range("AD1").Value
j = Range("U1").Value
Range("AA1").Calculate
Range("AD1").Calculate
If SerialNo = 0 Then
MsgBox "お調べになった日付は使われておりません" & vbCrLf & "年代をよくお確かめの上再度お調べ直しください"
Range("AA1").Value = ""
Range("AG1").Value = ""
Else
Range("AA1").Value = SerialNo
Range("AA1").Calculate
Range("AD1").Calculate
Select Case Range("A" & i)
Case Is = ""
Range("AG1").Value = Range("B" & i).Value
MsgBox "その日は" & Range("B" & i).Value & Range("C" & i).Value & "年です"
Case Is <> ""
Select Case Range("F" & i)
Case Is = ""
Range("AG1").Value = Range("B" & i).Value
MsgBox "その日は" & Range("B" & i).Value & Range("C" & i).Value & "年です"
Case Is <> ""
If j >= Range("F" & i).Value Then
Range("AG1").Value = Range("A" & i).Value
MsgBox "その日は" & Range("A" & i).Value & Range("C" & i).Value & "年です"
Else
Range("AG1").Value = Range("B" & i).Value
MsgBox "その日は" & Range("B" & i).Value & Range("C" & i).Value & "年です"
End IfEnd Select
End Select
End If
End Sub
エクスキュース
ド素人が見よう見まねで組んだものですので、答えるまでに数秒かかりますし、不備ばかりと思います。お気づきの点がありましたらコメント欄にてご教示下さい。