[Excel365]Lambda関数【実践編:引数の省略】

記事
学び
こんにちは。かづきです。

前回、Lambda(ラムダ)関数を使った「オリジナル関数」の作成方法を紹介しました。
今回は、Lambda関数を実際に使う時に、引数(変数を入れた部分)を省略した場合はどうなるか、またその対策方法を紹介したいと思います。

↓前回の記事はこちらからどうぞ!


■Lambda関数で引数を省略するとどうなる?

Lambda式「a*b」で引数(後ろのカッコ内)として、例えば、「1」と「2」を入れる場合に(1,2)と、ちゃんと入れた場合「1*2」なのでは結果は「3」。
そこを(1,)・(1)・()と、引数省略した場合の結果例を画像にまとめました。
引数省略.png
恐らく理想的な結果としては★を付けている④(または④別式)、使う状況によっては☆を付けている②というところでしょうか。
(②は、数字の代わりにセル番号を入れて複数行で計算した場合などに、片方の数字が入ってなければ0を表示しておきたい場合にいいかも知れません。)

それぞれの解説は、以降の項目でしていきます。

■①そのまま第2引数を省略した場合

引数省略1.png
=LAMBDA(a,b,a*b)(1,2)
(1,2)両方を入れた場合はもちろん、問題なく「2」と結果が出ます。
=LAMBDA(a,b,a*b)(1,)
(1,)と入れた場合は、第2引数は枠としては省略させずに中身(値)だけ省略しているので、0として扱われます。(空白が0扱いのようなものです。)
「2*0」という事になるので、結果は「0」。
=LAMBDA(a,b,a*b)(1)
(1)だけしか書かない場合、完全に第2引数を省略してしまっているので、「必要な引数が不足している」ということで、#VALUEエラーになります。

■②省略したい部分の変数を[]で囲った場合

引数省略2.png
次は、省略したい引数部分の変数(今回の例では”b”)を[]で囲った場合。
=LAMBDA(a,[b],a*b)(1,2)
①と同様、(1,2)両方を入れた場合は問題なく「2」と結果が出ます。
=LAMBDA(a,[b],a*b)(1,)
(1,)と入れた場合は、①と同様結果は「0」。
※引数の値は入れていないものの「枠」としては省略していない為。
=LAMBDA(a,[b],a*b)(1)
(1)だけしか書かない場合、変数bを[]でくくっている為、省略可能な引数とみなされ、この場合は(1,)と同様に結果は「0」となります。

■③[]で省略可能とせず、省略対応の初期値(計算式)を設定した場合

変数bを入れなかった場合の仮の値(初期値)を入れておきたい場合は、Lambdaと同時に正式公開された「ISOMITTED」を利用します。
※③では[]で囲まない場合の結果で説明しています。本来は囲む④推奨。

ISOMITTED関数は、関数の中に入れた変数(1回に付き1個のみ指定可能)の値が、計算式側(後ろのカッコ部分)に入っていないかを判断します。
なので、ちょっとややこしくなりますが↓こうなります。
「入っていない場合:TRUE(1)」
「入っている場合:FALSE(0)」
引数省略3.png
上記のIF式は、こんな感じの意味となります。
「IF(bが無いか?,無い場合(TRUE)はa*1,ある場合(FALSE)はa*b)」

=LAMBDA(a,b,IF(ISOMITTED(b),a*1,a*b)(1,2)
この場合、bが無いかを判断して、「2」が入っているのでFALSEとなり、
「a*b」の結果を返します。なので「1*2」となり結果は「2」。
=LAMBDA(a,b,IF(ISOMITTED(b),a*1,a*b)(1,)
この場合、bが無いかを判断するISOMITTED関数が入っていますが、
「,」があるから枠としてはb部分の引数が存在する(ただし0)
且つ、
『[]がついていないことで変数b部分は省略されていない
ので、「a*b(0)」→「1*0」となり、結果は「0」。
=LAMBDA(a,b,IF(ISOMITTED(b),a*1,a*b)(1)
このパターンはちょっとややこしいのですが、ISOMITTEDでbが無いかを判断して分岐しようとする以前に、そもそもbを[]で囲っておらずbが省略できない状態。
なので「必要な引数が不足している」ということで、#VALUEエラーになります。

■④[]で省略可能にして、省略対応の初期値(計算式)を設定した場合

③とほぼ同じですが、変数bを[]で括り省略可能な状態にした場合。
引数省略4-1.png
=LAMBDA(a,[b],IF(ISOMITTED(b),a*1,a*b)(1,2)
これは言うまでもなく、結果は「2」。
=LAMBDA(a,[b],IF(ISOMITTED(b),a*1,a*b)(1,)
この場合、「,」があることによってb部分の引数枠があるのでエラーにはなりません。その上で↓こういう流れになります。(ややこしい)

「,」があるから枠としてはb部分の引数が存在する(本来は0)
・・・なのですが、ISOMITTED処理が入っているので、
[]で囲われた変数bが省略されている(0→ISOMITTED処理へ)
という事で、IF関数のTRUEである「a*1」→「1*1」となり、結果は「1」。

■④の別式(数字部分で分岐しておく)

引数省略4-2.png
④の場合は、bの値が入っていない場合に計算式「a*1」という書き方をしましたが、「a*b」のb部分にIF関数でネスト(入れ子)してもOKです。

この場合は、「bの値が入っていない場合は1,入っていればbの値」という計算結果にaを掛けるという計算の流れとなります。
※それぞれ結果は④と同じです。

■⑤引数を全部省略した場合

引数省略5.png
=LAMBDA(a,b,a*b)()
これは言うまでもなく、aもbも[]無しに省略してしまっているのでエラー。
=LAMBDA([a],[b],a*b)()
これは、aもbも省略可能な状態にはなっているけど、省略した場合の初期値を特に指定していないので、「0」のまま計算され「0*0」で結果は「0」。
=LAMBDA([a],[b],IF(ISOMITTED(a),1,a)*IF(ISOMITTED(b),2,b))()
この場合は、aが入っていない場合は「1」、bが入っていない場合は「2」というISOMITTED処理がそれぞれ入っているので、引数が何も入っていなくても自動的に「1*2」となり、結果は「2」。

■番外(他の関数と組み合わせる場合&計算式だけの式)
引数省略番外.png
【番外1】
Lamda関数を他の関数とネスト(入れ子)にする場合は、Lamda関数式の()と計算式の()二つ共を含んだ全体を他の関数で囲む必要があります。

【番外2】
Lambda関数として、変数を含めない形でも式としては成立します。
ただ恐らくこういう使い方が必要な場面は、ほぼ無いかと思われます。
(変数が不要なのであれば、そのまま「名前の定義」に登録できますしね。)

■あとがき

今回の内容は、Lamda関数の基本の式は書けるようになったら、必要に応じてチャレンジしていただければと思います。

ISOMITTED関数は「無いかどうかを判定」という、ちょっとややこしい処理判定になっているので、説明がややこしいことになっていますが、これも実際に使ってみた方が案外頭に入ってくれそうな気はします。

出品のほうでは、Lamda関数を使った式の作成や調整等も受け付けておりますので、まずはご相談からお気軽にご連絡くださいませ。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す