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 是否存在特定问题,或者是否还有其他原因导致失败?
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(),并分别对初始数组的每一行进行这些计算。
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |