MENU

和暦を漢数字・西暦に変換するExcelマクロの使い方

目次

このマクロでできること

  • エクセルに打ち込んだ和暦(例:明治5年4月20日)を…
    • 漢数字の和暦(例:明治五年四月二十日)に変換
    • 西暦(例:1872年4月20日)に変換
  • 「萬延」などの旧字体にも対応
    • コードを活用(他の旧字も!など)する際のイメージとして追加
  • 全角数字でもOK(例:「平成5年」も処理可能)

📦 事前準備(マクロ実行の前に)

1. Excelファイルを開きます

対象の和暦データ(例:明治五年四月二十日)が、A列A2以降に入っている状態にしてください。

※A1は項目(和暦など)が入っている想定でいます

2. 「開発」タブを表示(初めての方のみ)

  • メニュー「ファイル」→「オプション」→「リボンのユーザー設定」
  • 「開発」にチェックを入れてOK

3. 「開発」→「Visual Basic」を開きます

表示されたウィンドウで「挿入」→「標準モジュール」を選び、コードを貼り付けます。

Sub ConvertExtendedWarekiToKanji()
    Dim ws As Worksheet
    Dim rng As Range
    Dim cell As Range
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    
    ' 対象シート名(ご自身の環境に合わせて変更してください)
    Set ws = ThisWorkbook.Sheets("シート名をここに")
    
    ' A2から下を対象
    Set rng = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)

    ' 和暦正規表現(元号 + 年月日)
    re.Global = False
    re.IgnoreCase = False
    re.Pattern = "^(慶応|慶應|元治|文久|安政|万延|萬延|万治|延宝|天保|文化|寛政|享和|宝暦|享保|元禄|元文|明和|安永|天明|寛政|文化|文政|弘化|嘉永|安政|万延|文久|元治|慶長|元和|寛永|正保|慶安|承応|明暦|万治|寛文|延宝|天和|貞享|明治|大正|昭和|平成|令和)(元|[0-90-9]{1,4})年([0-90-9]{1,2})月([0-90-9]{1,2})日$"

    ' 元号の西暦開始年
    Dim gengouDict As Object
    Set gengouDict = CreateObject("Scripting.Dictionary")
    gengouDict.Add "慶長", 1596
    gengouDict.Add "元和", 1615
    gengouDict.Add "寛永", 1624
    gengouDict.Add "正保", 1644
    gengouDict.Add "慶安", 1648
    gengouDict.Add "承応", 1652
    gengouDict.Add "明暦", 1655
    gengouDict.Add "万治", 1658
    gengouDict.Add "寛文", 1661
    gengouDict.Add "延宝", 1673
    gengouDict.Add "天和", 1681
    gengouDict.Add "貞享", 1684
    gengouDict.Add "元禄", 1688
    gengouDict.Add "宝永", 1704
    gengouDict.Add "正徳", 1711
    gengouDict.Add "享保", 1716
    gengouDict.Add "元文", 1736
    gengouDict.Add "寛保", 1741
    gengouDict.Add "延享", 1744
    gengouDict.Add "寛延", 1748
    gengouDict.Add "宝暦", 1751
    gengouDict.Add "明和", 1764
    gengouDict.Add "安永", 1772
    gengouDict.Add "天明", 1781
    gengouDict.Add "寛政", 1789
    gengouDict.Add "享和", 1801
    gengouDict.Add "文化", 1804
    gengouDict.Add "文政", 1818
    gengouDict.Add "天保", 1830
    gengouDict.Add "弘化", 1844
    gengouDict.Add "嘉永", 1848
    gengouDict.Add "安政", 1854
    gengouDict.Add "万延", 1860
    gengouDict.Add "萬延", 1860 ' 旧字対応
    gengouDict.Add "文久", 1861
    gengouDict.Add "元治", 1864
    gengouDict.Add "慶応", 1865
    gengouDict.Add "慶應", 1865
    gengouDict.Add "明治", 1868
    gengouDict.Add "大正", 1912
    gengouDict.Add "昭和", 1926
    gengouDict.Add "平成", 1989
    gengouDict.Add "令和", 2019

    For Each cell In rng
        If Not IsEmpty(cell.Value) Then
            Dim rawText As String
            rawText = Replace(cell.Value, "萬", "万") ' 旧字体対応

            If re.Test(rawText) Then
                Dim m As Object
                Set m = re.Execute(rawText)
                
                Dim gengo As String: gengo = m(0).SubMatches(0)
                Dim nen As String: nen = ZenkakuToHankaku(m(0).SubMatches(1))
                Dim month As String: month = ZenkakuToHankaku(m(0).SubMatches(2))
                Dim day As String: day = ZenkakuToHankaku(m(0).SubMatches(3))

                ' --- 漢数字の和暦を作成(B列)---
                Dim kanjiDate As String
                If nen = "元" Then
                    kanjiDate = gengo & "元年"
                    nen = "1"
                Else
                    kanjiDate = gengo & ConvertNumberToKanji(CInt(nen)) & "年"
                End If
                kanjiDate = kanjiDate & ConvertNumberToKanji(CInt(month)) & "月" & ConvertNumberToKanji(CInt(day)) & "日"
                ws.Cells(cell.Row, "B").Value = kanjiDate

                ' --- 西暦を出力(C列) ---
                If gengouDict.exists(gengo) Then
                    Dim seirekiYear As Long
                    seirekiYear = gengouDict(gengo) + CLng(nen) - 1
                    ws.Cells(cell.Row, "C").Value = seirekiYear & "年" & month & "月" & day & "日"
                Else
                    ws.Cells(cell.Row, "C").Value = "(西暦変換エラー)"
                End If
            Else
                ws.Cells(cell.Row, "B").Value = "(不明な形式)"
                ws.Cells(cell.Row, "C").Value = "(不明な形式)"
            End If
        End If
    Next cell

    MsgBox "和暦の漢数字・西暦変換が完了しました!", vbInformation
