人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: moon-fondu
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●3000ポイント ベストアンサー

以前の回答の 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 サブルーチンを実行してください。


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

moon-fonduさんのコメント
ありがとうございます、うまく変換できました! 助かりました<m(__)m>
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