Excelの関数って一つのセルの中に式を入れるので、非常に見づらくなることがあります。
シンプルなSUM関数などはすぐにわかると思うのですが、住所の抜き出しなどで関数を複数使用したものはぱっと見てわかりづらいです。
作成した人しかわからなくなりメンテナンスができないと言った事も起こる可能性もあります。
そのようになった時の対処法として今回は1つご紹介したいと思います。
※今回は関数だけの対策になります。

難易度:
Excelの関数をネットで調べて使えるぐらいのレベルは必要です。
私も色々な関数の組み合わせ技をご紹介していますが、これ何してるんだっけ?って言う事があります💦
作業の全体の流れ
- バックアップを取る
- 式の解析作業(分解)
- 関数を調べる
- 動作確認
作業の流れ自体は至ってシンプルです。
自転車などのものの修理する作業の工程をイメージするとわかりやすいと思います。
Excel関数1つずつは非常にシンプルです。
ですが、組み合わせると何をやっているのか急にわかりづらくなります。
今回は以前こちらの記事で紹介しました、市区町村の抜き出しを例に進めたいと思います。
ちなみに使用している式がこちらです。
=CHOOSE(IFNA(INDEX(表,MATCH(MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2))),表[市区町村],0),2),1),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2))),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN((FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2)+1))),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,SMALL(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2),2)))

ぱっと見て、何しているのか全然わかりません。
それでは、この式をベースに解析をはじめたいと思います。
1. バックアップを取る
今回、式を分解していきますので必ず事前に該当ファイルのバックアップを取りましょう。
Excelファイルのバックアップの取り方は、ファイルそのものをコピーしておけばOKです。

編集する方は、コピーファイルを操作するのがおススメです。
ファイルの名前は変更しておくとわかりやすいです。

2. 式の解析作業(分解)
この作業工程が最も重要なポイントです。
まず見る場所は先頭の関数です。
なぜ先頭から解析が必要なのかというと、関数の構造に問題があります。
下図の様に関数の中で関数の計算をするといったことをやっています。

上図でいうと、本当に求めたい値というのは関数Aの計算でそれ以外は、関数Aを求めるための材料でしかありません。そのため先頭の関数を見ると解析しやすくなります。
関数によっては基にしている値が取得できずエラーになる可能性があるため、知っている関数から解析ではなく、解析する順序が大切になります。

今回のケースを例に見ていきますと、CHOOSE関数が関数Aにあたる部分になります。
=CHOOSE(IFNA(INDEX(表,MATCH(MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2))),表[市区町村],0),2),1),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2))),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN((FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2)+1))),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,SMALL(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2),2)))
Choose関数はChoose(インデックス、インデックスが「1」の時の処理、インデックス「2」の時の処理…)となっています。
式の解析(分解)の仕方
ここから関数の分解作業を行いますが、Excelは便利な機能が備わっています。
Choose関数であれば、どこまでがインデックスで求めている式なのかが一目見てわかるようになっています。
この機能が式を解析(分解)する上で役立ちます。

Choose関数の場合、インデックス,値とクリックできるようになっています。
インデックスをクリックするとこのようになります。

式の中で背景がグレーになっている箇所があります。
その部分がChoose関数のインデックスを求めるための式になります。
同様に、値1をクリックすると値1で求めるところが背景グレーになります。

背景がグレーになっている部分を抜き出します。
実際に抜き出していきます。
まずはChoose関数のインデックスをクリックして、該当の部分をグレーにします。
グレーにしましたらその場でCtrl+Cでコピーします。
背景グレーの部分をそのままコピーすることができます。
Escキーで式選択を解除し、別のセルに先頭に=を付けてコピーした式を貼り付けます。

実際に張り付けるとこのようになります。

同じように値1~値3までそれぞれ分解します。

このように分解すると、最初のChoose関数でインデックスが3なので、北海道中央区の値を取得しているという事までわかります。
このように長くわかりづらかった式も
=CHOOSE(IFNA(INDEX(表,MATCH(MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2))),表[市区町村],0),2),1),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2))),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN((FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2)+1))),MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,SMALL(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2),2)))
分解するとシンプルになってきます。
実際に分解した式を下に記載します。
※値1~3に関しては若干違います。
違う部分に関しては色付けしていますのでご覧ください。
何をしているかわかるようになるかと思います。
インデックス
=IFNA(INDEX(表,MATCH(MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2))),表[市区町村],0),2),1)
値1
=MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2)))
値2
=MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN((FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2)+1)))
値3
=MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,SMALL(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2),2))
このように、複雑な式は先頭の関数をベースに解析していくと、わかりやすくなります。
もしまだわかりづらかったら、更に先頭の関数を基に分解していきます。
値1~3であればMID関数を解析するという感じです。
3. 関数を調べる
続いては関数を調べる手順になります。
その関数が何をしている関数なのかを知らなければいけないのでわからない関数があったら調べます。
今回の値1のケースですと、MID関数あたりは使い方を忘れることが多い関数なので、調べて何をしているのかを確認します。
=MID(JIS(Sheet1!$B2),LEN(Sheet1!$C2)+1,MIN(FIND({“市”,”区”,”町”,”村”},JIS(Sheet1!$B2)&”市区町村”)-LEN(Sheet1!$C2)))
MID関数は指定した文字列を取得する関数で、MID(文字列、開始位置、文字数)で指定した文字列を抜き出します。
難しいところは文字数の何文字抜き出すかという部分ですが、もうこの式をみるとなんとなく何をやっているのかわかると思います。
市・区・町・村の文字を起点に抜き出す文字数を決めています。
4. 動作確認
最後の手順の動作確認は実際にテストデータを作成して確認します。
検証の仕方は参照元のセルのデータを変更し、実際に値がどのように変わるかチェックすると良いです。

ここまでくるとこの式自体が何をやっているのかわかってくるかと思います。
以上がExcelの式が複雑すぎて何やっているかわからない!という時の対処の方法です。
まとめ
いかがでしたでしょうか。
色々と方法はあるかと思います。
私の方法はシンプルかつ確実な方法だと思いますので、ぜひ試してみてください。
今回使用したファイルも下記ダウンロードからできるようにしておりますので、ご自由にダウンロードして使用してください。
コメント