| 
    
     |  | ▼pi さん: こんばんわ
 
 
 もう解決されている様なので今さらですが、
 コードのみで分割するマクロを作ってみました。
 単純なロジックで組んだので、メンテも楽かと・・・
 (複雑なロジックを組む力がない?!)
 単純な分、無駄に長いコードですが、ご参考までに。
 
 
 Sub bun()
 Dim i As Long, j As Long
 Dim st As Long, stp As Long
 Dim tx As String, ad As String
 
 For i = 1 To Range("A65536").End(xlUp).Row
 tx = Cells(i, 1).Value
 st = 1
 
 If Left(tx, 3) = "東京都" Then
 Cells(i, 2).Value = Mid(tx, st, 3)
 st = 4
 Else
 For j = 1 To 4
 ad = Mid(tx, j, 1)
 Select Case ad
 Case "道", "府", "県"
 Cells(i, 2).Value = Mid(tx, st, j)
 st = j + 1
 Exit For
 End Select
 Next j
 End If
 
 stp = st
 If InStr(st, tx, "札幌市") > 0 Or InStr(st, tx, "仙台市") > 0 Or _
 InStr(st, tx, "千葉市") > 0 Or InStr(st, tx, "さいたま市") > 0 Or _
 InStr(st, tx, "横浜市") > 0 Or InStr(st, tx, "川崎市") > 0 Or _
 InStr(st, tx, "静岡市") > 0 Or InStr(st, tx, "名古屋市") > 0 Or _
 InStr(st, tx, "京都市") > 0 Or InStr(st, tx, "大阪市") > 0 Or _
 InStr(st, tx, "堺市") > 0 Or InStr(st, tx, "神戸市") > 0 Or _
 InStr(st, tx, "広島市") > 0 Or InStr(st, tx, "福岡市") > 0 Or _
 InStr(st, tx, "北九州市") > 0 Or InStr(st, tx, "四日市市") > 0 Or _
 InStr(st, tx, "市原市") > 0 Or InStr(st, tx, "市川市") > 0 Or _
 InStr(st, tx, "廿日市市") > 0 Or InStr(st, tx, "高市郡") > 0 Or _
 InStr(st, tx, "西八代郡市") > 0 Or InStr(st, tx, "神崎郡市") > 0 Or _
 InStr(st, tx, "中新川郡上市") > 0 Or InStr(st, tx, "石川郡野々市") > 0 Or _
 InStr(st, tx, "吉野郡下市") > 0 Or InStr(st, tx, "芳賀郡市") > 0 Or _
 InStr(st, tx, "余市郡") > 0 Then
 stp = InStr(st, tx, "市") + 1
 End If
 If InStr(st, tx, "余市郡余市") > 0 Then
 stp = InStr(stp + 1, tx, "市") + 1
 End If
 If InStr(st, tx, "名古屋市中村") > 0 Then
 stp = InStr(stp + 1, tx, "村") + 1
 End If
 If InStr(st, tx, "北広島市") > 0 Or InStr(st, tx, "北名古屋市") > 0 Or _
 InStr(st, tx, "東大阪市") > 0 Or InStr(st, tx, "東広島市") > 0 Then
 stp = st
 End If
 
 If InStr(st, tx, "町田市") > 0 Or InStr(st, tx, "大町市") > 0 Or _
 InStr(st, tx, "十日町市") > 0 Or InStr(st, tx, "杵島郡大町") > 0 Or _
 InStr(st, tx, "北松浦郡鹿町") > 0 Then
 stp = InStr(st, tx, "町") + 1
 End If
 
 If InStr(st, tx, "村山市") > 0 Or InStr(st, tx, "武蔵村山市") > 0 Or _
 InStr(st, tx, "東村山市") > 0 Or InStr(st, tx, "羽村市") > 0 Or _
 InStr(st, tx, "大村市") > 0 Or InStr(st, tx, "田村市") > 0 Or _
 InStr(st, tx, "村上市") > 0 Or InStr(st, tx, "北村山郡") > 0 Or _
 InStr(st, tx, "東村山郡") > 0 Or InStr(st, tx, "西村山郡") > 0 Or _
 InStr(st, tx, "田村郡") > 0 Or InStr(st, tx, "佐波郡玉村") > 0 Or _
 InStr(st, tx, "柴田郡村田") > 0 Then
 stp = InStr(st, tx, "村") + 1
 End If
 
 For j = stp To Len(tx)
 ad = Mid(tx, j, 1)
 Select Case ad
 Case "市", "町", "村", "区"
 Cells(i, 3).Value = Mid(tx, st, j - st + 1)
 Cells(i, 4).Value = Right(tx, Len(tx) - j)
 Exit For
 End Select
 Next j
 Next i
 End Sub
 
 
 ===================================================================================================
 以下、メンテ用に作成手順です。
 
 まず都道府県名と市区町村名を重複なしで読み込みます。
 KEN_ALL.CSVと同じフォルダで下記コードを実行。
 (2000件ぐらいだと思います)
 
 
 Sub csv_read()
 Dim con As Object, rst As Object
 Dim csc As String, csq As String, sht As String
 Dim i As Long
 
 Set con = CreateObject("ADODB.Connection")
 Set rst = CreateObject("ADODB.Recordset")
 csc = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & _
 ";Extended Properties=""text;HDR=NO;FMT=Delimited"""
 csq = "Select Distinct F7,F8 From KEN_ALL.CSV"
 con.Open csc
 rst.Open csq, con
 
 Application.ScreenUpdating = False
 i = 1
 Do Until rst.EOF
 Cells(i, 1).Value = rst.Fields(0)
 Cells(i, 2).Value = rst.Fields(1)
 rst.MoveNext
 i = i + 1
 Loop
 Columns("A:B").EntireColumn.AutoFit
 Application.ScreenUpdating = True
 
 rst.Close: Set rst = Nothing
 con.Close: Set con = Nothing
 End Sub
 
 
 *************************************************************************************
 考え方としては、市区町村名は全て"市"、 "町"、"村"、"区"のいずれかで必ず終わるので、
 市区町村名で途中に"市"、 "町"、"村"、"区"を含むものを例外処理します。
 
 とりあえず、下記コードで例外がどれぐらいあるかを確認。
 
 
 Sub test1()
 Dim i As Long, j As Long
 Dim tx As String, ad As String
 Columns("C:F").ClearContents
 
 Application.ScreenUpdating = False
 For i = 1 To Range("B65536").End(xlUp).Row
 tx = Cells(i, 2).Value
 
 For j = 1 To Len(tx)
 ad = Mid(tx, j, 1)
 Select Case ad
 Case "市", "町", "村", "区"
 Cells(i, 3).Value = Mid(tx, 1, j)
 Exit For
 End Select
 Next j
 Next i
 
 Cells(1, 5).Value = "***例外***"
 j = 2
 For i = 1 To Range("B65536").End(xlUp).Row
 If Cells(i, 3).Value <> Cells(i, 2).Value Then
 Cells(j, 5).Value = Cells(i, 2).Value
 Cells(j, 6).Value = Cells(i, 3).Value
 j = j + 1
 End If
 Next i
 
 Columns("C:F").EntireColumn.AutoFit
 Application.ScreenUpdating = True
 End Sub
 
 
 *************************************************************************************
 D列(元データ)・F列(処理後データ)に例外が表示されたと思います。(180件ぐらい?)
 これを見ると、「〜市〜区」のパターン(政令指定都市)が多いので、
 その例外処理を組み込んだ下記コードを実行。
 
 
 Sub test2()
 Dim i As Long, j As Long
 Dim st As Long, stp As Long
 Dim tx As String, ad As String
 Columns("C:F").ClearContents
 
 Application.ScreenUpdating = False
 For i = 1 To Range("B65536").End(xlUp).Row
 tx = Cells(i, 2).Value
 st = 1: stp = st
 
 If InStr(st, tx, "札幌市") > 0 Or InStr(st, tx, "仙台市") > 0 Or _
 InStr(st, tx, "千葉市") > 0 Or InStr(st, tx, "さいたま市") > 0 Or _
 InStr(st, tx, "横浜市") > 0 Or InStr(st, tx, "川崎市") > 0 Or _
 InStr(st, tx, "静岡市") > 0 Or InStr(st, tx, "名古屋市") > 0 Or _
 InStr(st, tx, "京都市") > 0 Or InStr(st, tx, "大阪市") > 0 Or _
 InStr(st, tx, "堺市") > 0 Or InStr(st, tx, "神戸市") > 0 Or _
 InStr(st, tx, "広島市") > 0 Or InStr(st, tx, "福岡市") > 0 Or _
 InStr(st, tx, "北九州市") > 0 Then
 stp = InStr(1, tx, "市")
 End If
 
 For j = stp + 1 To Len(tx)
 ad = Mid(tx, j, 1)
 Select Case ad
 Case "市", "町", "村", "区"
 Cells(i, 3).Value = Mid(tx, st, j)
 Exit For
 End Select
 Next j
 Next i
 
 Cells(1, 5).Value = "***例外***"
 j = 2
 For i = 1 To Range("B65536").End(xlUp).Row
 If Cells(i, 3).Value <> Cells(i, 2).Value Then
 Cells(j, 5).Value = Cells(i, 2).Value
 Cells(j, 6).Value = Cells(i, 3).Value
 j = j + 1
 End If
 Next i
 
 Columns("C:F").EntireColumn.AutoFit
 Application.ScreenUpdating = True
 End Sub
 
 
 それ以外の例外がD列(元データ)・F列(処理後データ)に表示されたと思います。(40件ぐらい?)
 あとは地道に例外処理を加え、都道府県・町域を処理すると、最初に提示したコードになります^^
 
 |  |