住所を「都道府県」「市区町村」「番地以降」に分けるとき、単純な文字検索では限界があります。
正規表現(RegExp) を使うと、より柔軟で精度の高い分割が可能です。
コード例(住所を3分割)
Sub SplitAddressWithRegex()
Dim i As Long, lastRow As Long
Dim addr As String
Dim regex As Object
Dim matches As Object
' 正規表現オブジェクトを作成
Set regex = CreateObject("VBScript.RegExp")
regex.IgnoreCase = False
regex.Global = True
' パターン: 都道府県、市区町村、番地以降をキャプチャ
' 例: 東京都江東区亀戸1-1-1
regex.Pattern = "^(北海道|青森県|岩手県|宮城県|秋田県|山形県|福島県|" & _
"茨城県|栃木県|群馬県|埼玉県|千葉県|東京都|神奈川県|" & _
"新潟県|富山県|石川県|福井県|山梨県|長野県|" & _
"岐阜県|静岡県|愛知県|三重県|" & _
"滋賀県|京都府|大阪府|兵庫県|奈良県|和歌山県|" & _
"鳥取県|島根県|岡山県|広島県|山口県|" & _
"徳島県|香川県|愛媛県|高知県|" & _
"福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県)" & _
"(.+?[市区町村])(.+)$"
' A列の最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lastRow
addr = Trim(Cells(i, 1).Value)
If addr <> "" Then
If regex.Test(addr) Then
Set matches = regex.Execute(addr)
Cells(i, 2).Value = matches(0).SubMatches(0) ' 都道府県
Cells(i, 3).Value = matches(0).SubMatches(1) ' 市区町村
Cells(i, 4).Value = matches(0).SubMatches(2) ' 番地以降
Else
Cells(i, 2).Value = "不明"
Cells(i, 3).Value = "不明"
Cells(i, 4).Value = addr
End If
End If
Next i
End Sub
VB解説
- 正規表現パターン
^(都道府県)→ 住所の先頭にある都道府県をキャプチャ(.+?[市区町村])→ 市区町村名をキャプチャ(最短一致で「市」「区」「町」「村」まで)(.+)$→ 残りを番地以降としてキャプチャ
SubMatches(0)→ 都道府県SubMatches(1)→ 市区町村SubMatches(2)→ 番地以降
実行イメージ
| A列(住所) | B列(都道府県) | C列(市区町村) | D列(番地以降) |
|---|---|---|---|
| 東京都江東区亀戸1-1-1 | 東京都 | 江東区 | 亀戸1-1-1 |
| 神奈川県横浜市中区山下町1-1 | 神奈川県 | 横浜市 | 中区山下町1-1 |
| 大阪府大阪市北区梅田1-1-1 | 大阪府 | 大阪市 | 北区梅田1-1-1 |
| 福岡県福岡市博多区博多駅前1-1 | 福岡県 | 福岡市 | 博多区博多駅前1-1 |
応用ポイント
- 郡や丁目にも対応 → 正規表現を拡張すれば「郡」「丁目」「番地」「号」まで抽出可能
- 郵便番号と組み合わせ → 郵便番号から住所を補完して分割
- データベース化 → 都道府県・市区町村・番地を別カラムに保存して検索性を向上
💡 正規表現を使うと「住所のパターンが多少違っても柔軟に分割」できるので、実務でのデータクリーニングに非常に強力です。


