目次
このマクロでできること
- エクセルに打ち込んだ和暦(例:明治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("戸籍データ")
▶️ 実行手順
- メニュー「開発」→「マクロ」
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」の支援を受けて構築し、実務上の使用に耐えるよう調整を加えています。
ただし、ご利用にあたっては、各自の責任にてご判断・ご対応いただきますようお願いいたします。
本マクロの使用により生じたいかなる損害・不具合等についても、筆者は一切の責任を負いかねますので、予めご了承ください。
環境や使用目的に応じて、適宜バックアップを取りながらご活用いただけますと安心です。