A B C D
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("AUG 2016",BW!$F$2:$R$2,0)-1)*(BW!$B$3:$B$108=$E$1))
我的问题是,有没有办法让SUMPRODUCT变得动态,从某种意义上说,它知道第一行将是第二行并以20结束。
对于要求和的动态列,它将取决于标准。即如果标准是2月和3月,它将再次采用C2列:D20 ......该行也是动态的。
答案 0 :(得分:1)
如果您将范围转换为名为Table1
的表格,则以下内容应该有效:
=SUMPRODUCT((Table1[Department]="Marketing")*(INDIRECT("Table1[[Jan]:["&VLOOKUP("*",Table1[#Headers],COLUMNS(Table1),FALSE)&"]]")))
答案 1 :(得分:1)
为了使SUMPRODUCT动态,我们可以使用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列中找到包含文本的最后一个单元格,并使用它来设置数据集的范围。
对于Last列,我们使用INDEX(1:1,MATCH("ZZZ",1:1))
答案 2 :(得分:1)
如果您不打算使用ListObject(又名结构化)表,那么动态命名范围肯定有帮助。
=BW!$A$1:INDEX(BW!$A:$M, MATCH("zzz",BW!$A:$A ), MATCH(1E+99,BW!$1:$1 ))
1/1/2016
的实际日期(例如12/1/2016
至mmm yyyy
)。 现在,您可以使用INDEX / MATCH函数对'定义'定义范围的各个部分。
=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))))