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("AUG 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命名范围肯定会有所帮助。
- 转到公式,定义的名称,名称pipe理器,当名称pipe理器对话框打开时,单击新build。
- 给你定义的名字范围一个独特的名字; 我select了部门 。
- 将作用域保留为工作簿,并使用以下公式来引用:
=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/2016
至12/1/2016
)格式为mmm yyyy
。 - 你应该结束以下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))))