为什么 UNIQUE 和 FILTER 的组合会区分实际数字零和空单元格返回的零?

Why does the composition of UNIQUE and FILTER distinguish between the actual number zero and the zero returned from empty cells?

假设我们有2个单元格,一个为0,一个为空,如图A2:A3范围:

如果他们通过 FILTER,我们会得到两个零,请参见下图中 B2:B3FILTER(A2:A3, TRUE) 的输出。当我们将 UNIQUE 应用于存储先前结果的范围时,输出是唯一的 0 (请参阅 C2 中的结果)。但是组合 UNIQUE(FILTER(...)) 不会将这些零视为彼此相等,请参阅 D2:D3UNIQUE(FILTER(A2:A3,TRUE)) 的输出:

这是为什么?我们能否抑制这种行为,并作为组合的结果只得到一个零?


p.s。我使用 Office 365,Excel 版本 2108

这是一个持续存在的问题,Microsoft 似乎选择继续处理。也就是说,它将真正的空白单元格视为 0。因此,任何 return 的公式都会 return 0。INDEX、(*)LOOKUP 或简单的数学函数都可以做到这一点。

这似乎发生在最后一步,正如您在尝试的最终公式中看到的那样。 FILTER 显然 return 为 Unique 输入了一个空白,但是当它将值插入到工作表中时,它 return 为空白输入了 0。

解决这个问题的一种方法是在后端连接一个空字符串,然后尝试将数字转回数字:

=LET(rng,A2:A3,uq,UNIQUE(FILTER(rng,TRUE)&""),IFERROR(--uq,uq))


另一种选择是在过滤时测试范围并用空字符串替换空白:

=LET(rng,A2:A3,UNIQUE(FILTER(IF(rng="","",rng),TRUE)))

哪个更短,将保持数据类型。


如果可以访问内部人员的 BETA-channel 功能,TOCOL() 的第二个参数可用于在中间步骤中“过滤”空单元格(and/or 错误) :

=UNIQUE(FILTER(TOCOL(A2:A3,1),TRUE))

下面 E2 中的公式因 OP 中的缺席而引人注目,它表现出与查询 D2 的公式相同的行为:

VBA 深入了解 Excel 的计算引擎,因为它始终区分空单元格和文字 0:如果引擎读取 2 种数据类型,那么在这种情况下,它不会 return 少于 2 个结果,即使 'by Microsoft convention' 它们都被 return 编辑为 0(C2 中的公式引用引擎认为仅包含一个范围单一数据类型(参见散列变量),因此 return 只是一个单一的 0;F2 中的公式表明,将 Excel 变为 return 真正空白单元格的唯一明显方法是传递空字符串 作为数组常量的一部分 ).