MID関数とは

今回はMID関数についてというより住所を切り分ける為にはみたいな記事になっっていますが、この使い方から色々応用も出来、恐らくこの使い方が一番ヘヴィに使っていると思うので、これを理解したらもうMIDはカンペキです。

MID関数は指定した場所から指定した文字を取ってくるお利口な関数です。

=MID(文字列, 開始位置, 文字数)

と、少し複雑なように見えますが
「今日は天気が良いな」という文字列がA1セルにあったとして
=MID(A1,4,5)
と入力すると、4文字目から5文字取ってきなさい、となるので
「天気が良い」
と返ってきます、この切り出し力を使って応用していきましょう。
(東京以外の住所は県庁所在地などを使用し、東京の住所が出てきたらスカイツリーの住所を使います。)

今回の例題は解決していない人も多いのではないでしょうか、表示された住所から【都道府県だけ抜き出す】【市区町村だけ抜き出す】【住所を分解する】といった作業、Excelでデータ分析をしたことがある人なら一度は出会うハズ。しかし条件の厳しさからそこまでデータも多くないし手で修正するか。となるわけです。

実際に~1,000件程度なら、ウダウダやらない方が速かったりします、私が今回立ち向かったのにはさして意味は無いのかもしれませんが、良いんです。
こういうの作るの好きなんですよ、はい。

さぁやっていきましょう、住所を分解しますよ!
留意するポイントは
「区」を含む市区町村は無い事
「市」「町」「村」を含む市区町村がある事
です、都道府県はMID関数の解説のようなものですので、分かる方は市区町村だけで仕訳けたいに飛びましょう。

都道府県だけで仕訳けたい

データ内にある住所から都道府県だけ抜き出したい時ですね。
全てのデータに都道府県情報が入っていることが前提です。
注意する内容から左から4文字目に県が来るのは神奈川県、和歌山県、鹿児島県以外には存在しない事がわかります。なのでまずはMID関数を使います。

=MID( 対象セル ,4,1)=”県”

で、住所のセルの4文字目から1文字持ってきて、それが県(TRUE)か県じゃない(FALSE)かを判別します(FALSE(フォルス)と読みます)、そこでIFを使い
県だったら左から4文字目を取ってきて
県じゃなかったら3文字目を取ってくる。
これで都道府県は分けられました、後はLEFTで持ってくるだけです。

=IF(MID(F3,4,1)=”県”,LEFT(F3,4),LEFT(F3,3))

↑の式でいうとF3セルの4文字目は「墨」なのでFALSE、左から3文字取ってきてという命令になるので「東京都」が表示されます。
つまりここで4文字目に県の入る市区町村があった場合は〇〇県県のような表示になってしまいますが、政府統計のページでもそのような市区町村が無い事は確認済みです、これが一番短い、と思います。

市区町村だけで仕訳けたい

さて、これは書き出してもうすでに後悔しておりますが、やりましょう。
それなりに先に分かっていないといけない条件があります。

  1. 市区町村は全部で2,229ある(2021/3/1現在)
  2. 市区町村郡の文字列が何文字目に紛れているか把握する
    一番短い市は蕨市(2)、一番長い市はつくばみらい市(7)、市川市で(1)有
    一番短い区は港区(2)、一番長い区はさいたま市岩槻区(8)、区は1文字目無し
    一番短い町は中郡大磯町(5)、一番長い町はオホーツク総合振興局佐呂間町(14)、町田市で(1)有
    一番短い村は諏訪郡原村(5)、一番長い村はオホーツク総合振興局西興部村(14)、村山市で(1)有
    一番短い郡は中郡(2)、一番長い郡は西春日井郡(5)、郡山市で(1)有
  3. 何文字目から途中に「紛れ」が発生しないかを確認しながら除外

