2024/10/24:LET関数(+LAMBDA)

≪毎週木曜12:15~ZOOMで開催中!Excel関数お勉強会の内容です。》
※【2024/10/25】一部訂正&追記を行いました。


◇関数のざっくり紹介

LET関数は、中間計算、値、定義名などを数式内で名前を付けて格納し、
その数式内であれば、その名前(変数?)で呼び出せる関数です。
LAMBDA関数も、パラメーターとして名前をつける(引数として中身を変えたい所に名前をつける)関係上、LET話をする延長上としてLAMBDAに関する内容が多めに・・・。
でも一応、今回はLET関数がメイン(`・ω・´)

■LET関数

= LET (name1、name_value1、calculation_or_name2、[name_value2、calculation_or_name3...])

LET 関数 - Microsoft サポート

↑こんな英文字見ても良くわからないかも知れませんが(私がわからん)、基本的な使い方としては単純だし簡単!
↓こんな感じです(/・ω・)/気軽につかっていこー!

=LET(①好きな名前, ②名前を付けたい値や処理など, ③最終的にやりたい計算式)

1つの式の中で、何回も同じ計算式が出てくるような場合は、ちゃっちゃと名前を付けちゃって、その短い名前で使うと便利。
ちなみに、基本的に①名前と②値や計算は2つ1セットで定義して、最大126組まで定義できるらしい。(未検証)

そして、地味にきっとみんな頭から抜けがちな気がしているのは、
「定義名」にも名前を付けれること。
例えば範囲に「売掛金」という名前を付けたとして、その「売掛金」に「売上」という名前を付ける事もできます。
結果の値は基本同じものになるけど、処理内容的には別物値として扱う場合別名で改めてつけておいた方が後から把握しやいかもしれません。

■LET関数で名前につかえる文字・使えない文字

  • ◎英文字 ※1

  • 〇日本語や外国語(ひらがな・カタカナ・漢字・ギリシャ文字その他)

  • △記号(半角記号・全角記号・一部の機種依存文字など) ※2

  • ▲アラビア数字 ※3

  • ▲Excelの処理で使われる文字(関数名、セル番地、処理記号など) ※4

※全般で言えますが、同じ文字だと認識する文字列でも
  「全角文字」と「半角文字」は別物として扱われます。

※1 大文字と小文字は区別されません。
  定義した名前の表記に勝手に変換されます。
  (セルに、元々Excelに入っている関数を小文字で書いた場合でも、
   勝手に大文字に変換されるのと理屈は多分同じ)

※2 「 ①」は使えるけど「1⃣」は使えないとか色んなパターンがあります。
  (風柳さん情報によると、半「1」(半角アラビア数字・U+0031)と
   「 ⃣」(U+20E3)とを組み合わせた合字だかららしい)
  ただ、1⃣など数字関連の記号で使えない場合、半角数字と同様に
  2文字目以降であれば使える場合があります。
  でも、基本的に機種依存文字などは使わない方が無難でしょう。

  あと、半角記号系は「¥」は使えるけど「#」や「$」は、
  全角ですら使えないというパターンもあります。
  (これは恐らくExcelで処理として使う文字だから)

※3 半角数字(0~9)単体では使えないけど、2文字目以降なら使えます。
  全角は使えるんですが基本的にこれも使わない方がいいと思います。
 (使えたとしてもぱっと見で判断しづらいので。)
 
※4 ※2と重複しますが・・・単なる表記に使われている「¥」は使えるけど
  「A1」などのセル番地(地味にXFDまであるので、)
  スピルを参照する「#」や、絶対参照させる「$」、100で割る「%」等
  Excelの”処理”に関わる記号は使えません・・・。
  関数名は、使えるといえば使えるのですがLAMBDA関数と絡んでくると
  ややこしい事になるので、基本的には避けた方がいいと思います。

■注意!!みんなきっとやってる「a」「A」とかの名前の罠

みんなやりがち!
名前にa,b,c等の文字単体を使った場合、罠があるので注意が必要です!
セルを参照しない処理ならそこまで関係はないのですが・・・

値や計算式に「a」(A)などの名前を付けて使う処理自体には問題ないけど、
そういうセル番地(A~XFD)の名前を付けたLET式の中で、
「A:A」の様に列全体を参照させた場合、つけた名前の値として認識される
・・・という、気づきにくく酷い罠があるので注意が必要です。Σ(; ・`д・´)!

A列にこんないっぱい式入れていて、COUNTAの結果が「1」なはずはない・・・!💦 

