使用 Excel 溢出范围作为递归 Lambda 函数的数据源

Using an Excel Spill Range as data Source for a Recursive Lambda Function

我写了一个 Excel LAMBDA 函数来从字符串中提取数字。 这是公式 get.numbers=LAMBDA(text,ntext,position,size,VALUE(LET(x,LEN(text),n,position,IF(n>x,ntext,get.numbers(text,IF(ISNUMBER(VALUE(MID(text,n,size))),ntext&MID(text,n,size),ntext),n+1,size)))))

当文本来自单个单元格范围(例如 A2)时,该公式运行良好,但如果您尝试在溢出范围 (A2#) 上使用它,它 returns #数!错误。 我有另一个 LAMBDA 函数,它接受一个字符串并从另一个字符串的特定位置获取一个字符。如果字符是数字,它将字符连接到给定的字符串。我试图在 get.numbers 函数中使用此函数,但它返回了错误。

我的结论是

  1. Lambda 函数不能在递归 lambda 函数中使用
  2. 递归 Lambda 函数无法接受来自溢出范围的数据

有什么解决办法吗?

递归 lambda 中的待处理计算的数量似乎有一些限制。所以你必须小心按照正确的顺序做事。我得到这个适用于最多 93 行和一列的数组。来电是=get.numbers.array(A2#, "", 1, 1, 1).

get.numbers.array =LAMBDA(textArray, ntext, position, size, x, 
  LET(s, ROWS(textArray), 
      q, SEQUENCE(s), 
      singleResult, get.numbers(INDEX(textArray,x), ntext, position, size), 
      d, IF(x=s, textArray, get.numbers.array(textArray, ntext, position, size, x+1)), 
      IF(x=q, singleResult, INDEX(d,q))))

需要更多的实验才能使其适用于多个维度。

编辑 1:经过一番挖掘,我找到了限制 here 的解释。它指出

Furthermore, do note that the current operand stack limit in Excel is 1,024. This should be borne in mind together with calculation times, as the current recursion limit is set as 1,024 divided by (number of lambda parameters + 1).

根据上面 Axuary 的回答,我做了进一步的试验,并且能够清理公式,使公式只采用一个参数(字符串或包含字符串的范围)。 最终公式为

Call.GetNumbers.Array =LAMBDA(array,get.numbers.array(array,"",1,1))

它只需要一个参数(数组),它可以是一个包含字符串的单元格,或者一个溢出的范围
主要公式为:

get.numbers.array =LAMBDA(array,last,r,ln,LET(n,ROWS(array),q,SEQUENCE(n),lineresult,Call.Join.numbers(INDEX(array,r)),d,IF(r>n,last,get.numbers.array(array,Call.Join.numbers(INDEX(array,r)),r+1,ln+1)),IF(ln=q,lineresult,INDEX(d,q))))

其余公式为:

Call.Join.numbers =LAMBDA(text,join.numbers(text,"",1))
join.numbers =LAMBDA(text,ntext,p,LET(l,LEN(text),VALUE(IF(p>l,ntext,join.numbers(text,ntext&get.If.Number(text,p),p+1)))))
get.if.Number =LAMBDA(text,x,IF(ISNUMBER(VALUE(MID(text,x,1))),MID(text,x,1),""))

公式适用于 1 列乘 95 行的范围