1段目◆2の条件でまず間違いないのが、区が途中に入る事は無く、都道府県の後に現れる「区」は全て正しく収まっているという事。(区区みたいな区は無い)
一応特別区部という場所がありますが都庁です、この1件は無視しています。
住所は東京都新宿区西新宿なので仮に顧客に都庁の人間がいたとしても、この住所を使う人はいないでしょう。
=IFERROR(MID(住所,LEN(都道府県)+1,FIND(“区”,住所)-LEN(都道府県)),””)
198件処理、残り2,031件。
2段目◆数の多い市をやろうにも、途中で~郡~村や~市~町が出てきてしまうので、先に村や町、郡を潰します。
「町」は5文字目以降で町が途中に入る事はありませんので、5文字目以降を処理するのですが、佐賀に「大町町」という場所があるので、先に町町だけ処理してから5文字目以降を処理します。
743件処理、残り1,288件。
もう既に複雑すぎるので数式を貼るのやめましょうね、最後に1つ貼ります。
3段目◆「町」が無くなった事により「村」は5文字目以降で村が途中に入る事なくなりましたので、5文字目以降を処理します。
189件処理、残り1,099件。
4段目◆「郡」は紛れが多いので、「市」から先に、「市川市」や「高市郡」などが立ちふさがるが、落ち着いて市が1文字目にあったら~で潰し、「市郡」が含まれたら3文字で表示など、細かいものを処理しておく、さらに「四日市市」などの「市市」で続く3か所も先に潰しておく。その上で「市」を「区」のようにシンプルに処理。
793件処理、残り306件。
お、終わりが近づいてきた…。
5段目◆「郡」を「区」のようにシンプルに処理。
306件処理、終了。

E2のセルに「墨田区」と入っていますが、数式はこうなりました。

=IFERROR(MID(C2,LEN(D2)+1,FIND(“区”,C2)-LEN(D2)),IFERROR(MID(C2,LEN(D2)+1,FIND(“町町”,C2)-LEN(D2)+1),IFERROR(IF(LEN(MID(C2,LEN(D2)+1,FIND(“町”,C2)-LEN(D2)))>=5,MID(C2,LEN(D2)+1,FIND(“町”,C2)-LEN(D2)),#VALUE!),IFERROR(IF(LEN(MID(C2,LEN(D2)+1,FIND(“村”,C2)-LEN(D2)))>=5,MID(C2,LEN(D2)+1,FIND(“村”,C2)-LEN(D2)),#VALUE!),IFERROR(IF(MID(C2,LEN(D2)+1,FIND(“市”,C2)-LEN(D2))=”市”,MID(C2,LEN(D2)+1,FIND(“市”,C2)-LEN(D2)+2),#VALUE!),IFERROR(MID(C2,LEN(D2)+1,FIND(“市郡”,C2)-LEN(D2)+1),IFERROR(MID(C2,LEN(D2)+1,FIND(“市市”,C2)-LEN(D2)+1),IFERROR(MID(C2,LEN(D2)+1,FIND(“市”,C2)-LEN(D2)),IFERROR(MID(C2,LEN(D2)+1,FIND(“郡”,C2)-LEN(D2)),””)))))))))

なんという気持ち悪い数字の羅列、うん、俺頑張った。
LEN関数には本当に助けられます。

もうこれエラーにしか見えないですね。
コピペしたら使いたい人にはとても良いものだと思いますので使ってみてくださいね。
さて、これ以降は番地に漢数字が入っているだけで不可になりますが一応やっておきましょう。

市区町村以降を番地前まで表示

番地が漢数字で表示されていないことがただ一つの条件です。
一丁目とかってやつですね。そこまで入っていても良いなら↓コチラ

=MID(C2,LEN(D2)+LEN(E2)+1,SEARCH({1,2,3,4,5,6,7,8,9,0},C2)-(LEN(D2)+LEN(E2)+1))

F2のセルに入ってる数式です。
①「都道府県+市区町村」+1ケタ先の行から番地のスタート地点「1」までの距離を①で引いた数で表示しています。

番地以降を数値だけ抽出して判別


↑の市区町村以降を~で出ましたが

=MID(C2,SEARCH({1,2,3,4,5,6,7,8,9,0},C2),LEN(C2))

です、1~0までの数字があったらそれ以降を表示せいって事ですね。

いや~最初LEFTとRIGHTの話をしようと思ったのに住所分解はLEFTとRIGHTだけではちょっと厳しかったのでMIDに変更しましたが、どうでしたか?
私の変態ぶりが味わえたのではないでしょうか(ぉ

imakara

コメント