【Word VBA】西暦の後に和暦を追記するマクロ【編集作業に便利】

みなさん,こんにちは。
シンノユウキ(shinno1993)です。

テキストの編集・校正の際に役立つだろうツールを紹介していきます。

今回はWord VBAを使用し,西暦の後に和暦を追加するマクロを紹介したいと思います。下記のようなことをやるマクロです:

これをすることで,例えば下記の文書のように西暦の後に簡単に和暦も併記することができるようになります:

スポンサーリンク

西暦の後に和暦を追記するマクロ

西暦の後に和暦を追加するマクロのコードは下記のようになります:

Sub 西暦の後に和暦を追記()
    Dim rng As Range: Set rng = ActiveDocument.Range(0, 0)
    With rng.Find
        .text = "[0-9]{4,}年"
        .MatchWildcards = True
        .MatchFuzzy = False
        Do While .Execute
            Dim 西暦 As Integer: 西暦 = Left(rng.text, 4) '年のみ
            Dim 和暦 As String: 和暦 = 西暦を和暦に変換(西暦)
            rng.Characters.Last.InsertBefore "(" & 和暦 & ")"
            '↓ 選択を解除する。これがないと,次の検索が実行されない
            rng.Collapse wdCollapseEnd
        Loop
    End With
    Set rng = Nothing
    MsgBox "処理が完了しました", vbOKOnly, "完了"
End Sub

Function 西暦を和暦に変換(西暦_年のみ As Integer) As String
    '対象となる日付は12月31日です。そのため,例えば2019年は「令和元」になります。
    Dim 和暦 As String: 和暦 = Format(DateSerial(西暦_年のみ, 12, 31), "ggge")
    If 和暦 = "大正1" Or 和暦 = "昭和1" Or 和暦 = "平成1" Or 和暦 = "令和1" Then
        西暦を和暦に変換 = Replace(和暦, 1, "元")
    Else
        西暦を和暦に変換 = 和暦
    End If
End Function

このコードを実行することで,Word文書内に入力されている西暦と年の間に和暦を追記することができます。

(補足)コードの解説

上記のコードを実行することで,とりあえず必要を満たすことはできるでしょう。しかし,それだけではやはり寂しいので,コードを読み解く際に躓きそうな箇所を中心に少し解説しておきます。私が2回めに読んだ際に躓かないように,という意味も含まれています。

    With rng.Find
        .text = "[0-9]{4,}年"
        .MatchWildcards = True
        .MatchFuzzy = False
        Do While .Execute
            Dim 西暦 As Integer: 西暦 = Left(rng.text, 4) '年のみ
            Dim 和暦 As String: 和暦 = 西暦を和暦に変換(西暦)
            rng.Characters.Last.InsertBefore "(" & 和暦 & ")"
            '↓ 選択を解除する。これがないと,次の検索が実行されない
            rng.Collapse wdCollapseEnd
        Loop
    End With

ここでは,Word文書から西暦に該当する部分を正規表現(.text = "[0-9]{4,}年")で検索し,西暦の最後の文字の手前(つまり「年」の手前)に,関数を使用して変換した和暦をパーレンで囲って挿入しています。

ここで少し面倒なのがrng.Characters.Last.InsertBefore "(" & 和暦 & ")"だと思います。Wordで文字列を挿入するためには,InsertBeforeInsertAfterを使用しますが,rng.InsertBeforerng.InsertAfterだと検索された文字列(例:2000年)の前か後ろに挿入されてしまいます。それだと,「年」の前に挿入することはできません。そこで,rng.Characters.Last.InsertBeforeにすることで,検索された文字列の最後の一文字(年)の前に和暦を挿入することができるのです。

Function 西暦を和暦に変換(西暦_年のみ As Integer) As String
    '対象となる日付は12月31日です。そのため,例えば2019年は「令和元」になります。
    Dim 和暦 As String: 和暦 = Format(DateSerial(西暦_年のみ, 12, 31), "ggge")
    If 和暦 = "大正1" Or 和暦 = "昭和1" Or 和暦 = "平成1" Or 和暦 = "令和1" Then
        西暦を和暦に変換 = Replace(和暦, 1, "元")
    Else
        西暦を和暦に変換 = 和暦
    End If
End Function

西暦から和暦に変換する関数です。西暦といっても年だけですので,VBAでいうところの日付型として利用することはできません。そこでDateSerial関数を使用することで月と日を補完し,日付型に変換した上でFormat関数を使用して和暦に変換しています。ここで12月31日を基準としていますので,たとえば2019年は令和元年(本来は平成と令和が混在する)となります。注意してください。

また,Fotmat関数では「元」年は「1」年と表示されていまいますが,令和1年という表記は,あまり受け入れられません。そこで,"大正1" ,"昭和1", "平成1","令和1"の場合に,Replace関数を使用して「1」を「元」に置換しています。強引な処理であまり好きではないので,もしもっとスマートな方法をご存知の方がいらっしゃれば教えて下さい。

まとめ

今回はWordVBAを使用して,西暦の後に和暦を追記するマクロを紹介しました。

Wordファイルでなく,テキストファイルについて処理する方がいくらか簡単な場合もあるでしょう。しかし,Wordファイルのまま処理できるのも便利なものです。

参考になれば!

タイトルとURLをコピーしました