1

我编写了一个 ExcelLAMBDA函数,用于从字符串中提取数字。这是公式 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#) 上使用它,它会返回 #NUM!错误。我有另一个LAMBDA函数,它接受一个字符串并从另一个字符串中的特定位置获取一个字符。如果字符是数字,它会将字符连接到给定的字符串。我尝试在 get.numbers 函数中使用此函数,但它返回错误。

我的结论是

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

有没有办法解决这个问题?

4

2 回答 2

0

按照上面 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 行的范围

于 2021-02-13T12:37:53.087 回答
0

您在递归 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:经过一番挖掘,我在这里找到了限制的解释。它指出

此外,请注意 Excel 中当前的操作数堆栈限制为 1,024。这应该与计算时间一起记住,因为当前递归限制设置为 1,024 除以(lambda 参数的数量 + 1)。

于 2021-02-10T18:58:51.660 回答