Excel SUMPRODUCT与dynamic列范围总和

ABCD 1 Department Jan Feb Mar 2 Marketing 100 200 300 3 R&D 150 250 350 4 Marketing 300 400 500 

我有一个如上表所示的示例文件。

下面的SUMPRODUCT公式仅将特定的行和列(第2行到第20行)和第B列到第C列进行求和

 =SUMPRODUCT((A2:A20="Marketing")*(B2:C20)) 

实际公式(来自评论):

 =SUMPRODUCT(INDEX(BW!$A$3:$AE$3,MATCH(C$35,BW!$1:$1,0)+MATCH("JAN 2016",BW!$F$2:$R$2,0)-1):INDEX(BW!$A$108:$AE$108,MATCH(C$35,BW!$1:$1,0)+MATCH("A‌​UG 2016",BW!$F$2:$R$2,0)-1)*(BW!$B$3:$B$108=$E$1)) 

我的问题是,有没有办法让SUMPRODUCT成为dynamic的,从某种意义上说,它知道第一行是第二行,结束于20。

至于dynamic列的总和,它将取决于标准。 即如果标准是2月和3月,则会采用列C2:D20 …,行也是dynamic的。

如果您将范围转换为名为Table1的表格,则以下内容应该可以工作:

 =SUMPRODUCT((Table1[Department]="Marketing")*(INDIRECT("Table1[[Jan]:["&VLOOKUP("*",Table1[#Headers],COLUMNS(Table1),FALSE)&"]]"))) 

为了使SUMPRODUCTdynamic化,我们可以使用INDEX / MATCH来查找数据的范围。

那么所有需要的是把想要的月份列在一个单元格中,我使用了I7

 =SUMPRODUCT((ISNUMBER(SEARCH($B$1:INDEX(1:1,MATCH("ZZZ",1:1)),I7)))*($A$2:INDEX(A:A,MATCH("ZZZ",A:A))="Marketing")*B2:INDEX(A:DD,MATCH("ZZZ",A:A),MATCH("ZZZ",1:1))) 

INDEX(A:A,MATCH("ZZZ",A:A))将在列A中find包含文本的最后一个单元格,并使用该单元格来设置数据集的范围。

对于最后一列,我们使用INDEX(1:1,MATCH("ZZZ",1:1))

在这里输入图像说明

如果你不打算使用ListObject(aka 结构化 )表,那么dynamic命名范围肯定会有所帮助。

  1. 转到公式,定义的名称,名称pipe理器,当名称pipe理器对话框打开时,单击新build。
  2. 给你定义的名字范围一个独特的名字; 我select了部门
  3. 将作用域保留为工作簿,并使用以下公式来引用:

    =BW!$A$1:INDEX(BW!$A:$M, MATCH("zzz",BW!$A:$A ), MATCH(1E+99,BW!$1:$1 ))

    专栏A:M将涵盖部门专栏和1月至12月。 请注意,2016年1月至2016年12月是实际date(如1/1/201612/1/2016 )格式为mmm yyyy

  4. 你应该结束以下dynamic命名的范围:

部门

现在,您可以使用INDEX / MATCHfunction对来“定形”定义范围的各个部分。

 =SUMPRODUCT((INDEX(Departments, 0, 1)=Q3)* (INDEX(Departments, 0, MATCH(R3, INDEX(Departments, 1, 0), 0)): INDEX(Departments, 0, MATCH(S3, INDEX(Departments, 1, 0), 0)))) 

departments_FORMULA