はじめに
LAMBDA関数の引数の種類(数値、文字列、関数)を判別し、種類ごとに処理を分けると引数を減らせるのではと思いました。あらためてIS関数を調べてみると、引数が関数であることを判別するものがありませんでした。そこで、e\いろいろなIS関数の結果を組み合わせれば判別できるのではないかと思い調べてみました。
調査結果と表の見方
調査した結果を表1で示します。
・B2:N2…評価するIS関数名
・A列…評価する数式
・B3:N26…IS関数の実行結果(=IFERROR(eval(B2#&"("&FILTER(A:A, A:A<>"")&")")*1, 0))
IS関数の結果を合計すめため、TRUE/FALSEを1/0に変換。例えば、セルK7は、ISERROR(1/0) の結果が入る。
・B1:N1…IS関数の結果に対する重み付け
・O列…IS関数の実行結果と重み付けをかけた合計(=BYROW(B3#,LAMBDA(a,SUM(a * B1#))))
表1
※IS関数の実行は、IS関数名と「( )」でくくった数式をeval関数にて実行
※eval関数はVBAのユーザー定義関数で作りました。引数をEvaluate関数に渡しています。
※IS関数の実行結果がエラーとなる場合は0として処理
以下注意が必要な関数
ISNOTEXT関数
評価対象がテキスト以外はすべてON。ONの条件が多すぎて、単独では使用できないと思われる。
ISBLANK関数
引数の参照先がブランクの場合(E10)以外に、関数の引数が省略された場合(E6,E19)もONする。
ISLOGICAL関数
評価対象が論理値の場合(F3,F11)以外にIF関数で「,」が省略されている場合(F20,F24)もONする。
ISNUMBER関数
評価対象が数値以外では、IF関数の引数先行評価時にON(G23,G25,G26)。
ISEVEN関数
評価対象が偶数以外にブランクのときにもON(I10)。
結論:引数に関数が指定されているかどうかの判定方法は
関数は表1の18行目になります。ISNOTEXT関数のみONで、このパターンは他にないため、判別できそうです。
判別方法は、評価値をnとすると
=(ISNOTEXT(n)=TRUE)(ISBLANK(n)=FALSE)(ISLODICAL(n)=FALSE)(ISNUMBER(n)=FALSE)(ISOMITTED(n)=FALSE)*(ISERROR(n)=FALSE)
になります。
せっかくなので表1をLAMBDA関数にしてみました
「数式」-「名前管理」より関数登録して見てください。
_IS(n)=4 のとき関数判定です。
=LAMBDA(x,[f],LET(
func, VSTACK(
LAMBDA(n, ISTEXT(n)),
LAMBDA(n, ISNA(n)),
LAMBDA(n, ISERR(n)),
LAMBDA(n, ISERROR(n)),
LAMBDA(n, ISOMITTED(n)),
LAMBDA(n, ISEVEN(n)),
LAMBDA(n, ISODD(n)),
LAMBDA(n, ISNUMBER(n)),
LAMBDA(n, ISLOGICAL(n)),
LAMBDA(n, ISBLANK(n)),
LAMBDA(n, ISNONTEXT(n)),
LAMBDA(n, ISFORMULA(n)),
LAMBDA(n, ISREF(n))
),
a, REDUCE(0, func, LAMBDA(a, f, 2 * a + IFERROR(f(x), 0))),
b, (a),
c, IF(ISOMITTED(f), b, f(b)),
ret, (c),
(ret)
))