- ベストアンサー
Excel2010 住所5分割2
- Excel2010で住所を5分割する方法について質問があります。
- 以前に教えていただいたコードを少し変更しましたが、分割の仕方が変わりました。
- 具体的には、「都道府県」「市区町村郡」「通称名」「○丁目」「番地ビル」の分割方法が変更されました。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
前回は、サンプルデータだけでテストしたのでそこまで考えていませんでした。 1文字目は無視するようにしました。これにより、「市川市」のようなものは判別できます。「四日市市」のようなものは、登録するしかないと思います。 SplitData に追加していってください。 群は外しました。めったに出で来ないものなので、○○群が出て来たら、名前を直接入れた方がいいかと思います。 完全に変換するのは不可能です。実行後に多少手作業で直さなければならないのは仕方ありません。完全を求めるなら、ソフトの購入をお勧めします。 ' 'Option Explicit Option Compare Text DefInt A-Z ' Sub Macro1() ' Dim SplitData As Variant Dim SplitFlag As Variant Dim StringCheck As String Dim StringMatch As String Dim IY As Long Dim Parameter As Boolean ' SplitData = Array("東京都,北海道,府,県", _ "四日市市,市,区", _ "0,1,2,3,4,5,6,7,8,9", "丁目") SplitFlag = Array(True, True, False, True) Application.ScreenUpdating = False ' For IY = 8 To Cells(Rows.Count, "V").End(xlUp).Row StringCheck = Cells(IY, "V") ' For ix = 0 To 3 StringMatch = SplitData(ix) Parameter = SplitFlag(ix) StringMatch = Split1(StringCheck, StringMatch, Parameter) Cells(IY, ix + 12) = StringMatch ILen = Len(StringMatch) StringCheck = Mid(StringCheck, ILen + 1) Next ix Cells(IY, ix + 12) = StringCheck Next IY Application.ScreenUpdating = True End Sub ' Function Split1(StringCheck As String, StringMatch As String, Parameter As Boolean) As String ' Dim SMatch As Variant Dim W1 As String ' SMatch = Split(StringMatch, ",") Min = 32767 ' For i1 = 0 To UBound(SMatch) W1 = SMatch(i1) ' If Len(W1) = 1 And Parameter Then ins = 1 End If ins = InStr(ins + 1, StringCheck, W1) ' If ins > 0 Then ins = ins - 1 - Len(W1) * Parameter Min = WorksheetFunction.Min(Min, ins) ' If Parameter Then Exit For End If End If Next i1 ' If Min < 32767 Then Split1 = Left(StringCheck, Min) End If End Function あと、 Application.ScreenUpdating = True は入れるのなら、 End Sub の前に入れてください。ここがプログラムの終了です。
その他の回答 (4)
- SI299792
- ベストアンサー率47% (772/1616)
"区,市市,市,郡", _ とすればいいです。 1文字目を無視するようにしたので、市原市、市川市は不要です。 また、四日市市、廿日市市はまとめて、市市にしてもいいです。 そのままでも構わないのですが、登録数が少ない方が、登録も楽だし、実行速度も速いかと思います。 もう、実行は終わっているかもしれませんが。
お礼
市原市などは不要でしたか。 助かりました。今までありがとうございます。
- SI299792
- ベストアンサー率47% (772/1616)
もう1つミスが For IY = 8 To Cells(Rows.Count, "V").End(xlUp).Row は For IY = 5 To Cells(Rows.Count, "V").End(xlUp).Row です。 これが開始位置です。
お礼
ありがとうございます。
- SI299792
- ベストアンサー率47% (772/1616)
間違いがありました。 "四日市市,市,区", _ は "四日市市,区,市", _ にしてください。 そうすれば、区が優先されるので、 京都市中京区で分割されます。
お礼
御親切にありがとうございます。
- bunjii
- ベストアンサー率43% (3589/8249)
>分割の仕方が変わりました。 >変更前:「都道府県」「市区町村郡」「通称名」「○丁目」「番地ビル」 >変更後:「都道府県」「市区郡」「町域名」「○丁目」「番地ビル」 前回の回答内容で無理なことを理解できていると思いましたが未だご理解頂けませんか? 都道府県は限られた数ですが市区町村は無数にあり、名前も種々雑多のためデータベースが無いと区切り位置を検出できません。 日本郵便が提供している郵便番号データをデータベースとして活用する方法で区分することをお勧めします。 「都道府県」「市区町村」「大字(地名)」「番地(丁目、番、号)」 「ビルまたはマンション、階、部屋番号」については番地との間に区切り文字が無いと区分が困難です。 >関数だとなんとなくできましたがVBAだとわかりません。 関数で本当にできましたか? 添付画像はExcel 2013で「郵便番号データ」をデータベースとして関数で処理した結果です。 M6=VLOOKUP($W6,[郵便番号データ.xlsx]KEN_ALL!$C:$X,COLUMN()-8,FALSE) M6をN6へコピペしました。 O6=SUBSTITUTE(LEFT(V6,MIN(INDEX(FIND({"1";"2";"3";"4";"5";"6";"7";"8";"9"},V6&"123456789"),0))-1),M6&N6,"") P6=SUBSTITUTE(V6,M6&N6&O6,"") M6:P6を選択して下へ必要数コピーしました。 V列の6行目以下に住所が入力されているものとし、アドインで住所から郵便番号に変換してW列へ収録しました。 添付画像の上段が「郵便番号データ」の全国版です。 下段が検証したブックです。 「郵便番号データ」では都道府県、市区町村、地名(大字)のように区切られていますので、郡での区切りは不適切かと思われます。 尚、V列にビル名が付いているときは番地のセルにビル名も含まれた状態になります。
お礼
本当にありがとうございます。 福岡県筑紫郡那珂川町中原3丁目 などの住所でしたら 福岡県 筑紫郡 那珂川町中原 3丁目と分割なので SplitData = Array("東京都,北海道,大阪府,京都府,県", _ "四日市市,廿日市市,市原市,市川市,区,市,郡", _ "0,1,2,3,4,5,6,7,8,9", "丁目") ,市,の後に郡を入れればいいですか。