英文字で名前を付ける場合は、「_」や「z」など、普段1文字目にまず使わないような文字を、文字列の前に入れておいた方が良いでしょう。
もしくはそのExcelファイルを絶対日本でしか使わないようなら日本語!
わかりやすいし読みやすいしね(*´∀`*) 

◇色々調べてみる

■Excel関数として用意されている関数名を名前としてつけた場合

➊単純な値や計算式につけた場合
 ⇒単なる文字列扱いとして、定義した処理で結果がでる。

=LET(SUM,1,SUM)
=1
 

❷LAMBDAで関数を作ってそれに名前を付けた場合1
 ~第2引数内で完結している場合~
 ⇒単なる文字列扱いとして、定義した処理で結果がでる。

=LET(SUM,LAMBDA(SUM,SUM+1)(2),SUM)
=3

❸LAMBDAで関数を作ってそれに名前を付けた場合2
 ~最終計算式で()内に引数をいれた場合~
 ⇒Excelで元から入っている関数SUMとして計算した結果がでる。
 
※ちなみに、最後のSUMを書いた時点で↓こんな感じで「元々ExcelにあるSUM関数(fx)」か、「LAMBDAで作ったSUM(x)」を選べそうな候補が出てきますが、どちらを選んだとしてもSUMの後ろに()を書いた時点で、強制的に元々入っているSUM関数として処理されます・・・ノ(_△_ )ヽ

どちらの処理をするか選べるように見えるが・・・
=LET(SUM,LAMBDA(a,a+1),SUM(2))
=2

❹LAMBDAで関数を作ってそれに名前を付けた場合3
 ~最終計算式のは関数名のみを入れ、LETの閉じカッコの後ろに()内に引数をいれた場合~
 ⇒単なる文字列扱いとして、定義した処理で結果がでる。
 ※LAMBDA関数はちょっと特殊で、引数を自身の()の後ろに書いた()内の値などを引数として引っ張ってこれるけど、LETの()の外側でも有効な模様。
 (Zコンビネータの再帰式なんかは、このLAMBDAの動きのせいで混乱する・・・)

=LET(SUM,LAMBDA(a,a+1),SUM)(2)
=3

≪結論≫
最終計算式を書く所で、関数名の後ろに()がついていなければ単なる文字列として、処理可能ってことですね!!! 
※でも基本的に使わない方が良いとおもうよヾ(・ω・)ノ
 なんとなく付けた英文字列が関数に存在しないかも調べた方がいいかも。

■LET関数をネスト(入れ子)させて同じ名前を付けた場合

➊LET(LET)
 ⇒内側のLETで付けた名前が優先される。

=LET(a,1,LET(a,2,a))
=2
 
=LET(a,1,LET(b,2,a))
=1
※内側LETのa⇒bに変えると、もちろん外側のaも有効ではあることがわかる。

❷LET(LAMBDA(引数))/ LET(LAMBDA)(引数)
 ⇒LAMBDAで付けた名前が優先される。

=LET(a,1,LAMBDA(a,a)(2))
=2
 
=LET(a,1,LAMBDA(b,a)(2))
=1
※内側LAMBDAのa⇒bに変えると、もちろん外側のaも有効ではあることがわかる。

////////////////////////////////////////////////////////////////////////

=LET(a,1,b,LAMBDA(a,a),b)(2)
=2
 
=LET(a,1,b,LAMBDA(c,a),b)(2)
=1
※同様

❸LET(LAMBDA(LET)())
 ⇒内側のLETで付けた名前が優先される。

=LET(a,1,LAMBDA(a,LET(a,3,a))(2))
=3
 
=LET(a,1,LAMBDA(a,LET(b,3,a))(2))
=2
=LET(a,1,LAMBDA(c,LET(b,3,a))(2))
=1
※内側LAMBDAのa⇒b/cに変えると、それぞれ外側のaも有効ではあることがわかる。

≪結論≫
同じ名前を付けた場合、一番内側の名前が優先される。
※でも基本的には使わない方が良いとおもうよヾ(・ω・)ノ

ただし、個人的に再帰式(いつか記事書くかも?)を書く場合は、結果的に再帰させている部分の名前は、統一しておいた(もしくは2つ並べるとか)方が、結果的に処理の流れがわかっていいかも…と思っているので、私は同じ文字列を使うようにしています。
(処理の動きを把握する段階では違う名前にした方が理解しやすかった…)

=LET(r,LAMBDA(r,cnt,num,IF(cnt=5,num,r(r,cnt+1,num+num))),r(r,0,1))
=32

※LETのrと、LAMBDAのrは厳密には別物。パーマンのコピーロボットとか合わせ鏡みたいな。
 でも結局同じ処理を引っ張ってきているので、同じ文字を使った方が調整するときなどに把握しやすい。
 「あ、ここが再帰させてる部分ねー(ハイ、スルースルーこれはそのまま…)」ってな感じで。

■LET関数を使わないと1セル内で出来ない処理(多分)

RAND関数やRANDBETWEENなど、ランダムな数を発生させる関数は、1つの式の中で複数書いた場合、個々にランダムな数字を発生させてしまうため、
1つのランダムな値を発生させて、それを式の中で1つの数字として共通で使いたい場合は、LET関数で発生させた値に名前をつけておきましょう。

=LET(rnd,RANDBETWEEN(1,9),rnd&" ⇒ "&rnd*2)
=714 / 24 / 36 ・・・など
 
=RANDBETWEEN(1,9)&" ⇒ "&RANDBETWEEN(1,9)*2
=86 / 118 / 52 ・・・など。
※二つの式を合わせるとそれぞれ関係ない値が出る。

◇あとがき

今日は開始直前までだれもきてなくて、ドキドキしてましたw
最終的には6~7人くらい来てくれたのかな。
(いつも余裕なさすぎて、あまりしっかり人数チェックできてない💦

いつもありがとうございます(*´∀`*)ほっ
普段交流ない方も、ちょっと混ざってみたい―と思ったら
お気軽におこしくださいね!(/・ω・)/

この記事が気に入ったらサポートをしてみませんか?