LET 関数


ProPlusのExcelに、LET関数が追加されました。このLET関数は「何すか?これ?意味わかんないっす」という方が多いです。なので本稿では、そもそもこの関数はどういう働きをするのか?どんなときに使うのか?そして、どんな人がこれを使うのか?などを解説します。

引数の種類と意味

LET関数の引数は、次のとおりです。

もう、この時点で訳がわかりませんよねw LET関数の引数は、3種類あります。1つめは「変数の名前」です。これは、ユーザーが自由に決められます。2つめは「変数に入れる値」です。100とか"tanaka"など数値や文字列を指定してもいいですし、ここに計算式を指定すれば、計算式の結果が変数の中に入ります。3つめは、1つめで指定した「変数を使った計算式」です。LET関数を入力したセルには、最後に指定した「変数を使った計算式」の結果が表示されます。

このうち「変数の名前」と「変数に入れる値」は必ずセットで指定します。このセットは何組指定してもかまいません。ちなみに126組まで指定できるそうですが、そんなに指定する人はこの世にいないでしょう。引数の最後にひとつだけ指定するのが「変数を使った計算式」です。

最も簡単な例をご紹介します。言っておきますが、こんな使い方はしません。引数の種類と意味を理解するための例です。

まず変数Aを宣言します。その変数Aに数値の100を代入します。最後の「変数を使った計算式」では、変数Aを2倍しています。したがって、セルには100を2倍した200が表示されます。

VBAをご存じの方でしたら、これは次の意味です。

Function セルの数式()
    Dim A
    A = 100
    セルの数式 = A * 2
End Function

VBAはちょっと分かるけど「ん?Functionって何すか?」という方は、次の動画をご覧ください。Functionとは何かを動画でメチャクチャ詳しく解説しています。

■Function()って何ですか?

LET関数の続きです。先の使い方の意味は理解できましたか?では、もう少し複雑にします。

「変数の名前」と「変数に入れる値」は必ずセットで指定します。そして、このセットは何組でも(126組まで)指定できます。ここでは、変数Aを宣言して、その変数Aに100を入れています。そして、変数Bを宣言して、その変数Bに200を入れました。そして最後の「変数を使った計算式」で、変数A+変数Bを計算しています。

VBA的に表すと、こんな感じですかね。

Function セルの数式()
    Dim A, B
    A = 100
    B = 200
    セルの数式 = A + B
End Function

「変数に入れる値」には、それ以前に宣言した変数を使えます。なので、次のような使い方も可能です。

ややこしくなってきましたね。結果はつぎのとおりです。

VBA的には、こういう意味です。

Function セルの数式()
    Dim A, B, C
    A = 100
    B = A * 2
    C = A + B
    セルの数式 = A + B + C
End Function

まずはこれが、LET関数の動作です。

どんなときに使う関数か

LET関数を使うべき場面はひとつしかありません。それは、数式内で「同じ計算を何度もするとき」です。こんなとき、同じ計算を何度も書くのではなく、その計算の結果を変数に入れて、使い回しましょうという使い方です。簡単な具体例をご紹介します。

上図のようなデータがあったとします。このA列のデータから「ハイフン(-)とハイフン(-)で囲まれた部分」だけを抜き出したいです。そういう計算式を作ります。もちろん、ハイフン(-)以外の文字数はバラバラです。まずこれ、最初の「123-ABC-456」を例にして、どう考えるかを解説します。文字列内で任意の位置を抜き出すのですから、使うのはMID関数です。もし、文字数が分かっているとしたら、次のようになります。

さて、この「5」と「3」とは、どういう意味でしょう。最初の「5」は文字列を"抜き出す位置"です。次の「3」は抜き出す"文字列の長さ"を表しています。

もちろん、抜き出す位置や抜き出す文字列の長さは、データによって異なりますから、それらを自動的に計算できるようにします。まずは"抜き出す位置"からいきましょう。今回の"抜き出す位置"である「5」というのは、1つめのハイフンが存在する位置「4」に1を加えた数値ですね。ハイフンの右隣なのですから。文字列の中で、指定した文字の位置を調べるにはFIND関数を使います。

次は"抜き出す文字列の長さ"です。この「3」というのは、2つめに見つかるハイフンの位置(ここでは8)から、1つめに見つかるハイフンの位置(ここでは4)を引いて、さらに1を引いた数値です。

1つめのハイフンの位置は「FIND("-",A1)」で分かりました。では、2つめのハイフンの位置は、どうやって調べればいいでしょう。実はここでもFIND関数を使います。FIND関数は一般的に「FIND(探す文字,元の文字列)」のように指定しますが、実は3番目の引数で、検索を開始する文字位置を指定できます。

