【问题标题】:Can't pass a range to a lambda using Let and Makearray functions无法使用 Let 和 Makearray 函数将范围传递给 lambda
【发布时间】:2022-10-18 03:10:54
【问题描述】:

回到this 问题,我希望在数组中创建一个运行总计,但在数组的每一行中重新开始

1 2 3 4
5 6 7 8

导致

1 3 6 10
5 11 18 26

一种解决方案是使用 Makearray ,这很好用:

=MAKEARRAY(
    2,
    4,
    LAMBDA(r, c,
        SUM(
            INDEX(sheet1!A1:D2, r, 1) : INDEX(sheet1!A1:D2, r, c)
        )
    )
)

但是,我现在希望更一般地使用 Let 语句来写这个:

=LET(
    range, Sheet1!A1:D2,
    MAKEARRAY(
        rows(range),
        Columns(range),
        LAMBDA(r, c,
            SUM(INDEX(range, r, 1) : INDEX(range, r, c))
        )
    )
)

但它导致

这个非常相似的公式可以正常工作(它不应该解决原始问题,而只是用于测试是否可以在 Let 语句中将范围传递给 lambda):

=LET(
    range, Sheet1!A1:D2,
    SCAN(0, range, LAMBDA(a, c, a + c + INDEX(range, 1, 1)))
)

相同的代码还可以将范围作为参数传递给 Google 表格中的命名函数。

定义范围作为命名范围也有效。

像这样使用封闭的 Lambda 而不是 Let 有同样的问题:

=LAMBDA(range,
    MAKEARRAY(
        ROWS(range),
        COLUMNS(range),
        LAMBDA(r, c,
            SUM(INDEX(range, r, 1) : INDEX(range, r, c))
        )
    )
)

Makearray 是否存在特定问题,或者是否有其他原因导致失败?

【问题讨论】:

  • 我没有收到=LET(range,A1:D2,MAKEARRAY(ROWS(range),COLUMNS(range),LAMBDA(r,c,SUM(INDEX(A1:D2,r,1):INDEX(A1:D2,r,c))))) i.stack.imgur.com/mwqwZ.jpg 的错误,您是否有一个命名范围等于行或列?我注意到您的公式显示 rows(range)Columns(range) 没有大写,如预期的那样。
  • 感谢@p.b,您在 lambda 中明确地重复了原始范围 a1:d2 而不是用 'range' 替换它,这样就可以解释差异。
  • 我明白了,将它们替换为range 时确实会出错。
  • Using an enclosing Lambda instead of Let has the same issue. 是吗?至少在 Google 表格中,LAMDA(没有LET) 参数由reference 传递,而不是由value 传递。所以,INDEX():INDEX() 应该与LAMBDA 一起使用
  • 有趣的。我没有非常彻底地测试,所以会回到它。

标签: excel lambda excel-formula range let


【解决方案1】:

INDEX() >>:<<INDEX() 的构造将在应用于范围时起作用。不是数组AFAIK。会导致这些错误。也许尝试类似:

=LET(range,A1:D2,MAKEARRAY(ROWS(range),COLUMNS(range),LAMBDA(r,c,SUM(INDEX(range,r,SEQUENCE(c))))))

这将类似于您的初始公式的构造。但是,在您提到的链接问题中,您希望将SCAN()BYROW() 结合使用。您已经注意到嵌套这些 lambda 辅助函数会导致错误。我只是想向您展示,只需一个 SCAN() 函数即可:

=SCAN(0,A1:D2,LAMBDA(a,b,IF(COLUMN(b)=1,b,a+b)))

或者更简洁:

=SCAN(0,A1:D2,LAMBDA(a,b,a*(COLUMN(b)<>1)+b))

我有点困惑,发现我们可以比较 lambda 结构内的 'b' 变量的行/列。我以前不知道的东西……现在。它确实感觉有点小故障,但现在我们实际上可以对SCAN() 内的BYROW() 助手使用某种变体,并分别对初始数组的每一行进行这些计算。

【讨论】:

  • 啊,我现在明白了。它必须埋在文档中的某个地方,还是那条知识只是来自经验?
  • @TomSharpe,这纯粹基于反复试验。注意:我只使用SCAN() 更新了我的答案。您确实尝试自己回答链接的问题。
  • 您可以像您所做的那样测试 b 变量的列,这似乎很了不起。恭喜你有了这个发现!
  • 转置的唯一问题是我们失去了查询结果数组的行/列索引的可能性,因为转置结果是一个数组,而不是一个范围,因此像ROWCOLUMN 这样的标准函数是不可能的。
  • @JosWoolley,您说得对,它会停止工作,但这与我在此处的第二条评论中提到的内容相矛盾,因为这些函数实际上确实适用于数组。例如=COLUMN(TRANSPOSE(A1:D2)) 正确地等于 2。但它似乎会在SCAN() 内停止工作。真可惜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2020-01-20
  • 2018-06-26
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多