下面的公式生成数组 cols 中数字的排列 - 在本例中为 1 到 6。 perms 变量输出没有重复的排列的二维数组。
但是,我想要得到组合,而不是排列。因此 1,2,4 与 4,2,1 相同。我的想法是对每一行进行排序,然后过滤掉重复的行。每个变量都按预期工作,直到最终的 SORT 部分,即 BYROW(perms,LAMBDA(row,SORT(row,,,TRUE)))。这会产生#calc。
期望的行为:取前几行,变量perms是:
| 1 | | | | | |
| 2 | | | | | |
| 3 | | | | | |
| 4 | | | | | |
| 5 | | | | | |
| 6 | | | | | |
| 1 | 2 | | | | |
| 1 | 3 | | | | |
| 1 | 4 | | | | |
| 1 | 5 | | | | |
| 1 | 6 | | | | |
| 2 | 1 | | | | |
使用LAMBDA函数,它应该变成:
| 1 | | | | | |
| 2 | | | | | |
| 3 | | | | | |
| 4 | | | | | |
| 5 | | | | | |
| 6 | | | | | |
| 1 | 2 | | | | |
| 1 | 3 | | | | |
| 1 | 4 | | | | |
| 1 | 5 | | | | |
| 1 | 6 | | | | |
| 1 | 2 | | | | |
换句话说,行 [2, 1] 应转换为 [1, 2],行 [4, 3] 应转换为 [3, 4],依此类推。
公式为:
=LET(
cols, SEQUENCE(1, COLUMNS(TableStu)),
firstperm, VALUE(CONCAT(cols)),
lastperm, VALUE(CONCAT(SORT(cols,,-1,TRUE))),
diff, (lastperm-firstperm)+1,
list, SEQUENCE(diff, 1, firstperm),
wanted, FILTER(list, LEN(REDUCE(list, cols, LAMBDA(m,j, SUBSTITUTE(m,j,"")))) = 0),
all, FILTER(wanted, wanted <> "", ""),
repeaters, UNIQUE(TOCOL(IF(LEN(all)-LEN(SUBSTITUTE(all,cols,""))=0, all, ""))),
repsnoblanks, FILTER(repeaters, LEN(repeaters) > 0),
allnoreps, FILTER(all, NOT(ISNUMBER(XMATCH(all, repsnoblanks)))),
allAndLess, VALUE(TOCOL(VSTACK(allnoreps, LEFT(allnoreps, SEQUENCE(1, 4))))),
nums, UNIQUE(SORT(FILTER(allAndLess, NOT(ISNA(allAndLess))))),
starts, IF(REDUCE(cols, MAX(cols), LAMBDA(x,y, cols <= MAX(cols))), cols, ""),
perms, IFERROR(VALUE(MID(nums, starts, 1)), ""),
BYROW(perms,LAMBDA(row,SORT(row,,,TRUE)))
)
我尝试过的: 将 perms 更改为
IFERROR(VALUE(MID(nums, starts, 1)), "")
到
IFERROR(VALUE(MID(nums, starts, 1)), 0)
或者
IFERROR(VALUE(MID(nums, starts, 1)), 9999)
仍然给出#calc。
我知道我的公式包含很多步骤,而且非常违反直觉,而且可能效率低下。但是,我需要一个完全基于公式的解决方案,因为这必须应用于无法处理刷新电源查询的非技术用户,更不用说启用 vba 和运行宏了。如果您能想出一个更易读和更有效的公式来处理像 cols 这样的数字数组,请告诉我。
编辑:SORT(perms,,,TRUE)不会给出与perms有任何不同的结果。也就是说,首先显示的表格将保持不变。看来byrow只能处理单列,那么我应该使用什么函数呢?
在 Excel 中,除了
REDUCE
之外,lambda 辅助函数的“LAMBDA”部分无法返回数组。这就是为什么下面的公式不起作用
BYROW(perms,LAMBDA(row,SORT(row,,,TRUE)))
尝试这样的事情
REDUCE("",SEQUENCE(ROWS(perms)),LAMBDA(acc,i,VSTACK(acc,SORT(INDEX(perms,i),,,TRUE))))
但是,如果您的目标是返回给定集合的所有子集的集合,您可以简单地使用
MID(REDUCE("",set,LAMBDA(a,c,VSTACK(a,a&","&c))),2,9^9)