[Excel]住所の分割

Excelに入力された住所録から、市区町村の部分を取り出したったのですが、適当な方法が思いつかなかったので、ユーザー関数を書いてみました。

都道府県 を取り出す方法は、いろいろと方法が見つかったのですが、さすがに市区町村を正しく取り出す処理は、Excelの関数群だけで行うのは無理っぽい様です。

Python向けに書かれた簡単なソースが見つかったのですが、Excelの正規表現は、貪欲な量化演算子(??)をサポートしていないようなので、都道府県だけを先に取り出してから、市区町村とそれ以降を分割する様にしてあります。

手元の住所録で動作確認を行ったところ、問題なく分割できる事を確認できましので公開します。Affero GPLライセンスで公開します。基本的には自由に利用できます。
使い方は、コメントを参考にして下さい。


Option Explicit
' ------------------------------------------------------
'
'   住所分割 splitaddr
'       IN  : sAddr : 都道府県+市区町村+それに続く住所 文字列
'             sMode : 分割箇所
'                       0        => 都道府県 (省略時)
'                       1        => 市区町村
'                       上記以外 => 市区町村以降の住所
'       OUT : 分割された住所
'
'       ex) A1 : 京都府京都市西京区山田平尾町17
'           B1 : =splitaddr(A1,0)   # 京都府
'           C1 : =splitaddr(A1,1)   # 京都市西京区
'           D1 : =splitaddr(A1,2)   # 山田平尾町17
'           青森県青森市東造道2丁目1-1
'               0 => 青森県
'               1 => 青森市
'               2 => 東造道2丁目1-1
'           埼玉県北足立郡伊奈町大字小室780
'               0 => 埼玉県
'               1 => 北足立郡伊奈町
'               2 => 大字小室780
'           山口県周南市孝田町1-1
'               0 => 山口県
'               1 => 周南市
'               2 => 本孝田町1-1
'
'   ref) https://teratail.com/questions/139690
'
'   Created by Yasuyuki Imai <waver5516@gmail.com>
'   Licence Affero GPL
'
' ------------------------------------------------------
Public Function splitaddr(sAddr As Variant, Optional iMode As Integer = 0)
    '-------------------------------
    '--- 変数定義
    '-------------------------------
    Dim sC3r As String, i As Integer
    Dim objReg As Object, objMatches As Object, objMatches2 As Object
    Dim sR1 As String, sR2 As String, sR3 As String, sR As String

    '-------------------------------
    '--- 正規表現オブジェクト
    '-------------------------------
    Set objReg = CreateObject("VBScript.RegExp")

    '-------------------------------
    '--- 都道府県 取得
    '-------------------------------
    sC3r = Mid(sAddr, 3, 1)
    objReg.Pattern = "[都道府県]"
    Set objMatches = objReg.Execute(sC3r)
    If objMatches.Count > 0 Then
        sR1 = Left(sAddr, 3)
        sAddr = Mid(sAddr, 4)
    Else
        sR1 = Left(sAddr, 4)
        sAddr = Mid(sAddr, 5)
    End If

    '-------------------------------
    '--- 市区町村 & それ以降 取得
    '-------------------------------
    objReg.Pattern = "((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下>松|岩国|田川|大村|宮古|富良野|別府|佐伯|黒部|小諸|塩尻|玉野|周南)市|(?:余市|高市|[^市]{2,3}?)郡(?:玉村|大町|.{1,5}?)[町村]|(?:.{1,4}市)?[^町]{1,4}?区|.{1,7}?[市町村])"
    Set objMatches = objReg.Execute(sAddr)
    If objMatches.Count > 0 Then
        Set objMatches2 = objMatches(0).SubMatches
        sR2 = objMatches2(0)
        sR3 = Mid(sAddr, Len(sR2) + 1)
    End If

    '-------------------------------
    '--- 結果を戻す
    '-------------------------------
    If iMode = 0 Then
        sR = sR1
    ElseIf iMode = 1 Then
        sR = sR2
    Else
        sR = sR3
    End If
    splitaddr = sR
End Function

シェアする

  • このエントリーをはてなブックマークに追加

フォローする