Excel。VBA。住所から、都道府県と住所をわけて抽出したい
<Excel VBA>
都道府県からはじまる住所のデータから、都道府県の列と住所の列にわけて抽出したいのですが、どのようにしたらいいのでしょうか。
次の表を用意しました。
A列に住所がはいっています。
関数を作ってもいいですが、今回は、Excel VBAでマクロを作ることにします。
ポイントは、C列の住所です。
関数でも同じですが、都道府県4文字問題をどのように対応したらいいかという点です。
都道府県4文字問題とは、神奈川県・和歌山県・鹿児島県の3県だけが4文字であるということです。
よって、C列は、左から4文字なのか3文字を除いた文字列である必要があります。
そして、住所なので、都道府県を除いた住所の文字数は決まっていません。
そこで、右から何文字という抽出方法では対応できません。
関数の場合は、文字数を算出して、都道府県の文字数分を引いた文字数を求めて、その数値をつかって右から抽出するような方法をつかったりします。
しかしながら、Excel VBAでは、都道府県の文字数を除いた文字数を求める必要はありません。
それを踏まえて、Excel VBAでプログラムをつくってみました。
Sub 都道府県と住所()
Dim i As Long
Dim lastrow As Long
Dim ad As String
Dim moji_ct As Long
lastrow = Cells(Rows.Count, "a").End(xlUp).Row
For i = 2 To lastrow
ad = Cells(i, "a")
If Mid(ad, 4, 1) = "県" Then
Cells(i, "b") = Left(ad, 4)
moji_ct = 5
Else
Cells(i, "b") = Left(ad, 3)
moji_ct = 4
End If
Cells(i, "c") = Mid(ad, moji_ct)
Next
End Sub
では、実行してみましょう。
このように、都道府県と住所をわけることができました。
それでは、プログラムを確認しておきましょう。
変数の宣言文です。
Dim i As Long
Dim lastrow As Long
Dim ad As String
Dim moji_ct As Long
lastrow = Cells(Rows.Count, "a").End(xlUp).Row
データの最終行の行番号をlastrowに代入します。この値まで、For To Next文で繰り返し処理をします。
そのFor文の中の処理ですが、
ad = Cells(i, "a")
adにA列の文字を代入します。
そして、都道府県4文字問題に対応するためにIF Then Else文で分岐処理をしています。
If Mid(ad, 4, 1) = "県" Then
Cells(i, "b") = Left(ad, 4)
moji_ct = 5
Else
Cells(i, "b") = Left(ad, 3)
moji_ct = 4
End If
Cells(i, "c") = Mid(ad, moji_ct)
もし4文字目が”県”ならば、左から4文字をB列に抽出します。
そして、moji_ctに5を代入させます。
このmoji_ctは何をしているのかといと、
C列の住所のためです。
Mid関数は、抽出文字数の指定をしなければ、その数値以降の文字列すべてを抽出することができます。
つまり、都道府県の文字数が4なので、次の文字数は5ということになるので、5を代入したというわけです。
Else以降は、それ以外の都道府県に対応させています。
このように、Mid関数だけで、右から何文字とか、気にしなくていいというわけです。