使 Excel 中的数组公式仅对活动行进行计算

使 Excel 中的数组公式仅对活动行进行计算

当 Excel 计算某一列的公式(例如查找)时,它足够智能,只计算到最后一行,而不是在所有空白行上运行。

使用数组公式,这种行为似乎发生了变化,它会计算整个列(excel 2010 中的一百万行)。有没有办法强制数组公式仅在活动范围内计算?(除了用覆盖活动范围的宽泛引用替换列引用,例如,在您知道永远不会有 10000 行的电子表格中用 A:1:A10000 替换 A:A。

例如,是否有一个函数可以在某一行上执行,并返回最后一个活动行的引用?类似 =Last(A:A) 的函数可以返回引用或行号

如果您有一个从顶部到底部具有连续范围的工作表,那么我想您可以使用=INDIRECT("B1:B"&COUNTA(B:B))),但它并不理想(不稳定,在将列添加到电子表格时不会更新,并且仅适用于列不包含空行的电子表格。

答案1

遗憾的是,在这种情况下,各种 Excel 站点上几乎都推荐使用易失性INDIRECTOFFSET,尽管存在一个使用 的完好、最小易失性(事实上,据我所知,仅在“工作簿打开时”易失性)的设置INDEX

要确定列中的最后一行非空行(例如 A 列),了解该列中条目的数据类型以及是否存在空字符串(“”)会很有用。

尽管有可用的设置,无论相关条目的数据类型如何,它们都适用,但它们的类型必然是这样的:它们必须处理传递给它们的范围内的每个元素。因此 - 尤其是当需要计算的范围非常大时 - 它们可能非常耗费资源(Kyle 的第二个建议就是一个很好的例子,必须处理超过一百万个单元格,无论最后一个非空单元格是在第 1 行还是第 1048576 行)。

将最后一个非空行的值存储为已定义名称也是值得的,左行说。

可能的定义左行则如下:

1)如果有没有空字符串并且所有条目都是非数值,你可以定义左行作为:

=MATCH("Ω",A:A)

2)如果有没有空字符串并且所有条目都是数值,你可以定义左行作为:

=MATCH(9.9E+307,A:A)

3)如果有没有空字符串并且条目属于混合数据类型即一些数值,一些非数值,你可以定义左行作为:

=MAX(MATCH("Ω",A:A),MATCH(9.9E+307,A:A))

如果范围内有空字符串,那么解决方案必然会变得更加复杂,并且不再可能避免构造数组中的每个单元都单独处理。因此,我们能做的最好的事情就是最小化我们传递要处理的范围。

因此,我们有:

4)如果有是空字符串,你可以定义左行作为:

=MATCH(1,0/(LEN(A1:INDEX(A:A,MAX(MATCH("Ω",A:A),MATCH(9.9E+307,A:A))))>0))

(当然,如果数据类型始终是数字或非数字,则可以使其更加高效,如上所述。)

它需要数组输入(CSE),并且通常会大大减少正在处理的范围,尤其是与以下内容相比:

=MATCH(1,0/(LEN(A:A)>0))

从效率角度来说,这是灾难性的。

请注意,前者中的附加功能几乎没有什么危害:减少正在处理的单元格数量比担心一两个额外的函数调用更为重要。

现在,您可以在INDEX构造中使用它来动态定义范围。例如:

=A1:INDEX(A:A,LRow)

正如前文提到的那样,它几乎不存在任何波动。

问候

相关内容