Microsoft からエクセルの新しい関数について発表がありました。
ここのところインパクトのある新しい関数が続々と実装されてきましたが、今回の関数もかなりインパクトがある関数です。
関数名は「LET」。値を代入できるという関数です。
https://techcommunity.microsoft.com/t5/excel-blog/announcing-let/ba-p/1233572
従来の問題点
これは少し前の計算式の作成の方法なのですが、もしもVLOOKUP関数の結果、検索値が見つからなかった場合に普通であれば#N/Aエラーとなりますが、そうではなく、空白とするという場合、次のような計算式が考えられました。
=IF(ISNA(VLOOKUP(A1,C1:E5,2,FALSE)),””,VLOOKUP(A1,C1:E5,2,FALSE))
値があるかどうかチェックするためのVLOOKUP関数と、実際の値を出すためのVLOOKUP関数と、このように全く同じVLOOKUP関数を2つ書くという必要がありました。
これだけでも面倒なのですが、この計算式を後から見直す時に、2つある VLOOKUP 関数が全く同じものかどうか目で確認するという手間と時間がかかっていました。
そこでIFERROR関数が登場しました。
=IFERROR(VLOOKUP(A1,C1:E5,2,FALSE)),””)
これだけで記述できるようになり、本来の目的を果たすためのVLOOKUP関数一つで、もしもそれがエラーだった場合の判断も出来るようになりました。
しかしながら、VLOOKUP関数のエラーは、検索値が見つからないだけではなく、他にも様々な要因で色々なエラーが出ます。上記のIFERROR関数はどのエラーが発生しても空白としてしまいます。
例えばVLOOKUP関数で元の表が3列しかないにも関わらず、5列目を指定した場合は、 #REF!エラーになりますが、その場合も区別せずに空白としてしまいます。
もし区別が必要な場合においては、現状ではやはり同じ計算式を何度も繰り返し計算式内に入れる必要があります。
LET関数とは
新しく発表になったLET関数は、値や計算式を一時的な名称で格納し、計算式内で何度も使えるようにした関数です。
プログラム言語で言えば、変数、または定数宣言といった言葉が近いと思います。
上記の例で言えば「VLOOKUP(A1,C1:E5,2,FALSE))」の計算式を「値の取り出し」と名前をつけて、「=IF(ISNA(値の取り出し),””,値の取り出し)」というようなシンプルな計算式で表すことができるようになります。
書式は次のとおりです。
=LET(設定する名称1,設定する名称に格納する計算式や値1,設定する名称2,設定する名称に格納する計算式や値2,…,最終的な計算式)
つまり設定する名称とそれに格納する値や計算式を交互にどんどん入れていって、一番最後にそれらを使ってどのような計算をするかを入れる形になります。
名称は任意のものを設定することができて、ダブルコーテーションで囲む必要はないようです。日本語が使えるかどうか、名称に使えない文字があるかなどのルールは今のところ判明していません。この記事では開設のために名称に日本語を使います。
上記の例だと複雑になってしまうので最もシンプルな例で紹介します。
=LET(消費税率,10%,A1*消費税率)
セルA1に入力された金額に対する消費税額がこの計算式で求められます。
軽減税率を考慮した計算式は次のようになるでしょう。
=LET(消費税率,IF(B1=”軽”,8%,10%),A1*消費税率)
セルB1に「軽」と入力されていれば8%、そうでなければ10%の消費税率でセルA1に入力された金額の消費税額を求めます。
LET関数は目新しくない
実はこのLET関数がなくても、同じ計算を実現させることは可能です。
VLOOKUP関数の例でいえば、一旦、他のセルにVLOOKUP関数の結果を求めて、その値を使ってその他のセルに計算すれば良いのです。
よって、今まで方法がなかったことを実現することができるようになる関数ではありません。
LET関数のメリット
では、LET関数のメリットは何でしょうか。
まず、なにより、他のセルを使わなくても一つのセルだけで計算式を成立させることができます。たくさんのセルを使って求めると途中経過がどんなプロセスなのか一目で追うことは難しくなります。それが一つのセルで表されていれば後から見直す時に見やすくなります。
一つのセルで計算を全てやろうとすると従来は同じ計算を何度もしなければならなかったので計算速度がそのぶん遅くなります。それが一回だけで済むようになるというのは大きなメリットではないでしょうか。
実は大きな魅力を感じている部分があって、RAND関数のようなランダムな値を使う計算式でダミーデータを作る場合、例えば次のような計算式を作ることになります。
=IF(RAND()>=0.7,1,RAND()>=0.5,2,3)
本来は1回のランダムな値で0.7以上か、0.5以上か、それ未満かの確率で1,2,3の値に振り分けたかったのに、0.7以上でなければまたランダムな値を作っているので、想定した確率になりません。これをLET関数で
=LET(乱数,RAND(),IF(乱数>=0.7,1,乱数>=0.5,2,3)
とすることで1回の乱数で評価でき、想定した確率での分布にすることができます。
情報を見ると、おそらくですがスピル機能を使った計算式もLET関数に組み入れることができるようです。
=LET(抽出値,E1,一覧表,A1:B10,検索範囲,A1:A10,FILTER(一覧表,検索範囲=抽出値))
とすることで、計算式内のどれが何かを明示することもできるでしょう。これは名前機能を使って名前を定義するよりも可読性に優れた計算式になるかもしれません。
できればこれはできてほしいこと
まだLET関数はOffice Insiderでも実装を確認することはできませんでしたので、実際にどんな動作になるかは現時点で分かりません。
できればこのような動作ができるといいなと思っていることが一つあります。
上記のFILTER関数に更にSORT関数で並べ替えを行うという動作を計算する場合に次のようになっているとわかりやすい計算式に出来ると思いました。
=LET(抽出値,E1,一覧表,A1:B10,検索範囲,A1:A10,抽出結果,FILTER(一覧表,検索範囲=抽出値),SORT(抽出結果))
一旦名前定義をしている値で計算したものを、さらに名前定義して、最終的な計算式で使うことができればさらに応用範囲が広がるかもしれません。
足し算をするステップからさらに掛け算をするステップをしたうえで、はじめの足し算のステップの値を足すといった前に計算した値を使うことができるようになるからです。
一つのLET関数の中ではできないかもしれないですが、LET関数を重ねることによってこれは実現できる可能性は高いです。
=LET(抽出結果,LET(抽出値,E1,一覧表,A1:B10,検索範囲,A1:A10,FILTER(一覧表,検索範囲=抽出値)),SORT(抽出結果))
ここまで行くとメンテナンス性は悪くなるので、メリットはひとつなくなるのですが、一つのセルの中だけで処理できるというメリットもかなり大きいので、そういう意味では活用しがいがあるかもしれません。
まとめ
LET関数によって、一つの計算式の中だけで実現できるようになり、そのことによって新たにできることが何かあるのかもしれません。
LET関数でしかできないこと、LET関数で初めてできることもこれからどんどん発見されていくかもしれません。
スピル機能が搭載されてからExcelの計算式のバリエーションはかなり多くなりました。SEQUENCE関数を使って様々な一覧表を作成していると、何度も同じSEQUENCE関数を入力するようなケースがとても多いです。
皆さんも同じ計算式を何度も一つのセルに入力するということが今までもあったかもしれません。LET関数はそのような苦労をなくして、Excel計算書を作成するスピードを劇的に向上させてくれるので、そのスピード感で働き方的に新たに何かができるようになるのかもしれません。
LET関数は、非常にプログラム的な関数だということができると思います。だからといってプログラマーじゃない人がこの関数を使いにくいかと言うとそうではありません。きちんと動作内容を押さえれば、普通の日本語として扱うことが出来ると思います。
コメント