実現したいこと
スペースで区切られていない住所から建物名だけを抽出したい
例:
東京都○区○○1-1-1ABCビル111→ABCビル
東京都○区○○1-1-1カタカナハイツ111→カタカナハイツ
東京都○区○○1-1-1漢字荘111→漢字荘
前提
住所録をexcelで管理しています
データは1住所1セルごとにスペースやカンマ区切りなく入っています
表記は統一されておらず
”東京都○区○○1-1-1”
”東京都○区○○1丁目1-1"
”東京都○区○○一丁目1-1”
のパターンがあります
また建物名に関しても
建物名がはいっていないもの ”東京都○区○○1-1-1-111”
建物名と部屋番号① ”東京都○区○○1-1-1建物名111”
建物名と部屋番号② ”東京都○区○○1-1-1建物名111号室”
など同一の建物でも複数の表記があります
建物名は漢字,カタカナ,アルファベット表記があります
試したこと
建物名を抽出する方法が分からなかったため、
まず関数で丁目以降の部分を抽出できないか試しました。
=MID(A1, MATCH(TRUE, ISNUMBER(1*MID(A1, ROW($1:$1000), 1)), 0)+1, LEN(A1))
見よう見まねでVBAでも試しました。
VBA
1Sub ExtractData () 2 Dim rng As Range 3 Dim cell As Range 4 Dim address As String 5 Dim buildingName As String 6 Dim i As Integer 7 8 Set rng = ThisWorkbook.Sheets("report (1)").Range("$BC1:BC" & ThisWorkbook.Sheets("report (1)").Cells(Rows.Count, 1).End(xlUp).Row) 9 10 For Each cell In rng 11 address = cell.Value 12 i = InStrRev(address, "丁目") 13 14 15 buildingName = Mid(address, i + 2) 16 17 cell.Offset(0, 1).Value = buildingName 18 Next cell 19End Sub
ただどちらにしても表記ブレがあるせいで"1-1-1"と"1-1"の2パターン生じてしまいます。
次に”-”以降を抽出する方法
VBA
1Sub ExtractData() 2 Dim rng As Range 3 Dim cell As Range 4 Set rng = ThisWorkbook.Sheets("report (1)").Range("BC:BC") 5 6 For Each cell In rng 7 If cell.Value <> "" Then 8 cell.Offset(0, 1).Value = Mid(cell.Value, InStrRev(cell.Value, "-") + 1) 9 End If 10 Next cell 11End Sub
こちらでは”-”のあと○号の部分の数字とそれ以降の建物名と部屋番号部分が抽出できました。
ただこちらも数字が一桁の場合と2桁の場合があり、抽出後のデータから建物名以降を抜き出す方法が分かりません。
最後にchatgptに頼んで出力してもらったのがこちら
VBA
1Sub ExtractData() 2 Dim rng As Range 3 Dim cell As Range 4 Set rng = ThisWorkbook.Sheets("Sheet1").Range("A:A") 5 6 For Each cell In rng 7 If cell.Value <> "" Then 8 Dim str As String 9 str = cell.Value 10 Dim firstNumber As Integer 11 Dim secondNumber As Integer 12 Dim i As Integer 13 firstNumber = 0 14 secondNumber = 0 15 For i = 1 To Len(str) 16 If IsNumeric(Mid(str, i, 1)) Then 17 If firstNumber = 0 Then 18 firstNumber = i 19 Else 20 secondNumber = i 21 Exit For 22 End If 23 End If 24 Next i 25 If firstNumber > 0 And secondNumber > 0 Then 26 cell.Offset(0, 1).Value = Mid(str, firstNumber + 1, secondNumber - firstNumber - 1) 27 Else 28 cell.Offset(0, 1).Value = "N/A" 29 End If 30 End If 31 Next cell 32End Sub
こちらだとそもそも抽出できませんでした(1丁目1のような表記になっているものは”丁目”が抽出されました)。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
Microsoft office365
