当 Excel 计算某一列的公式(例如查找)时,它足够智能,只计算到最后一行,而不是在所有空白行上运行。
使用数组公式,这种行为似乎发生了变化,它会计算整个列(excel 2010 中的一百万行)。有没有办法强制数组公式仅在活动范围内计算?(除了用覆盖活动范围的宽泛引用替换列引用,例如,在您知道永远不会有 10000 行的电子表格中用 A:1:A10000 替换 A:A。
例如,是否有一个函数可以在某一行上执行,并返回最后一个活动行的引用?类似 =Last(A:A) 的函数可以返回引用或行号
如果您有一个从顶部到底部具有连续范围的工作表,那么我想您可以使用=INDIRECT("B1:B"&COUNTA(B:B)))
,但它并不理想(不稳定,在将列添加到电子表格时不会更新,并且仅适用于列不包含空行的电子表格。
答案1
遗憾的是,在这种情况下,各种 Excel 站点上几乎都推荐使用易失性INDIRECT
和OFFSET
,尽管存在一个使用 的完好、最小易失性(事实上,据我所知,仅在“工作簿打开时”易失性)的设置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)
正如前文提到的那样,它几乎不存在任何波动。
问候