住所から“市区町村のみ”の情報を抽出する際に、“市”と一緒に“区”も抽出したい。


Excelの質問です。
前回、同様の質問 http://q.hatena.ne.jp/1479040277 を実施しまして。
市区町村での抽出ができていたのですが。

大阪府の住所から“区”を抽出しようとしますと。
全て「大阪市」として抽出されてしまいます。
堺市も同様です。

東京は“区”だけの抽出でも問題ないのですが。
その他の県は「大阪市天王寺区」「大阪市北区」「大阪市鶴見区」「堺市北区」「堺市堺区」など、
“市+区”でもし抽出が可能でしたら。
お力添えをいただけますと幸いです。

よろしくお願い致します。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2018/04/23 23:33:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント3000pt

以前の回答の VBA を手直ししてみました。
「市」を採用するケースで、「町」を含まず、「街区」や「地区」、数字に続く「区」(二区のような)ではない「区」を含んだ文字列を探して、見つかった場合には、そちらを採用するようにしました。

手持ちのテストデータ(31253件)では、以下のひとつが誤って判定されます。
山口県周南市徳山公園区

周南市を特別扱いに追加したのが以下のコードです。

Sub extract_city2()
    source_col = 1      ' A列 : 住所
    dest_col = 2        ' B列 : 市区町村

    last_row = Cells(Rows.Count, source_col).End(xlUp).Row
    Range(Cells(2, dest_col), Cells(last_row, dest_col)).Clear

    Set re_z = CreateObject("VBScript.RegExp")
    Dim re_c(10)
    For i = 0 To 10
        Set re_c(i) = CreateObject("VBScript.RegExp")
    Next

    re_z.Pattern = "^(.{2}[都道府]|.{2,3}[県])(.+)"
    re_c(0).Pattern = "^(郡山市|市川市|市原市|郡上市|蒲郡市|四日市市|大和郡山市|廿日市市|小郡市|野々市市|高市郡|余市郡|周南市)"
    re_c(1).Pattern = "^([^郡]+郡)"
    re_c(2).Pattern = "^([^市]+市)"
    re_c(3).Pattern = "^([^区町]*[^街地一二三四五六七八九十123456789123456789]区)"
    re_c(4).Pattern = "^([^町]+町)"
    re_c(5).Pattern = "^([^村]+村)"
    re_c(6).Pattern = "^([^区]+区)"     ' 東京都用
    re_c(7).Pattern = "^([^市]+市)"     ' 東京都用
    re_c(8).Pattern = "^([^郡]+郡)"     ' 東京都用
    re_c(9).Pattern = "^([^町]+町)"     ' 東京都用
    re_c(10).Pattern = "^([^村]+村)"    ' 東京都用
    

    For r = 3 To last_row
        s = Cells(r, source_col).Value
        Set mat = re_z.Execute(s)
        If mat.Count = 0 Then
            Cells(r, dest_col).Value = "都道府県が見つかりません"
            GoTo Continue
        End If
        Z = mat(0).SubMatches(0)
        s = mat(0).SubMatches(1)

        i_begin = 0
        i_end = 5
        If Z = "東京都" Then
            i_begin = 6
            i_end = 10
        End If

        For i = i_begin To i_end
            Set mat = re_c(i).Execute(s)
            If mat.Count > 0 Then
                If i = 1 Then   ' 「郡」
                    Set mat2 = re_c(2).Execute(s)   ' 「市」を含む?
                    If mat2.Count > 0 Then
                        '短い方を採択
                        If Len(mat(0).SubMatches(0)) > Len(mat2(0).SubMatches(0)) Then
                            Set mat3 = re_c(3).Execute(s)   ' 「区」を含む?
                            If mat3.Count > 0 Then
                                Cells(r, dest_col).Value = mat3(0).SubMatches(0)
                            Else
                                Cells(r, dest_col).Value = mat2(0).SubMatches(0)
                            End If
                        Else
                            Cells(r, dest_col).Value = mat(0).SubMatches(0)
                        End If
                    Else
                        Cells(r, dest_col).Value = mat(0).SubMatches(0)
                    End If
                ElseIf i = 2 Then   ' 「市」
                    Set mat2 = re_c(3).Execute(s)   ' 「区」を含む?
                    If mat2.Count > 0 Then
                        Cells(r, dest_col).Value = mat2(0).SubMatches(0)
                    Else
                        Cells(r, dest_col).Value = mat(0).SubMatches(0)
                    End If
                Else
                    Cells(r, dest_col).Value = mat(0).SubMatches(0)
                End If
                GoTo Continue
            End If
'            DoEvents
        Next
Continue:
    Next
End Sub

標準モジュールに貼り付けて、extract_city2 サブルーチンを実行してください。

id:a-kuma3

手持ちのテストデータから抽出できた「市」+「区」の一覧を↓に置きました。
http://d.hatena.ne.jp/a-kuma3/20180423/extract_ward

2018/04/23 11:56:14
id:moon-fondu

ありがとうございます、うまく変換できました!
助かりました<m(__)m>

2018/04/23 23:32:54
  • id:a-kuma3
    「区」は、どこまで求めますか?
    政令指定都市の行政区は当然対象にするとして、他に地域自治区というのがあります。
    福島県南相馬市小高区とか奈良県宇陀市室生区のような。
    あと、姫路市の区は、地名の一部なんだそうです。
    https://ja.wikipedia.org/wiki/%E5%9C%B0%E5%9F%9F%E8%87%AA%E6%B2%BB%E5%8C%BA
    https://ja.wikipedia.org/wiki/%E5%A7%AB%E8%B7%AF%E5%B8%82#%E5%A7%AB%E8%B7%AF%E5%B8%82%E3%81%AE%E3%80%8C%E5%8C%BA%E3%80%8D

    政令指定都市に限る、ということだと、プログラムに持たなくちゃいけなくなりますが、政令指定都市って、ちょいちょい増えるんですよね。
    まあ、前の VBA も、判定しづらい市や郡の名前を持っちゃっているので、今さらな気はしますが。

    あと、「北海道北見市端野町三区」とか難しいです。
    市と区の間に、町や郡が入らなければ、という判定が良さそうな気もするのですが、「北海道富良野市字西学田二区」などは、字面だけでは無理ですね (´・ω・`)
  • id:a-kuma3
    「山口県周南市公園区」こんなのもあった。
    どうやら、地名っぽい。
  • id:moon-fondu
    遅くなりましてすみません(^^;
    細かい地名まで調べていただき、ありがとうございます!
  • id:a-kuma3
    「区」に何種類かあるなんて、こんなことでもないと調べる機会がありません :-)
    またひとつ賢くなった気がします(来月には忘れてる、きっと

この質問への反応(ブックマークコメント)

トラックバック

  • 市+区 http://q.hatena.ne.jp/1524395045手持ちのテストデータ(31253件)から抽出できた「市」+「区」は、以下の 207件。 さいたま市浦和区 さいたま市岩槻区 さいたま市見沼区 さいたま市桜区 さ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません