Excel2010 住所5分割2
以前の続きです。
教えて頂いたコードを少し変えたものです。
分割の仕方が変わりました。
変更前:「都道府県」「市区町村郡」「通称名」「○丁目」「番地ビル」
変更後:「都道府県」「市区郡」「町域名」「○丁目」「番地ビル」
住所はV列の5行目からですが5行目は入っていません。空白とが入り混じってます。
M列 N列 O列 P列 Q列
都道府県 市区郡 町域名 丁目 番地
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「東京都」 「豊島区」 「東池袋」 「3丁目」 「1番1号」
「東京都」 「八王子市」 「子安町」 「4丁目」 「10番15号」
「神奈川県」 「川崎市高津区」 「明津」 「12番地メゾン美鈴」
'Option Explicit
Option Compare Text
DefInt A-Z
'
Sub Macro2()
'
Dim SplitData As Variant
Dim SplitFlag As Variant
Dim StringCheck As String
Dim StringMatch As String
Dim SubAddress As String
Dim IY As Long
'
Application.ScreenUpdating = False
SplitData = Array("都,道,府,県", "市,区,郡", "", "丁目", "")
SplitFlag = Array(-1, 1, 0, -1, 0)
Application.ScreenUpdating = False
'
For IY = 8 To Cells(Rows.Count, "V").End(xlUp).Row
StringCheck = Cells(IY, "V")
If StringCheck <> "" Then
StringMatch = Split1(StringCheck, "0,1,2,3,4,5,6,7,8,9", -1)
Parameter = Len(StringMatch)
SubAddress = Mid(StringCheck, Parameter)
StringCheck = Left(StringCheck, Parameter - 1)
'
For ix = 0 To 4
StringMatch = SplitData(ix)
Parameter = SplitFlag(ix)
'
If StringMatch = "" Then
Cells(IY, ix + 12) = StringCheck
StringCheck = SubAddress
Else
StringMatch = Split1(StringCheck, StringMatch, Parameter)
Cells(IY, ix + 12) = StringMatch
Parameter = Len(StringMatch)
StringCheck = Mid(StringCheck, Parameter + 1)
End If
Next ix
End If
Next IY
End Sub
'
Function Split2(StringCheck As String, StringMatch As String, Parameter) As String
' Paemater-:区切り文字のうち、先のものを有効とする。
' +:区切り文字のうち、後のものを有効とする。
Dim SMatch As Variant
Dim W1 As String
'
SMatch = Split(StringMatch, ",")
Max = -32768
'
For i1 = 0 To UBound(SMatch)
W1 = SMatch(i1)
ins = InStr(StringCheck, W1) * Sgn(Parameter)
'
If ins <> 0 Then
Max = WorksheetFunction.Max(Max, ins)
End If
Next i1
'
If Max <> -32768 Then
Max = Abs(Max) - 1 + Len(W1)
Split1 = Left(StringCheck, Max)
End If
Application.ScreenUpdating = True
End Function
実行すると全ての京都府が都道府県名で「京都」で市区郡に「府長岡京市」と分割されてしまいます。
市区郡は全て「府長岡京市」ではなく住所で変わります。「府京都市中京区壬生辻町」など
もう一つは市川市など同じ市区郡が入る住所はうまく分割されません。
「千葉県」「市」 「川市市川」
「三重県」「四日市」「市北浜田町」など
関数だとなんとなくできましたがVBAだとわかりません。
IF(M8="東京都",LEFT(N8,FIND("区",N8)),IF(IFERROR(MATCH(LEFT(N8,1),{"堺"},FALSE),
IFERROR(MATCH(LEFT(N8,2),{"札幌","仙台","千葉","横浜","川崎","新潟","静岡","浜松","京都","大阪","神戸","岡山","広島","福岡","熊本"},FALSE),
IFERROR(MATCH(LEFT(N8,3),{"相模原","名古屋","北九州"},FALSE),
IFERROR(MATCH(LEFT(N8,4),{"さいたま"},FALSE),-1))))>0,LEFT(N8,FIND("区",N8)),
IF(IFERROR(MATCH(LEFT(N8,2),{"郡山","市原","郡上","蒲郡","小郡","市川"},FALSE),-1)>0,LEFT(N8,3),
IF(IFERROR(MATCH(LEFT(N8,3),{"四日市","廿日市"},FALSE),-1)>0,LEFT(N8,4),
IF(IFERROR(MATCH(LEFT(N8,4),{"大和郡山市"},FALSE),-1)>0,LEFT(N8,5),
LEFT(N8,IFERROR(FIND("郡",N8),FIND("市",N8))))))))
お礼
市区町村 & 町域 で Like これで解決しました! ありがとうございます。 マスタに一致する町域がないと 町域だけでなく市区町村もNULLになりますが、 こちらの方が実用性は高そうなのでこれでいきます。