提问人:Michael Suchy 提问时间:10/27/2023 最后编辑:Notus_PandaMichael Suchy 更新时间:10/29/2023 访问量:162
使用带有动态数组的 BYROW 作为公式输入
Using BYROW with dynamic arrays as formula inputs
问:
我在 excel 表中有一列,其中包含以下公式:=ARRAYTOTEXT(HSTACK(MAKEARRAY(1,[@[Liquidation Lag]],LAMBDA(r,c,0)),TAKE(VALUE(TEXTSPLIT([@[Default Vector]],", ")),,[@[Months to Project]]-[@[Liquidation Lag]])))
在另一个工作表上,我想使用 BYROW 动态溢出一个数组,该数组提取公式的 ARRAYTOTEXT 部分中的嵌入数组并按列溢出它。这是我尝试使用的公式:
=BYROW(lossModel_tbl[Liquidation Vector],LAMBDA(r,VALUE(TEXTSPLIT(r,", "))))
我尝试了各种迭代,包括makearray,sequence,index等,我总是想出任何一个 #calc!或者 #value!哎呀。
任何建议将不胜感激。
答:
=NUMBERVALUE(IFNA(DROP(REDUCE(“”,SEQUENCE(ROWS(A1:A4)),LAMBDA(x,y,HSTACK(x,TOCOL(TEXTSPLIT(INDEX(A1:A4,y),“,”))))),,1),“0”))
如果我正确理解您要做什么,此公式将返回预期结果。 BYROW 无法应用,因为它不能同时水平和垂直溢出。
评论
免責聲明:由于 Excel 中递归 lambda 的限制,以下解决方案中概述的方法只能用于小型数据集。
对于任何内置的动态数组函数,如 ,如果对函数的每次迭代执行的计算都生成一个结果数组,它将返回错误,因为不支持“嵌套数组”。BYROW()
#CALC!
作为解决方法,您通常会找到的固定解决方案是使用 with 和/或 的某种变体。然而,这种方法可能难以理解,甚至更难适应复杂的场景。REDUCE()
VSTACK()
HSTACK()
另一种方法是在名称管理器中创建一个自定义函数,其行为与 完全相同,但具有能够“堆叠”嵌套数组结果的额外好处。为此,请打开名称管理器 (Ctrl + F3) 并使用以下公式定义一个名为 STACKBYROW 的新名称:LAMBDA()
BYROW()
=LAMBDA(array,function,[initial_value],[start],[pad_with],
LET(
n, IF(ISOMITTED(start), 1, start),
f, function(INDEX(array, n, )),
v, IF(ISOMITTED(initial_value), f, IFNA(VSTACK(initial_value, f), pad_with)),
IF(n<ROWS(array), STACKBYROW(array, function, v, n+1, pad_with), v)))
现在可以完全按照您的预期在工作簿中使用该函数:STACKBYROW()
BYROW()
=STACKBYROW(lossModel_tbl[Liquidation Vector], LAMBDA(r, VALUE(TEXTSPLIT(r, ", "))))
如果结果生成“交错数组”,则默认情况下,空值将用零 (0) 填充。如果需要,使用可选的 [pad_with] 参数用您选择的值填充它们,例如空字符串 (“”):
=STACKBYROW(lossModel_tbl[Liquidation Vector], LAMBDA(r, VALUE(TEXTSPLIT(r, ", "))),,, "")
至于上面评论部分中介绍的其他示例,您可以使用:
=STACKBYROW(A1:A2, LAMBDA(r, --TEXTSPLIT(r, ", ")),,, "")
BONUS 示例(复杂性增加):
为了证明 的灵活性,我们可以用它来解决 Access Analytic 的 Wyn Hopkins 在 2022 年 11 月提出的“票证列表挑战”:STACKBYROW()
溶液:
=STACKBYROW(tblTicket, LAMBDA(r,
LET(
n, INDEX(r, 1),
v, --TEXTSPLIT(INDEX(r, 3),"-"),
m, MIN(v),
IFERROR(HSTACK(n, SEQUENCE(MAX(v)-m+1,, m)), n))),
{"Name","Ticket Number"})
结果:
评论
=DROP(REDUCE("",lossModel_tbl[Liquidation Vector],LAMBDA(s,r,VSTACK(s,VALUE(TEXTSPLIT(r,", ")))),1)