Thursday, 30 July 2020

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

はじめに

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

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

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

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

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

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

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

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

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

目次


郡村名を調べる

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

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

郡村名一覧は次の通り。


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


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

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

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

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


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

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

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

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

ということは、郡村名の文字数は、5〜9文字になる。

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

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

「政令指定都市と行政区」に「村」が使用されているのは次の市区。
  • 名古屋市中村区
今回は「郡村名」一体で抜き取るので、「郡」「村」共に含まない上記1市区は必然的に除外されるので大丈夫です。

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

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

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

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

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

伊豆諸島および小笠原諸島で「村」を含むのは以下の7つです。
  • 利島村
  • 新島村
  • 神津島村
  • 三宅村
  • 御蔵島村
  • 青ヶ島村
  • 小笠原村
ただ今回は「郡町名」一体で抜き取るので、「郡」「村」共に含まない上記7村は必然的に除外されるので大丈夫です。

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

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

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

郡名の文字数は3〜4文字、村名の文字数は2〜5文字ですので、
郡村名の文字数は、前記の通り、5〜9文字になります。

  • 郡■村(郡名3文字+村名2文字=5文字)
  • ◎◎◎郡■■■■村(郡名4文字+村名5文字=9文字)

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

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

これで、5〜9文字の郡村名を検索できます。

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

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

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

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

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

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









No comments:

Post a comment