見出し画像

Excelのマクロ(VBA)で住所を都道府県/市区町村/町名番地(あまり部分)に完全分割する処理

住所を都道府県/市区町村/町名番地(あまり部分)に分割する処理について

例えば
住所:□□県△△市○○1234-56
都道府県/市区町村/町名番地(あまり部分)
□□県  △△市  ○○1234-56
簡単なようだが、文字列としてみるとメンドクサイ。
都道府県は47パターンあり、例外見つけたら「不明」にする処理にする。
これはまだ良い。
問題は市区町村だ。
市区郡町村に区分されるが
△△市/△△区/△△郡△△町/△△村 
のパターンがあるのと、政令指定都市の△△市△△区や、東村山市、武蔵村山市等、市の内側に村の文字列があるイレギュラーパターンがいくつか存在する。こいつらを処理するのが一番メンドクサイ。
処理本体のbunkatu、都道府県判定hantei1例文を下記に記載。
市区町村と町名番地の処理はhantei2にて記載。
例としてA列にある住所をB(都道府県)C(市区町村)D(町名番地)に分割する処理にした。

'1つのセルにあるJS文字列を
'TDFK(都道府県)・SKTS(市区町村)・TMBT(町名番地)の三つに分けて出力する

'プロシージャ間やりとり考えるのだるいので、publicで宣言
Public JS As String '住所の全文字列格納用
Public TDFK As String '都道府県 文字列格納用
Public SKTS As String '市区町村 文字列格納用
Public TMBT As String '町名番地 文字列格納用
Public strLeft As String '左から文言抜き出し用
Public instrNum1 As Long '区までの文字列 抜き出し用
Public instrNum2 As Long '市までの文字列 抜き出し用
Public instrNum3 As Long '郡までの文字列 抜き出し用
Public instrNum4 As Long '町までの文字列 抜き出し用
Public instrNum5 As Long '村までの文字列 抜き出し用
Sub bunkatu() '処理本体
    Application.ScreenUpdating = False  'エクセル描画処理を停止(動作速度を早めるため)
    Dim j As Long '列カウント変数
    Dim i As Long '数字変換用カウント変数
    
    Worksheets("シート").Select '作業シート選択
    
    Do While Cells(1 + j, 1).Value <> ""     '空セルまでループ 1+jは開始行、1は開始列
        Application.StatusBar = "" & j & "処理中…" 'Excel左下のステータスバーに進捗表示
        If Cells(1 + j, 1).Value = "" Then  'A1+j セルの中身がない場合
            Exit Do '条件満たしたらループを抜ける
        End If
        
        JS = Cells(1 + j, 1).Value 'JS取得しJSに代入
        
        Call naosi '諸々の文字列を修正
        'TDFK(都道府県)・SKTS(市区町村)・TMBT(町名番地)に分割
        Call hantei1 'TDFK(都道府県)分割処理呼び出し
        Call hantei2 'SKTS(市区町村)分割処理呼び出し
        
        '出力
        Cells(1 + j, 2).Value = TDFK 'B列(初期はB1セル)
        Cells(1 + j, 3).Value = SKTS 'C列
        Cells(1 + j, 4).Value = TMBT 'D列

        j = j + 1 '次の行処理するためカウンタをプラス1する
    Loop
    
    Application.StatusBar = "完了" 'Excel左下のステータスバーに進捗表示
    MsgBox "完了"  'メッセージボックスで完了表示
    
    '後処理
    Application.StatusBar = False 'Excel左下のステータスバーリセット
    Application.ScreenUpdating = True '描画を再開する
End Sub
Sub naosi()
    '■JSの中に、全角数字あったら半角にする。
    For i = 1 To Len(JS)
        If Mid(JS, i, 1) Like "[0-9]" Then
        Mid(JS, i, 1) = StrConv(Mid(JS, i, 1), vbNarrow)
    End If
    Next
    
    '■全角のハイフンあったら半角にする
    If InStr(JS, "ー") > 0 Then
        JS = Replace(JS, "ー", "-") 'ーを-に置換する
    End If
