Excel计算过程/数组公式中的INDIRECT

Excel calculation process / INDIRECT in an array formula

我得到了这个传播sheet 我每天都会粘贴数百到数千行的数据。而且这个 spreadsheet 承载了很多功能。我想尽可能地减少计算时间,但不太确定 excel 是如何设计来处理数据的。两个功能之间是否有区别,范围如下:

SUM(A2:A50)SUM(A2:A99999)

我的看法:第一个示例中的 SUM 函数将在到达 A50 单元格后停止 运行,而在第二个示例中它将保持 运行 直到到达 A99999。由此我可以说首先在你的传播中更有效率sheet。 请指教

我得到这个公式 returns 我得到一个 #N/A 值,我相信这是因为 INDIRECT 包含在数组公式中(Ctrl + Shift + 输入).

整个公式本身:

=SUM(IF((INDIRECT("'" & $K & "'!" & $K)>CODES!$K)+(MMULT(--('Data paste'!AD2:AF5>CODES!$K),{1;1;1})>0)+(MMULT(--('Data paste'!AD2:AF5>CODES!$K),{1;1;1})>1)+--('Data paste'!AD2:AD5*'Data paste'!AE2:AE5*'Data paste'!AF2:AF5>CODES!$K), 1, 0)*--('Data paste'!Q2:Q5=CODES!C2))

请找一个spreadsheet uploaded onto the GDrive,这样你更容易理解我的意思。公式位于 CODES sheet E2 单元格。

谢谢。

显然,引用较小的范围总是更快或至少同样快。但是,Excel 确实有一些 optimization:

Many Excel built-in functions (SUM, SUMIF) calculate whole column references efficiently because they automatically recognize the last used row in the column. However, array calculation functions like SUMPRODUCT either cannot handle whole column references or calculate all the cells in the column.

所以这对 SUM(A2:A99999) 来说应该不是特别重要。

至于问题 2:是的,您可以在数组公式中使用 INDIRECT()。它目前只是 returns NA 因为你试图添加两个不同长度的数组:

{FALSE; TRUE} + {FALSE; FALSE; FALSE; FALSE} = {0; 1; #NA; #NA}

如何解决您的问题:

将 CODES!K7 更改为

 =COUNTA('Data paste'!A:A)

并将 CODES!E2 更改为

=SUM(IF(('Data paste'!AA2:INDEX('Data paste'!AA:AA,$K)>CODES!$K)
+(MMULT(--('Data paste'!AD2:INDEX('Data paste'!AF:AF,$K)>CODES!$K),{1;1;1})>0)
+(MMULT(--('Data paste'!AD2:INDEX('Data paste'!AF:AF,$K)>CODES!$K),{1;1;1})>1)
+--('Data paste'!AD2:INDEX('Data paste'!AD:AD,$K)*'Data paste'!AE2:INDEX('Data paste'!AE:AE,$K)*'Data paste'!AF2:INDEX('Data paste'!AF:AF,$K)>CODES!$K), 1, 0)
*--('Data paste'!Q2:INDEX('Data paste'!Q:Q,$K)=CODES!C2))

我已经用 Index() 替换了 Indirect() 调用,这应该会提高性能。