在 Excel 中,为什么 EOMONTH()(及其他函数)在数组公式中不起作用?

在 Excel 中,为什么 EOMONTH()(及其他函数)在数组公式中不起作用?

有时很难预测 Excel 表达式是否可以转换为数组形式。例如,以下屏幕截图显示了一个表格,顶部有一行日期,后面是引用第一行的四行。前三行(即 Excel 行 3、4 和 5)每个都包含一个数组公式。前两个很好,但第三个使用 EOMONTH() 的公式中断了。然后 Excel 行 6 显示相同的 EOMONTH() 公式,但采用非数组形式。它工作正常。在 B3:B5 和 C7:I7 中,我使用 FORMULATEXT() 显示各个行和单元格中的函数。

在此处输入图片描述

我没有看到任何明显的EOMONTH() 的文档这将预示着失败。

有没有办法找出哪些功能有这种限制?(表面上是我的问题的一般形式,但实际上并没有太大帮助)。

答案1

微软只是决定不扩展所有公式以适用于数组。

有些可能很难,有些可能不合逻辑,或者他们可能没时间,谁知道呢。结果,有一个可以处理数组的函数列表,其余的则不能。我现在没有链接(我会去看看),但确实有一个定义的列表。

对于许多函数,您都可以通过 Google 寻找解决方法,例如,EOMONTH(range,0)可以使用 而不是 使用DATE(YEAR(range),MONTH(range)+1,0)}(下个月的第零天只是下个月的第一天的前一天......),OR(cond1,cond2,...)可以使用而不是IF(cond1+cond2+...>0,..,并且AND(cond1,cond2,...)可以使用 替换IF(cond1*cond2*...,...,因为 Excel 将 视为TRUE1视为FALSE0。

有些公式(在分析工具库在 Excel 2003 中)也可以与数组,但不是范围- 细微的差别!- -在范围前添加(减去负号,但没有空格)以使其成为数组:EOMONTH(- -range,0)

答案2

您实际上描述的是EOMONTH不采用范围并输出数组。

事实上,如果你给出一个数组作为参数的输入,它将生成一个数组作为输出。

对于完整的二维数组,请考虑:

=EOMONTH(INDEX(C2:I2,{1,2,3,4,5,6,7},1),{0;1;2})

请注意,在行参数的数组中使用了逗号,但在列参数的数组中使用了分号。这是为了防止各部分相互重叠。像这样,行将跨列布局,并且呈现给列数组的每个后续行都将溢出到每个后续行中。使用相同的分隔符,您将得到一行结果,其中 Excel 只能显示一个结果,或者它们将分层为三层到一个单元格,或者四层到一个单元格,具体取决于您是获取行还是列。

大多数将范围表示为数组的方法(例如)都CHOOSE({1,2,3,4,5,6,7},C2,D2,E2,F2,G2,H2,I2)可以解决问题。(但是,将公式放在某个地方,=C2:I2然后引用它而不是范围是行不通的。因此,使用函数从所需范围生成数组似乎可行,而更直接地使用范围寻址则不行。)

因此,它不会为您执行将范围作为输入,然后在其内部计算中将其转换为“真”数组的操作。但可以形成输入以使其产生可 SPILL 的输出。

答案3

这不起作用。但你可以这样做:

{=DATE(YEAR(C$2:i$2),MONTH(C$2:I$2)+1,0)}

答案4

以及其他人在此处提到的解决方法

{=DATE(YEAR(C$2:i$2),MONTH(C$2:I$2)+1,0)}

您可以创建一个基于数组的 UDF。换句话说,伪造它!

Excel 工作簿必须启用宏才能使 UDF 工作(这对您来说可能是也可能不是问题)。一些关于基于数组的 UDF 的资源:

  • 我的在线培训中心(我发现这篇文章中的语言很容易理解)。
  • 在 SE 上
  • 另一个SE- 这讨论了输入是范围还是数组。答案中的示例使用了两个 UDF,但是通过充分利用TypeName,您实际上可以将它们组合成一个 UDF,该 UDF 知道传递的是范围还是数组。

相关内容