我如何通过VBA编码来对SumIf或SumProduct函数进行多张纸的求和

问题描述 投票:0回答:1

我当前在单元格中的公式是:

=IFERROR(SUMPRODUCT(SUMIF(INDIRECT("'"&Regions&"'!$C:$C"),$B4,INDIRECT("'"&Regions&"'!AI:AI"))),"")

令人讨厌的是,当我复制时(仅向下),AI:AI不会更改参考单元格

我想将公式从单元格中取出,而是通过模块进行计算。任何想法都太棒了,谢谢

excel vba excel-formula sumifs sumproduct
1个回答
1
投票

在此公式中

=IFERROR(SUMPRODUCT(SUMIF(INDIRECT("'"&Regions&"'!$C:$C"),$B4,INDIRECT("'"&Regions&"'!AI:AI"))),"")

INDIRECT使用的字符串/文本是外观地址,但是由于它只是一个字符串(您可以看到它在引号" "中),复制后它不会改变到另一个单元格。实际上,这就是INDIRECT的目的(<示例:

    =SUM(A:A)这里的A:A是真实地址,如果您将其复制到另一个单元格中,它将更改。
  1. =SUM(INDIRECT("A:A"))这里"A:A"是一个字符串,如果将其复制到另一个单元格,则将
  2. not
  3. 更改!因此您可以通过替换来解决此问题

INDIRECT("'"&Regions&"'!$C:$C")

INDIRECT("'Regions'!" & ADDRESS(1,COLUMN(C:C)) & ":" & ADDRESS(ROWS(C:C),COLUMN(C:C)))

这是如何工作的?

    [ADDRESS(1,COLUMN(C:C))返回$C$1
  • [ADDRESS(ROWS(C:C),COLUMN(C:C))返回$C$1048576
  • 总和为$C$1:$C$1048576,与C:C相同。并且因为公式中的C:C是真实地址而不是字符串,所以如果将其复制过来,它将改变。

INDIRECT是易失的!

请注意,INDIRECT是易失函数。这意味着它会在每次单元格变化的任何值时重新计算。

示例:

    =SUM(A:A)仅当A:A中的值发生更改时,如果B:B中的值发生更改,它不会影响此公式的重新计算。
  1. =SUM(INDIRECT("A:A"))即使B:B中的值发生更改,它也会重新计算
  2. any值更改。
因此应避免大量使用易失性函数,因为它会减慢工作表的速度[[很多。
© www.soinside.com 2019 - 2024. All rights reserved.