End Sub

Function ConvertNumberToKanji(ByVal num As Long) As String
    Dim kanjiDigits As Variant
    kanjiDigits = Array("", "一", "二", "三", "四", "五", "六", "七", "八", "九")
    
    If num = 0 Then
        ConvertNumberToKanji = "〇"
        Exit Function
    End If

    Dim result As String
    Dim tens As Long
    Dim ones As Long

    If num >= 1000 Then
        ' 千以上の数字はこの関数では対応しない
        ConvertNumberToKanji = CStr(num)
        Exit Function
    End If

    tens = Int(num / 10)
    ones = num Mod 10

    If tens > 0 Then
        If tens = 1 Then
            result = "十"
        Else
            result = kanjiDigits(tens) & "十"
        End If
    End If

    If ones > 0 Then
        result = result & kanjiDigits(ones)
    End If

    ConvertNumberToKanji = result
End Function


Function ZenkakuToHankaku(ByVal str As String) As String
    Dim i As Integer
    Dim result As String
    For i = 1 To Len(str)
        Dim ch As String
        ch = Mid(str, i, 1)
        If AscW(ch) >= &HFF10 And AscW(ch) <= &HFF19 Then
            result = result & ChrW(AscW(ch) - &HFF10 + &H30)
        Else
            result = result & ch
        End If
    Next i
    ZenkakuToHankaku = result
End Function

コードを貼り付ける(※シート名はご自身の環境に合わせて)

vbaコピーする編集する' 対象シート名(ご自身のシート名に変更してください)
Set ws = ThisWorkbook.Sheets("ID一覧")

たとえば「戸籍データ」というシート名なら:

vbaコピーする編集するSet ws = ThisWorkbook.Sheets("戸籍データ")

▶️ 実行手順

  1. メニュー「開発」→「マクロ」
  2. ConvertExtendedWarekiToKanji を選んで「実行」ボタン

✅ 出力結果のイメージ

A列(元データ)B列(漢数字)C列(西暦)
明治5年4月20日明治五年四月二十日1872年4月20日
萬延元年11月3日万延元年十一月三日1860年11月3日
平成5年3月1日平成五年三月一日1993年3月1日

🔍 備考・免責事項

本記事で紹介しているExcelマクロは、筆者の環境において実行テストを行い、基本的な動作確認を済ませております。
また、コードの一部については、OpenAIのAIツール「ChatGPT」の支援を受けて構築し、実務上の使用に耐えるよう調整を加えています。

ただし、ご利用にあたっては、各自の責任にてご判断・ご対応いただきますようお願いいたします。
本マクロの使用により生じたいかなる損害・不具合等についても、筆者は一切の責任を負いかねますので、予めご了承ください。

環境や使用目的に応じて、適宜バックアップを取りながらご活用いただけますと安心です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次