Thursday, 23 July 2020

Excelで住所から郡名と町名を一括りで分割する方法【DM・宛名シールなどの印字の準備のために】

はじめに

関数で一括で郡市区町村名を取り出すのに苦労することが多いこの問題、以前取り上げた道府県名東京都+特別区を住所から順次抜き出した後、「郡町名」「郡村名」「政令指定都市と行政区」「町名(東京都で郡名のない)」「村名(東京都で郡名のない)」「市名」の順で各郡市区町村名を分割・抽出できるかも知れない

この問題の根本は、「郡」「市」「区」「町」「村」が入っている郡市区町村名および地域名があることです。

例えば、市名では「郡山市」「市川市」「村上市」「町田市」など、地域名では「郡山」「市谷」など。

これらがあると、中途半端な抜き出しになってしまうのです。

例えば郡名を抜き出す時、「大和郡山市●●1丁目23-45」の場合、「大和郡山市」の3文字目の「郡」が引っかかり、「大和郡」が抜き出されてしまう。

ですが、一括でするのではなく、「郡町名」「郡村名」「政令指定都市と行政区」「市名」の順で随時取り出すという方法ならば、郡市区町村名に「郡」「区」「市」「町」「村」があるかどうかを確認しつつ、抜き出せるのです。

また、「郡町名」のように郡と町をまとめて取り出す方法にすれば、郡と町がより限定されて取り出しやすくなります。

郡と町は、そのあとに分割することにします。

では、その方法を紹介いたします。

目次

郡町名を調べる

都道府県名を取り出したので、郡町名は住所の最初から何文字かまでになります。
COUNTIF関数で「郡」「町」が各々n文字目にある時、LEFT関数でn文字取り出せば良いことになります。

最初に、全ての郡町名を収集します。

郡町名一覧は次の通り。


以下のサイトで調べました。


北海道に同じ郡名がありましたが、今回は分別する意味がないので1つにまとめました。

次に、郡町名内に「郡」「町」が使用されていたら郡町名を抜き出すのが難しくなるので、郡町名内に「郡」「町」が使用されているかどうかを、前記の「郡町名一覧」で調べます。

郡町名内に「郡」「町」が使用されているかどうかを調べる関数は以下の通り。

郡名内に「郡」「町」が使用されているかどうか
=IF(COUNTIF(E2,"*郡*郡*"),"YES","")
=IF(COUNTIF(E2,"*町*"),"YES","")
町名内に「郡」「町」が使用されているかどうか
=IF(COUNTIF(E2,"*町*町*"),"YES","")
=IF(COUNTIF(E2,"*郡*"),"YES","")


郡名に「郡」「町」がある場合は「YES」を表示し、1文字の場合は何も表示しない、という関数です。

「郡町名一覧」にこれら関数を挿入し調べた結果は以下の通り。

  • 郡名には「郡」が2文字以上無く、「町」は無し
  • 町名には「郡」は無く、「町」は2文字以上無し

それから、郡名の文字数と「郡」の来る位置を調べた結果、郡名の文字数は2〜5文字。「郡」の来る位置も2〜5文字目。
町名のの文字数と「町」の来る位置を調べた結果、町名の文字数は2〜6文字。「町」の来る位置も2〜6文字目。

ということは、郡町名の文字数は、4〜11文字になる。

最後に、道府県名と東京都+特別区名を取り出した後の住所の左端は、「郡町名」「郡村名」「政令指定都市と行政区」「市名」、「地域名」が来ています。そのうち「郡村名」「政令指定都市と行政区」「市名」に「郡」や「町」がある場合、郡町名の抽出時に一緒に抜き出されてしまう可能性があります

ですので、「郡村名」「政令指定都市と行政区」「市名」、「地域名」に「郡」「町」が使用されているかを確認します。その関数は以下の通りです。
=IF(COUNTIF(E2,"*郡*"),"YES","")
=IF(COUNTIF(E2,"*町*"),"YES","")
調べた結果、「郡村名」「政令指定都市と行政区」に「郡」や「町」は使用されていませんでした。

「市名」には、「郡」や「町」が使用されています。

「市名」に「郡」が使用されているのは次の5市。
  • 郡山市
  • 郡上市
  • 蒲郡市
  • 小郡市
  • 大和郡山市
これらは例えば「大和郡山市●●町」のように、市名と地域名としての町名が、「大和郡」「山市●●町」となって、郡名の文字数は2〜5文字町名の文字数は2〜6文字に合致してしまいます。

