Excelの質問です。
前回、同様の質問 http://q.hatena.ne.jp/1479040277 を実施しまして。
市区町村での抽出ができていたのですが。
大阪府の住所から“区”を抽出しようとしますと。
全て「大阪市」として抽出されてしまいます。
堺市も同様です。
東京は“区”だけの抽出でも問題ないのですが。
その他の県は「大阪市天王寺区」「大阪市北区」「大阪市鶴見区」「堺市北区」「堺市堺区」など、
“市+区”でもし抽出が可能でしたら。
お力添えをいただけますと幸いです。
よろしくお願い致します。
以前の回答の 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 サブルーチンを実行してください。
政令指定都市の行政区は当然対象にするとして、他に地域自治区というのがあります。
福島県南相馬市小高区とか奈良県宇陀市室生区のような。
あと、姫路市の区は、地名の一部なんだそうです。
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 も、判定しづらい市や郡の名前を持っちゃっているので、今さらな気はしますが。
あと、「北海道北見市端野町三区」とか難しいです。
市と区の間に、町や郡が入らなければ、という判定が良さそうな気もするのですが、「北海道富良野市字西学田二区」などは、字面だけでは無理ですね (´・ω・`)
どうやら、地名っぽい。
細かい地名まで調べていただき、ありがとうございます!
またひとつ賢くなった気がします(来月には忘れてる、きっと