EXCEL中REDUCE函数的异常行为,

Yaphet Tao 20 信誉分
2026-08-11T19:46:30.7766667+00:00

我写了一个简单的公式来返回每个合并单元格的合并数量, 就是各自合并了多少单元格

其中A1:A6 为 用户的图像, 相当于A1:A6={100; ""; 200; ""; ""; 300}

计算公式为

=REDUCE (1, A1:A6, LAMBDA (p,x,IF (x="", VSTACK (DROP (p,-1),TAKE (p,-1)+1), VSTACK (EXPAND (p,ROWS (p)+TAKE (p,-1)-1,,INDEX (p,ROWS (p),1)),1))))

结果有点奇怪, 为{1;1}

于是我手动追踪了 REDUCE 的每一步,手动按追踪的步骤来看:

参数为 A1:A2={100;""}时, 结果为 {1;2},

参数为 A1:A3={100;"";200}, 结果为 {1;2;2;1}, 没发现问题

但是这个REDUCE 函数自己的结果却很奇怪:

参数为 A1:A2={100; ""}, 它的结果为 {1;2}, 没问题

参数为 A1:A3={100; ""; 200}, 结果不是 {1;2;2;1}, 而是 {1;1},

参数为 A1:A5={100; "" ;200; ""; ""}, 它返回 {1;3},

再修改参数为 A1:A6={100; ""; 200; ""; ""; 300} 时,它又返回了 {1;1},

它似乎是这样处理的:每当 x=""不成立时,它没有用上一次的结果 进行迭代,而是改用初始值 1

这是什么原因呢, 是不是IF中的两个分支返回的数组长度不一致导致的, 我记得IF是短路操作吧

Microsoft 365 和 Office | Excel | 其他 | Windows
0 个注释 无注释

问题作者接受的答案
Ian-T 15,695 信誉分 Microsoft 外部员工 审查方
2026-08-12T07:15:59.7666667+00:00

此回复由系统自动翻译,可能存在细微的语法错误或表达不地道之处。感谢您的理解。


你好 Yaphet Tao

这似乎并非由两个 IF 分支返回不同大小的数组所引起。问题的根源在于,该公式使用的 REDUCE 函数涉及一个在计算过程中维度会发生变化的累加器。

REDUCE 函数的设计初衷是处理数组中的每个值并返回最终的累加结果。尽管有时可以在 REDUCE 内部利用 VSTACK 构建数组,但如果累加器的行数反复变化,可能会导致结果不一致。

如果目标是返回每个组所占用的行数(即包含一个非空单元格及其后方的空单元格),请尝试:

=LET( r,A1:A6, p,FILTER(SEQUENCE(ROWS(r)),r<>""), VSTACK(DROP(p,1),ROWS(r)+1)-p )

对于此数据:

100 空白 200 空白 空白 300

结果为

2 3 1

也就是三组合并区域分别占用 2、3、1 行。

需要注意,此公式是根据空白单元格推算分组,并不会读取单元格实际的“合并”属性。因此,如果区域中还包含普通空白单元格,结果也会将这些空白计算在内。

希望我的回答对您有帮助。如果您还需要任何进一步的帮助,请随时告诉我。


如果该回答对您有帮助,请点击“是”。如果您对该回答有进一步的疑问,请点击“评论”。

注意:如果您希望接收有关此帖的电子邮件通知,请按照我们文档中的步骤启用电子邮件通知功能。

此答案是否有帮助?

1 个人认为此答案很有帮助。

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。