12/15/2024

Excel。VBA。住所から、都道府県と住所をわけて抽出したい【address】

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関数だけで、右から何文字とか、気にしなくていいというわけです。