无法使用 Let 和 Makearray 函数将范围传递给 lambda

Tom*_*rpe 5 excel range pass-by-reference let excel-formula

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

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)
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

不过,我现在希望使用 Let 语句更普遍地编写此内容:

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

但这会导致

在此输入图像描述

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

=LET(
    range, Sheet1!A1:D2,
    SCAN(0, range, LAMBDA(a, c, a + c + INDEX(range, 1, 1)))
)
Run Code Online (Sandbox Code Playgroud)

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

将范围定义为命名范围也是可行的。

使用封闭的 Lambda 而不是像这样的 Let 在 Excel 中存在相同的问题:

=LAMBDA(range,
    MAKEARRAY(
        ROWS(range),
        COLUMNS(range),
        LAMBDA(r, c,
            SUM(INDEX(range, r, 1) : INDEX(range, r, c))
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

我将其命名为 TestLambda 并将其命名为 =TestLambda(A1:D2)

但这在 Google 表格中有效:

=LAMBDA(range,
    MAKEARRAY(
        ROWS(range),
        COLUMNS(range),
        LAMBDA(r, c,
            SUM(INDEX(range, r, 1) : INDEX(range, r, c))
        )
    )
)(A1:D2)
Run Code Online (Sandbox Code Playgroud)

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

Jvd*_*vdV 8

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

=LET(range,A1:D2,MAKEARRAY(ROWS(range),COLUMNS(range),LAMBDA(r,c,SUM(INDEX(range,r,SEQUENCE(c))))))
Run Code Online (Sandbox Code Playgroud)

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

=SCAN(0,A1:D2,LAMBDA(a,b,IF(COLUMN(b)=1,b,a+b)))
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

=SCAN(0,A1:D2,LAMBDA(a,b,a*(COLUMN(b)<>1)+b))
Run Code Online (Sandbox Code Playgroud)

我有点困惑,发现我们可以比较 lambda 结构内“b”变量的行/列。以前我不知道的事情......现在。BYROW()它确实感觉有点小问题,但现在我们实际上可以对内部的帮助程序使用某种变体SCAN(),并分别对初始数组的每一行进行这些计算。

  • 转置的唯一问题是,我们失去了询问结果数组的行/列索引的可能性,因为转置结果是一个数组,而不是一个范围,因此诸如“ROW”和“COLUMN”之类的标准函数是不可能的。 (2认同)