为什么隐式交集运算符会改变我的公式的行为?

Art*_*out 5 microsoft-excel

自从我从 Excel 进行更新后,它会自动插入隐式交集运算符 @,因此我的公式在 Excel 工作簿中的行为发生了变化。

我注意到问题出现在用户定义的公式中。

我已将问题缩小到具有以下场景的 MCVE:

CustomRange为一个范围,引用 8 行,其中一行为空:

Alpha
Bravo
Charlie

Echo
Foxtrot
Golf
Hotel
Run Code Online (Sandbox Code Playgroud)

CustomFunction成为一个用户定义的函数,它接受一个整数 N 作为参数并返回该自定义范围的第 N 个元素

Function CustomFunction(Num As Integer)
 Dim R As Range
 Set R = Range("CustomRange")
 CustomFunction = R(Num, 1)
End Function
Run Code Online (Sandbox Code Playgroud)

让我们通过包含和省略隐式交集运算符来比较公式返回的结果:

=IF(@CustomFunction(4)="","EMPTY","NOT_EMPTY")
=IF(CustomFunction(4)="","EMPTY","NOT_EMPTY")
Run Code Online (Sandbox Code Playgroud)

第一个会屈服NOT_EMPTY,而第二个会屈服EMPTY

由于 Excel 将自动添加@到我的旧工作簿中,因此我的公式不再起作用。如果我找到并用空替换所有 @,我的公式将再次开始按预期工作(因此文章中的句子指出“您的公式将继续以与以往相同的方式计算。”是不正确的)。

我希望 Excel 停止更改我的公式,有没有办法解决这个问题?

har*_*ymc 0

隐式交集运算符 :@ 是在 Excel 365 for Windows 版本 1907 内部版本 11901.20176 中添加的,作为 Excel 引擎动态数组公式 重写的一部分,并且它会保留下来。

从本质上讲,微软取消了数组函数的概念(尽管它们仍然有效),而是允许几乎所有函数(包括 VLOOKUP)返回值数组。如果返回值的数组无法容纳在可用空间中,您将收到新的#SPILL!错误。

您可以使用 @ 运算符来避免错误,如 禁用#SPILL!文章中所述。错误。但是,这需要修改您的公式。

好消息是,如果 @ 运算符破坏了您的公式并且您手动将其删除,那么在保存后它将保持删除状态。Excel 仅对每个电子表格进行一次公式转换。不幸的是,我们目前不知道如何手动打开此标志以避免首先进行转换。

实际上,用于撤消公式转换的选项并不多:

  • 继续使用以前版本的 Excel,直到 Microsoft 提供避免转换的方法
  • 编写一个 VBA 宏,从所有公式中删除 @ 运算符(冒着出现新的 #SPILL! 错误的风险)
  • 手动修复您的公式。

这些方法都不是特别令人满意,但我还没有找到更好的方法。