ですので、上記5市は除外する関数で対処します。

「市名」に「町」が使用されているのは次の3市。
  • 町田市
  • 大町市
  • 十日町市
ただ今回は「郡町名」一体で抜き取るので、「郡」「町」共に含まない上記3市は必然的に除外されるので大丈夫です。

また、東京都に所属する伊豆諸島および小笠原諸島には郡名がなく、「東京都大島町」「東京都三宅村」のようになります。
「東京都」は抽出済なので、現時点で「大島町●●」「三宅村■■」となっており、これらも「町」が使用されているので考慮する必要があります。

伊豆諸島および小笠原諸島で「町」を含むのは以下の2つです。

  • 大島町
  • 八丈町

ただ今回は「郡町名」一体で抜き取るので、「郡」「町」共に含まない上記2町は必然的に除外されるので大丈夫です。

以上の結果をまとめると、
  • 郡名には「郡」が1文字のみ、「町」は無し
  • 町名には「郡」は無く、「町」は1文字のみ
  • 郡名の文字数は、2〜5文字
  • 「郡」の来る位置も2〜5文字目
  • 町名の文字数は2〜6文字
  • 「町」の来る位置も2〜6文字目
  • 「郡町」の文字数は4〜11文字
  • 「郡村名」「政令指定都市と行政区」に「郡」や「町」は無し
  • 「市名」に「郡」を含むのは5市。関数にて除外できる
  • 「市名」に「町」を含むのは3市。関数にて除外できる
  • 「郡名」のない町は2町。関数にて除外できる
住所から郡町名を抜き出すのは、少々複雑なことをする必要があります。

住所から郡町名を抜き取る

では住所から郡町名を抜き出します。

郡名の文字数は2〜5文字、町名の文字数は2〜6文字ですので、
郡町名の文字数は、前記の通り、4〜11文字になります。

  • ◎郡■町(郡名2文字+町名2文字=4文字)
  • ◎◎◎◎郡■■■■■町(郡名5文字+町名6文字=11文字)

ですが、汎用性を持たせるために、関数を作ります。

まず、郡町名を検索するにはCOUNTIF関数を使用します。
COUNTIF関数は以下の通りになります。
=COUNTIF(E2,"*郡*町*")
「*郡*町*」の意味は、「*」は任意の文字列(1文字以上)、次に「郡」、続いて「*」は任意の文字列(1文字以上)と「町」、それから「*」は任意の文字列(1文字以上)なので、「1文字以上の文字列と郡と1文字以上の文字列と町と1文字以上の文字列」となります。

これで、4〜11文字の郡町名を検索できます。

それから、前記した「市名」に「郡」のある5市を除外します。

その関数は以下の通り。
COUNTIF(E2,"郡山市*町*")=0
COUNTIF(E2,"郡上市*町*")=0
COUNTIF(E2,"小郡市*町*")=0
COUNTIF(E2,"蒲郡市*町*")=0
COUNTIF(E2,"大和郡山市*町*")=0
例えば「COUNTIF(E2,"郡山市*町*")=0」は、「セルE2が郡山市ではない」ことを意味します。

これで、上記5市は除外することができます。

「●●郡▲▲町」を抜き出すのは、LEFT関数を使用します。
=LEFT(E2,[文字数])
郡町名の文字数は、4〜11文字でした。
郡町名の最後の文字は「町」で、4文字目〜11文字目に現れます。

つまり、「町」の位置番号が郡町名の文字数になります。
これはFIND関数を使用して以下のようになります。
=FIND("町",E2,4)
「町」は、E2セル内の文字列の4文字目以降どの位置にあるのか、という意味になります。
これは、「市名」に「町」が使用されている3市、「町田市」「大町市」「十日町市」、および「郡名」のない2町「大島町」「八丈町」は、「町」の位置が1〜3文字目で該当しないので大丈夫です。

これらをまとめると、関数は以下のようになります。
=IF(AND(COUNTIF(E2,"*郡*町*"),COUNTIF(E2,"郡山市*町*")=0,COUNTIF(E2,"郡上市*町*")=0,COUNTIF(E2,"小郡市*町*")=0,COUNTIF(E2,"蒲郡市*町*")=0,COUNTIF(E2,"大和郡山市*町*")=0),LEFT(E2,FIND("町",E2,4)),"")









No comments:

Post a comment