今回は、関数LETの使い方を紹介していこう。LETは2020年11月にリリースされた新しい関数で、最新のExcel 2021とMicrosoft 365でのみ使える関数となる。その機能は「変数を定義し、その変数を使ってさまざまな処理を実行できる」というもの。他の一般的なExcel関数と比べて、かなり趣の異なる関数といえる。詳しく解説していこう。
関数LETの基本
関数LETは「変数を使ってプログラムにように記述できる関数」としてリリース時から注目を集めてきた関数だ。2024年2月時点において、Excel 2021とMicrosoft 365でのみ使用できる、まだまだ歴史の浅い関数といえる。
関数LETについての巷の感想は、「とても便利な関数」という人もいれば、「あまり意味がない」とか「むしろ混乱を招くだけ」という人もいる、評価の分かれる関数になっているようだ。「実際にどうなのか?」を各自でも判断できるように、その基本的な使い方と活用例を紹介していこう。
まずは、関数LETの書式を紹介する。最初に「変数の名前」を指定し、次に「その変数の値」を指定する。これらを1組にして変数を好きなだけ定義していき、最後に「処理」を記述する仕様になっている。
◆関数LETの書式
=LET(名前1, 値1, [名前2], [値2], [名前3], [値3] …・ , 処理)
これだけでは理解しにくいと思うので、簡単な例を使って解説していこう。以下の図は、「taxRate」という名前の変数を作成し、その値に10%(0.1)を指定した例だ。さらに処理として、(C2セル)×「taxRate」の計算を行うように指定している。
この関数LETの実行結果は「300」となる。今回の例では、C2セルの値が3,000で、それに「taxRate」の値となる0.1を掛け算することになる。つまり、3,000×0.1=300となる訳だ。
このように、あらかじめ変数を定義しておき、この変数を使って「計算などの処理」を行うのが関数LETの使い方となる。
とはいえ、単純に「=C2*0.1」と書いた方が「簡単で理解しやすいのでは?」と感じた方も多いだろう。確かに、その通りである。
ということで、別の例も見ていこう。今度は、変数名を日本語(全角文字)で作成し、3個の変数を定義した例だ。内容を理解しやすいように「Alt」+「Enter」で改行しながら関数LETを記述している。
この例では、「税抜金額」という変数にC2セル、「消費税」という変数にC3セル、「送料」という変数にC4セルを定義している。そして、これらの変数を使って「税抜金額+消費税+送料」の計算を行っている。
実行結果は以下の図のとおり。C2セル(3,000)、C3セル(300)、C4セル(500)を足し算した「3,800」が結果として表示される。
こちらも単純に「=C2+C3+C4」と記述した方が「簡単でわかりやすい!」と感じる方が多いのではないだろうか。わざわざ関数LETを使わなくても済む処理といえる。
関数LETを使って変数に「セル範囲」を定義することも可能だ。今度は、XLOOKUPでデータを取得する処理を関数LETで記述してみよう。
参考までに、関数XLOOKUPは以下の書式で引数を指定する仕様になっている。
◆関数XLOOKUPの書式
=XLOOKUP(検索値, 検索範囲, 取得範囲, [#N/A代替], [一致モード], [検索順])
上図では、これらのうち最初の3つの引数を「変数」で指定している。具体的には、「検索値」という変数にC3セル、「検索範囲」という変数にC14:C513のセル範囲、「取得範囲」という変数にA14:H513のセル範囲を定義している。そして、これらの変数を使ってXLOOKUP関数を記述している。
このような記述でもデータを正しく取得することが可能だ。
この場合は、「LETを使うことで改善されたか?」についての意見が分かれるかもしれない。普通に「=XLOOKUP(C3,C14:C513,A14:H513,"該当なし".2)」と記述した方が入力する文字数は少なくても済む。LETを使うと入力すべき文字数が増えるため、デメリットと感じる方もいるだろう。
その一方で、関数の記述内容は読み取りやすくなる。後ほど「検索範囲」や「取得範囲」を変更するときも簡単に修正できるようになる。これはメリットといえるだろう。
そのほか、「XLOOKUPの使い方を知らない人にも親切な記述になる」と考えることもできる。ただし、「LETの使い方を知らなければ余計な混乱を招くだけ」という意見もあり、かなり微妙な判断になる。プログラミングが得意な方にとっては「LETは見慣れた書き方」になるが、そうでない方にとっては「なんか回りくどい…」と感じるかもしれない。
さらに「Excel 2019以前では使えない関数」という点も問題点の一つといえる。他人とファイルを共有するときは、相手のExcelのバージョンを確認しておかなければならない。
関数LETの活用例(1) ~繰り返しの回避~
前述したように、LETは好みの分かれる関数であり、使わなくても同様の処理を実現できる関数といえる。とはいえ、これでは面白みに欠けるので、関数LETを上手に活用した例を紹介していこう。
以下の図は、「氏名カナ」をもとにデータを取得する関数XLOOKUPの例だ。LOOKUP系の関数は、取得データが「空白セル」であった場合に0(ゼロ)が表示される仕様になっている。
この0(ゼロ)を表示しないようにするには、何らかの対策を施す必要がある。最も単純な方法は、IF関数を使って以下のように処理する方法だ。
条件:XLOOKUPで取得したデータは0であるか?
真の場合:空文字("")を出力
偽の場合:元の取得データをそのまま出力
この処理を具体的に記すと以下の図のようになる。これで「空白セル」を空白のまま(空文字として)取得できるようになる。
ただし、「XLOOKUP(C3,C14:C513,A14:H513,"該当なし".2)」の記述を2回も繰り返さなければならないのが難点といえる。このような場合に関数LETを活用すると、繰り返しの記述を回避できるようになる。
上図に示した例では、「a」という名前の変数を作成し、その値に「XLOOKUPで取得したデータ」を指定している。続いて、関数IFで「aが0であるか?」を確認し、そうであった場合は空文字("")を出力、そうでなかった場合は変数「a」の値をそのまま出力する、という仕組みになっている。
もともとの記述方法に比べて、入力する文字数が大幅に減っているのを確認できるだろう。もちろん、この記述方法でも「空白セル」を空白のまま取得することが可能だ。
このように、関数LETは「同じ記述の繰り返し」を回避するために活用されるケースが多い。また、不要な繰り返しを回避することで「処理の高速化」にも貢献してくれる。
先ほど示した2つの例について説明していこう。前者のように記述したときは、XLOOKUPが2回も実行されることになる(IFが偽の場合)。一方、LETを使って記述した後者は、変数「a」の値を指定するときにXLOOKUPが1回だけ実行される。つまり、XLOOKUPの実行回数が少なくなる分だけ処理速度の向上が見込める訳だ。このように「処理速度の向上」という観点から関数LETが活用されるケースもある。
関数LETの活用例(2) ~乱数を1回だけ生成~
続いては、第62回の連載で「注意が必要」と説明した乱数の生成について紹介していこう。以下の図は、関数RANDを4倍して「0~4未満」の乱数を生成し、その値に応じて「東京都/神奈川県/埼玉県/千葉県」のいずれかの文字列データを作成する、という処理を記したものだ。
一見すると、正しく動作してくれそうに見えるが、大きな問題が潜んでいる。それはRANDが実行されるたびに「乱数の値」が変化してしまうことだ。
「数式の検証」を使って実際の動作を見ていこう。最初に「1番目の関数RAND」で0~1未満の乱数が生成される。以下に示した例では「0.755…」という数値が生成された。
この値を4倍すると1以上になるので、1番目の条件分岐はFALSEとして処理される。続いて、2番目の条件分岐が処理されていくが、このとき「2番目の関数RAND」で再び別の乱数が生成されてしまう。以下に示した例では「0.598…」という数値が生成されている。
同様に、3番目、4番目の条件分岐においても「新しい乱数」が生成される。つまり、そのつど乱数の値が変化することになり、思い描いていた動作にはなってくれない。
このように乱数を使って処理するときにも関数LETが活用できる。次に示す例では、関数LETで「n」という名前の変数を作成し、その値に「RAND()*4」(0~4未満の乱数)を指定している。その後、関数IFSで「n」の値を調べて、出力する文字を変化させる、という処理を行っている。
こちらの記述についても「数式の検証」で実際の動作を見ていこう。最初に、変数「n」の値を指定するために関数RANDが実行される。以下に示した例では「0.435…」という数値が生成された。
続いて、この数値が4倍されて「1.742…」という値になる。この「1.742…」が変数「n」の値として関数IFSで処理されていくことになる。
1番目の条件分岐で変数「n」に「1.742…」が代入される。この値は1以上になるため、1番目の条件分岐はFALSEとして処理される。
続いて、2番目の条件分岐においても変数「n」に「1.742…」が代入される。この値は2未満になるため、2番目の条件分岐はTRUEとして処理される。
3番目、4番目の条件分岐も同様に、変数「n」は常に「1.742…」として処理されていく。
このように、生成した乱数を「変数」として定義しておくと、そのつど乱数が生成されてしまう不具合を回避できる。こちらは、関数LETを使わないと“思い描いていた処理"を実現できない事例といえる。
今回の連載で紹介した「繰り返しの回避」や「乱数の生成」以外にも、関数LETの便利な活用方法はあるかもしれない。しかし、「これは!」という用途はまだ見つかっていないようだ。歴史の浅い関数なので、今後、画期的な活用方法が見つかるかもしれないが、現時点では「微妙な関数…」となってしまうのが実状かもしれない。