FIND(探す文字,元の文字列[,開始位置])

3番目の引数「開始位置」は省略可能で、省略すると元の文字列の先頭から探します。今回のケースでは、1つめのハイフンの位置は「4」と分かっています。なので、その右隣である「5」から検索を開始すればいいです。

役者は揃いました。これらを組み合わせると、こうなります。

この処理って、実務でもよく使う鉄板なのですが、見てお分かりのように「FIND("-",A1)」が何度も登場します。さあ、こんなときこそLET関数の出番です。

LET関数で、変数Pを宣言します。Pに深い意味はありません。Positionの頭文字です。その変数Pに、1つめのハイフンの位置を調べる「FIND("-",A1)」の結果を入れます。

あとは、変数Pを使ったMID関数を入力します。

何度も登場する「FIND("-",A1)」を、1文字の変数Pで表したのですから、計算式全体が短くなっています。なお、ヘルプによると、LET関数を使って変数に入れることで、同じ計算を何度もしなくて済むから、計算式の計算速度が向上するそうです。なるほど、今までのワークシート関数には存在しないタイプの、新しい関数ですから、Excelマニアとしては、ちょっとだけ楽しいです。でも、どうなんでしょう?このLET関数って、使われるのでしょうか。以下は、私の個人的な感想です。

実務で使う人はいないのでは?

すべてのExcelでLET関数が実装されたとしても、実務の現場で使われるワークシートでは、まず使われる機会はないと思います。

理由1:そもそも長~い数式を作れる人が少ない

LET関数は、同じ計算を何度も使うようなケースで役立ちます。そういう数式というのは、おそらく複数の関数を組み合わせた長~い数式だと思います。そもそも、あなたはそうした長くて複雑な数式を作れますか?ああ、VBAでも似たようなことを言っていますけど、ネットからコピペすることを"作る"とは言いません。自分だけで考えて実装できますかってことです。まぁ、ほとんどの方が首を横に振るでしょう。むしろ逆に、1セルに長~い数式を入れると可読性が悪くなり、数式がエラーになったらお手上げ状態になることが多いです。ですから一般的には「1セルに長~い数式は入れないようにしましょう」というのが普通です。作業セルを使って、複雑な計算を1ステップずつ処理するようにワークシートを作れば、トラブルや改変にも対応しやすいです。であるなら、LET関数の出番もないということです。

理由2:プログラミングセンスが必要

セルの数式内で変数が使えるなんて、プログラミングが好きな者からすればウキウキです。でもそれは、プログラミングができるからです。25年以上にわたってVBAを教えてきましたが、ビギナーはとにかく"変数"が苦手です。何らかの値を変数に入れて、それを後で使うという、プログラミングでは基本中の基本で悩んで挫折する人が実に多いです。VBAだったら、まだいいです。複数行で記述できますし、コード内にコメントも書けます。変数を使った複雑な処理も、ステップ実行でデバッグすることだって可能です。しかし、LET関数はどうでしょう。難しいです。VBAより何倍も難しいです。VLOOKUP関数でさえ頭を悩ませている人が、1つの数式内で複数の関数を駆使する長~い計算式をイメージし、さらに変数を使って効率化するなんて…。無理でしょ。無理です。

理由3:引き継ぎができない

ときどき「VBAは禁止」という部課の話を聞きます。業務でVBAを使ってはいけないと。理由は簡単です。マクロを作った前任者がいなくなると、誰もそのマクロを触れなくなり、何かのトラブルがあるとお手上げになるから。だから、そんな危なっかしいVBAなんぞ禁止にしてしまえっ!という判断です。個人的には、"臭いものに蓋をする"的な、そうした後ろ向きの判断ってのは嫌いですけど、でもしかたありません。企業は業務が最優先ですから。そのように「引き継ぎできない」という話題では、一般的にVBAがやり玉に挙がりますけど、実はワークシートの方がはるかにクセモノです。複数のシートやブックを縦横無尽に参照している複雑な計算式だけでなく、条件付き書式や入力規則、セルの表示形式、非表示の行や列やワークシートなどなど、なぜ、このセルに数値を入れると、ここに計算結果が表示されるのか、その仕組みを解き明かすのは、VBAの数十倍も大変です。「引き継ぎできない」問題は、VBAに限りません。そんな中でLET関数を使おうものなら…。恐ろしくて、夜しか眠れません。

以上の理由から、LET関数って実務では使われないんじゃないかなぁ~って。個人的にはそう思っています。私としては、何かの機会に遊んでみたいですけど。