End Sub
Sub hantei1() '長いのでこの処理呼び出しする
    '47都道府県(TDFK)判定し、見つけたらJS(住所)部分から削る
    If InStr(JS, "北海道") > 0 Then  '1 北海道あったらJSから削る
        JS = Replace(JS, "北海道", "")
        TDFK = "北海道"
    ElseIf InStr(JS, "青森県") > 0 Then  '2 上と同じ。下記同処理コメント省略
        JS = Replace(JS, "青森県", "")
        TDFK = "青森県"
    ElseIf InStr(JS, "岩手県") > 0 Then  '3
        JS = Replace(JS, "岩手県", "")
        TDFK = "岩手県"
    ElseIf InStr(JS, "宮城県") > 0 Then  '4
        JS = Replace(JS, "宮城県", "")
        TDFK = "宮城県"
    ElseIf InStr(JS, "秋田県") > 0 Then  '5
        JS = Replace(JS, "秋田県", "")
        TDFK = "秋田県"
    ElseIf InStr(JS, "山形県") > 0 Then  '6
        JS = Replace(JS, "山形県", "")
        TDFK = "山形県"
    ElseIf InStr(JS, "福島県") > 0 Then  '7
        JS = Replace(JS, "福島県", "")
        TDFK = "福島県"
    ElseIf InStr(JS, "茨城県") > 0 Then  '8
        JS = Replace(JS, "茨城県", "")
        TDFK = "茨城県"
    ElseIf InStr(JS, "栃木県") > 0 Then  '9
        JS = Replace(JS, "栃木県", "")
        TDFK = "栃木県"
    ElseIf InStr(JS, "群馬県") > 0 Then  '10
        JS = Replace(JS, "群馬県", "")
        TDFK = "群馬県"
    ElseIf InStr(JS, "埼玉県") > 0 Then  '11
        JS = Replace(JS, "埼玉県", "")
        TDFK = "埼玉県"
    ElseIf InStr(JS, "千葉県") > 0 Then  '12
        JS = Replace(JS, "千葉県", "")
        TDFK = "千葉県"
    ElseIf InStr(JS, "東京都") > 0 Then  '13
        JS = Replace(JS, "東京都", "")
        TDFK = "東京都"
    ElseIf InStr(JS, "神奈川県") > 0 Then  '14
        JS = Replace(JS, "神奈川県", "")
        TDFK = "神奈川県"
    ElseIf InStr(JS, "新潟県") > 0 Then  '15
        JS = Replace(JS, "新潟県", "")
        TDFK = "新潟県"
    ElseIf InStr(JS, "富山県") > 0 Then  '16
        JS = Replace(JS, "富山県", "")
        TDFK = "富山県"
    ElseIf InStr(JS, "石川県") > 0 Then  '17
        JS = Replace(JS, "石川県", "")
        TDFK = "石川県"
    ElseIf InStr(JS, "福井県") > 0 Then  '18
        JS = Replace(JS, "福井県", "")
        TDFK = "福井県"
    ElseIf InStr(JS, "山梨県") > 0 Then  '19
        JS = Replace(JS, "山梨県", "")
        TDFK = "山梨県"
    ElseIf InStr(JS, "長野県") > 0 Then  '20
        JS = Replace(JS, "長野県", "")
        TDFK = "長野県"
    ElseIf InStr(JS, "岐阜県") > 0 Then  '21
        JS = Replace(JS, "岐阜県", "")
        TDFK = "岐阜県"
    ElseIf InStr(JS, "静岡県") > 0 Then  '22
        JS = Replace(JS, "静岡県", "")
        TDFK = "静岡県"
    ElseIf InStr(JS, "愛知県") > 0 Then  '23
        JS = Replace(JS, "愛知県", "")
        TDFK = "愛知県"
    ElseIf InStr(JS, "三重県") > 0 Then  '24
        JS = Replace(JS, "三重県", "")
        TDFK = "三重県"
    ElseIf InStr(JS, "滋賀県") > 0 Then  '25
        JS = Replace(JS, "滋賀県", "")
        TDFK = "滋賀県"
    ElseIf InStr(JS, "京都府") > 0 Then  '26
        JS = Replace(JS, "京都府", "")
        TDFK = "京都府"
    ElseIf InStr(JS, "大阪府") > 0 Then  '27
        JS = Replace(JS, "大阪府", "")
        TDFK = "大阪府"
    ElseIf InStr(JS, "兵庫県") > 0 Then  '28
        JS = Replace(JS, "兵庫県", "")
        TDFK = "兵庫県"
    ElseIf InStr(JS, "奈良県") > 0 Then  '29
        JS = Replace(JS, "奈良県", "")
        TDFK = "奈良県"
    ElseIf InStr(JS, "和歌山県") > 0 Then  '30
        JS = Replace(JS, "和歌山県", "")
        TDFK = "和歌山県"
    ElseIf InStr(JS, "鳥取県") > 0 Then  '31
        JS = Replace(JS, "鳥取県", "")
        TDFK = "鳥取県"
    ElseIf InStr(JS, "島根県") > 0 Then  '32
        JS = Replace(JS, "島根県", "")
        TDFK = "島根県"
    ElseIf InStr(JS, "岡山県") > 0 Then  '33
        JS = Replace(JS, "岡山県", "")
        TDFK = "岡山県"
    ElseIf InStr(JS, "広島県") > 0 Then  '34
        JS = Replace(JS, "広島県", "")
        TDFK = "広島県"
    ElseIf InStr(JS, "山口県") > 0 Then  '35
        JS = Replace(JS, "山口県", "")
        TDFK = "山口県"
    ElseIf InStr(JS, "徳島県") > 0 Then  '36
        JS = Replace(JS, "徳島県", "")
        TDFK = "徳島県"
    ElseIf InStr(JS, "香川県") > 0 Then  '37
        JS = Replace(JS, "香川県", "")
        TDFK = "香川県"
    ElseIf InStr(JS, "愛媛県") > 0 Then  '38
        JS = Replace(JS, "愛媛県", "")
        TDFK = "愛媛県"
    ElseIf InStr(JS, "高知県") > 0 Then  '39
        JS = Replace(JS, "高知県", "")
        TDFK = "高知県"
    ElseIf InStr(JS, "福岡県") > 0 Then  '40
        JS = Replace(JS, "福岡県", "")
        TDFK = "福岡県"
    ElseIf InStr(JS, "佐賀県") > 0 Then  '41
        JS = Replace(JS, "佐賀県", "")
        TDFK = "佐賀県"
    ElseIf InStr(JS, "長崎県") > 0 Then  '42
        JS = Replace(JS, "長崎県", "")
        TDFK = "長崎県"
    ElseIf InStr(JS, "熊本県") > 0 Then  '43
        JS = Replace(JS, "熊本県", "")
        TDFK = "熊本県"
    ElseIf InStr(JS, "大分県") > 0 Then  '44
        JS = Replace(JS, "大分県", "")
        TDFK = "大分県"
    ElseIf InStr(JS, "宮崎県") > 0 Then  '45
        JS = Replace(JS, "宮崎県", "")
        TDFK = "宮崎県"
    ElseIf InStr(JS, "鹿児島県") > 0 Then  '46
        JS = Replace(JS, "鹿児島県", "")
        TDFK = "鹿児島県"
    ElseIf InStr(JS, "沖縄県") > 0 Then  '47
        JS = Replace(JS, "沖縄県", "")
        TDFK = "沖縄県"
    Else
        TDFK = "都道府県不明" '判定出来ない場合は不明にする
    End If
End Sub

■イレギュラーの市区町村一覧。チートだろ。
このイレギュラーさえ押さえれば全国の市区町村は完全に分ける事が出来る。
余市町
村田町
田村市
市貝町
玉村町
市川市
市原市
町田市
羽村市
十日町市
上市町
野々市市
市川三郷町
大町市
四日市市
市川町
下市町
廿日市市
大町町
大村市
武蔵村上市
東村上市
村上市
ヒントは記載したので、これで十分でしょう。
市区町村の切り分けVBAコードが見たい方は下記hantei2を参照してください。

ここから先は

4,580字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?