【コード】西暦を和暦にする(その2)

昨日の「西暦を和暦にするマクロ」に続いて、もう少し実用的なマクロをご紹介します。

昨日のマクロは、例えば、「日本語の原文を英文に翻訳する場合」を想定します。

日本語中の和暦が英文中で正確に西暦に翻訳されているのかを確認するために、英文に対して、このマクロを実行します。

すると、英文中の「西暦と考えられる4桁数字」が黄色の蛍光ペンで着色されて和暦にて表示されます。

よって、この翻訳文(英文)中の和暦と原文(日本文)中の和暦との整合を見て、正確に翻訳されているのかを確認できます。

チェック用ですね。

このマクロでできること

今回は、「西暦と考えられる4桁数字」の判別精度を高めます

もともと「明治~平成」までしか和暦への変換がありませんので、「1200」という数字があった場合、これを着色したり変換したりする必要がないわけです。

前回のマクロでは、「5678」という数字も西暦の候補として変換してしまいます。すると、全くありえない「平成3690年」という表示に変換されてしまいます。

そこで、水野麻子さんの「ワイルドカードで引用文献を探す 」にワイルドカードの例を参考にさせていただき、西暦の候補を探す精度を高めました。

また、前回の記事にも書きましたが、「元年」に対応する1912年、1926年、1989年しては要チェックなので赤色蛍光ペンで着色するようにしました。

さらに、しつこいかもしれませんが、現在の年よりも大きな4桁数字には青色蛍光ペンで着色するようにしました。

以下のように変換されます。

変換例

2800年代や2900年代は検索されても変換されないようにマクロを組むこともできますが、これ以上改造するのはやめておきます。

マクロの解説

4桁数字を探すワイルドカードを以下のように設定しています。

[12]{1}[089]{1}[0-9]{2}

(詳しくは、ワイルドカードで引用文献を探す をご覧下さい。)

前後に半角数字がこないように、

[!0-9]

を記載しています。このことで、4桁数字を検出できます。

この検索式を用いると、最初に1か2が記載され、次に0, 8, 9のいずれかが記載され、最後に0~9のうちの数字が2つ並ぶという4桁数字を探すことができます。

よって、1000~1099、1800~1899、1900~1999、2000~2099、2800~2899、2900~2999の4桁数字だけを検索できるわけです。

0001~9999となる4桁数字を検索してしまう前回のパターンと比べて、かなり精度が高まった(絞り込まれている)ことを確認できると思います。

なので、関係のない4桁数字を省き無駄な整合チェックをしなくてもよくなりますね。

なお、今回のマクロは、対象となるWord文書中の蛍光ペンを最初に全て解除しますので、ご注意下さい。

マクロ


Sub 西暦を和暦に変換_その2()
 Dim myRange As Range
 Dim myNum As Integer

 ActiveDocument.Range.HighlightColorIndex = wdNoHighlight

 Set myRange = ActiveDocument.Range(0, 0)
 With myRange.Find
  .Text = "[!0-9][12]{1}[089]{1}[0-9]{2}[!0-9]"
  .Forward = True
  .Wrap = wdFindStop
  .MatchWildcards = True
 End With

 Do While myRange.Find.Execute = True
  With myRange
   .End = .End - 1
   .Start = .Start + 1
   myNum = .Text
   Select Case myNum
    Case 1912
     .HighlightColorIndex = wdRed
    Case 1926
     .HighlightColorIndex = wdRed
    Case 1989
     .HighlightColorIndex = wdRed
    Case Is > Format(Now, "yyyy")
     .HighlightColorIndex = wdBlue
    Case Else
     .HighlightColorIndex = wdYellow
   End Select
   .Text = Format(myNum & "/01/01", "ggge年")
   .Collapse direction:=wdCollapseEnd
  End With
 Loop

End Sub

トップへ戻る