Excel,Sumproduct,多个条件搜索{}

时间:2016-07-13 12:38:01

标签: excel

我在互联网上发布了几个帖子(包括stackowerflow),代码如下

=SUMPRODUCT((A1:A10="Marketing")*(B1:B10={"North","South"})*(C1:C10))

搜索条件整齐地放入{}。我有28个这样的条件要搜索,所以我正在寻找一种方法使公式更容易阅读。如果我试试,我会得到N / A.

我缺少一个技巧吗?

我知道它可以写出来 (B1:B10="North") + (B1:B10="South") 但是有28个项目会很长。

提前谢谢

EDIT1 :(无视)

试过Axel的建议

简单示例

        -   A   B   C   D
        1       1   2   3
        2   1   2   2   3
        3   2   4   4   6
        4   3   6   6   9



 =SUMPRODUCT((A2:A4={2,3})*(B2:D4))

    Returns Sumproduct(({1,2,3}={2,3})*(B2:D4)) -> I still get N/A for last column when you continue in process

    Same for  
    =SUMPRODUCT((A2:A4=A6:B6)*(B2:D4))
    where A6:B6 is list of conditions

    or 

    =SUMPRODUCT((A2:A4=testrange)*(B2:D4))

我正在尝试将所有条件置于公式{"case1","case2",...}内,但不能使其正常工作。

编辑2: 好的,我现在看到了区别。 初始公式逐列逐列

我正在努力解决的问题

Column A- list of accounts, I need to find 28 of them 
Row 1 - months (conditions varies)
Range B2:AA462 - values 

我可以用(A2:A462="account1")+(A2:A462="acount2")...写出最多28个案例,但我在问是否有办法更简单地写它

初始A2:A462={"North","South"}

之类的东西

这样的东西
=Sumproduct((A2:A462={"account1","account2",...})*(B1:AA1="June")*(B2:AA462))

有没有办法以某种方式写这个?

编辑4:

几周之后受到Axel的投入的启发

=SUMPRODUCT(MMULT(--(A2:A7=G1:J1),ROW(1:4)/ROW(1:4))*(B1:E1=G4)*B2:E7)

可以成长为

{=SUMPRODUCT(MMULT(--(A2:A7=TRANSPOSE(namedrange)),ROW(OFFSET(A1,0,0,COUNTA(namedrange)))/ROW(OFFSET(A1,0,0,COUNTA(namedrange))))*(B1:E1=G4)*(B2:E7))}

好的,命名范围,列中有条件,更自然地保留要筛选的条件列表。此外,MMULT现在是灵活的,并计算条件数并调整行数乘以。 必须将整个公式作为数组公式输入。

1 个答案:

答案 0 :(得分:0)

{"North","South"}是行向量的数组文字。这意味着它就好像“北”和“南”被放置在一行中的并列单元格中。因此,如果“北”位于E1而“南方”位于F1,则公式也可以是:

=SUMPRODUCT((A1:A13="Marketing")*(B1:B13=E1:F1)*C1:C13)

有更多标准可能是:

=SUMPRODUCT((A1:A13="Marketing")*(B1:B13=E1:H1)*C1:C13)

标准是行向量(一行,多列)非常重要,因为B1:B13是一个列向量。

回答编辑2:

方法:

=SUMPRODUCT(((A2:A462="account1")+(A2:A462="account2")+...+(A2:A462="account28"))*(B1:AA1="June")*B2:AA462)

,它将起作用,与(A2:A462={"account1","account2",...,"account28"})不同。后者无法工作,因为它创建了一个461行和28列的矩阵,而工作的((A2:A462="account1")+(A2:A462="account2")+...+(A2:A462="account28"))只是一列中461行的向量。

等效物可以是:

=SUMPRODUCT(MMULT(--(A2:A462={"account1","account2",...,"account28"});ROW(1:28)/ROW(1:28))*(B1:AA1="June")*B2:AA462)

如果“account1”,“account2”,...,“account28”在AC1:BD1中,那么还是:

=SUMPRODUCT(MMULT(--(A2:A462=AC1:BD1);ROW(1:28)/ROW(1:28))*(B1:AA1="June")*B2:AA462)

这是做什么的?它使用MMULT将461行和28列的矩阵转换为461行的向量,方法是将矩阵与28行的行向量相乘1.

因此,如果矩阵的每一行中有28列中的一列,那么也会有一个1作为461行的结果向量的行值。

示例:

enter image description here

H3中的公式:

=SUMPRODUCT(((A2:A7=G1)+(A2:A7=H1)+(A2:A7=I1)+(A2:A7=J1))*(B1:E1=G3)*B2:E7)

H4中的公式:

=SUMPRODUCT(MMULT(--(A2:A7=G1:J1),ROW(1:4)/ROW(1:4))*(B1:E1=G4)*B2:E7)

要完成,在SUMIF内使用SUMPRODUCT也会有一种方法,在我看来这是更好的方法。

所以H4中的公式将是:

=SUMPRODUCT(SUMIF(A2:A7,G1:J1,INDEX(B2:E7,0,MATCH(G5,B1:E1,0))))

您的公式将是:

=SUMPRODUCT(SUMIF(A2:A462,AC1:BD1,INDEX(B2:AA462,0,MATCH("June",B1:AA1,0))))