如何用多个搜索和字典求和
How to sumproduct with multiple search and dictionary
我想计算 sumproduct
,如 "Revenue" 列中的 table 所示。但是,数据集相当大,我仅限于 excel 和标准函数。
它应该找到其中包含关键字 "weightl" 和 "sell" 的所有变量,并相应地每行相乘和求和。例如在第 3 行:
2*3+3*6+2*3 = 30
我想到了使用一种字典来更改搜索词并浏览每一列。但我不知道如何把它们放在一起。
我用过这个
{=+isnumber(search("weightl";F2:N2))+isnumber(search("sell";F2:N2))}
创建原始版本的 1/0 table,希望这能将我带到某个地方
和
=SUM(IF(IFERROR(SEARCH("weight";G2:M2);0)>0;IF(G3:M8<>8888;G3:M8)))
计算权重值的总和,但这在这里没有多大帮助
用普通函数也能实现吗?如果不是,VBA 中的解决方案会是什么样子?
这里有一个公式,应该按照您的想法进行匹配:
=SUM(A2:I2*ISNUMBER(FIND("weight",A1:I1))*IFERROR(INDEX(A2:I2,N(IF({1},MATCH("*sell"&RIGHT(A1:I1,LEN(A1:I1)-FIND("weightl",A1:I1)-6),A1:I1,0)))),0))
必须使用CtrlShiftEnter[=12=作为数组公式输入]
注意 我正在找到与 'weightl' header 匹配的 'sell' header,所以 weightl1_1_4 将与 sell1_1_4 等相匹配,但我现在想知道这是否有必要 - 也许重量与下一次销售相匹配,这会更容易。
如果您的 "weight" 和 "sell" 列始终相隔两列,那么您可以使用此 array 公式来查找 "weight" 列,然后将其乘以右侧第 2 列的单元格:
hdrs
指的是范围$A:$I
,其中包含headers。但它可以指整行,或第 1 行的大部分
=SUM(IFERROR(SEARCH("*weight*",hdrs)*A2:G2,0) * IFERROR(SEARCH("*weight*",hdrs)*C2:I2,0))
如果 "weight" 和 "sell" 之间的列数可变,那么您可以尝试使用此 array 公式来查找 "weight" 和 "sell" 列分开:
=SUM(INDEX(A2:I2,1,N(IF(1,AGGREGATE(15,6,SEARCH("*weight*",hdrs)*COLUMN(hdrs),ROW(INDIRECT("1:"&COUNTIF(hdrs,"*weight*")))))))*INDEX(A2:I2,1,N(IF(1,AGGREGATE(15,6,SEARCH("*sell*",hdrs)*COLUMN(hdrs),ROW(INDIRECT("1:"&COUNTIF(hdrs,"*weight*"))))))))
因为这是一个数组公式,你需要 "confirm" 按住 ctrl + shift 的同时点击 输入。如果您正确执行此操作,Excel 将在公式周围放置大括号 {...}
,如在公式栏
中观察到的那样
注意我刚刚注意到你想要匹配"weight1",所以只需对上面的公式进行明显的更改即可。
我想计算 sumproduct
,如 "Revenue" 列中的 table 所示。但是,数据集相当大,我仅限于 excel 和标准函数。
它应该找到其中包含关键字 "weightl" 和 "sell" 的所有变量,并相应地每行相乘和求和。例如在第 3 行:
2*3+3*6+2*3 = 30
我想到了使用一种字典来更改搜索词并浏览每一列。但我不知道如何把它们放在一起。
我用过这个
{=+isnumber(search("weightl";F2:N2))+isnumber(search("sell";F2:N2))}
创建原始版本的 1/0 table,希望这能将我带到某个地方
和
=SUM(IF(IFERROR(SEARCH("weight";G2:M2);0)>0;IF(G3:M8<>8888;G3:M8)))
计算权重值的总和,但这在这里没有多大帮助
用普通函数也能实现吗?如果不是,VBA 中的解决方案会是什么样子?
这里有一个公式,应该按照您的想法进行匹配:
=SUM(A2:I2*ISNUMBER(FIND("weight",A1:I1))*IFERROR(INDEX(A2:I2,N(IF({1},MATCH("*sell"&RIGHT(A1:I1,LEN(A1:I1)-FIND("weightl",A1:I1)-6),A1:I1,0)))),0))
必须使用CtrlShiftEnter[=12=作为数组公式输入]
注意 我正在找到与 'weightl' header 匹配的 'sell' header,所以 weightl1_1_4 将与 sell1_1_4 等相匹配,但我现在想知道这是否有必要 - 也许重量与下一次销售相匹配,这会更容易。
如果您的 "weight" 和 "sell" 列始终相隔两列,那么您可以使用此 array 公式来查找 "weight" 列,然后将其乘以右侧第 2 列的单元格:
hdrs
指的是范围$A:$I
,其中包含headers。但它可以指整行,或第 1 行的大部分
=SUM(IFERROR(SEARCH("*weight*",hdrs)*A2:G2,0) * IFERROR(SEARCH("*weight*",hdrs)*C2:I2,0))
如果 "weight" 和 "sell" 之间的列数可变,那么您可以尝试使用此 array 公式来查找 "weight" 和 "sell" 列分开:
=SUM(INDEX(A2:I2,1,N(IF(1,AGGREGATE(15,6,SEARCH("*weight*",hdrs)*COLUMN(hdrs),ROW(INDIRECT("1:"&COUNTIF(hdrs,"*weight*")))))))*INDEX(A2:I2,1,N(IF(1,AGGREGATE(15,6,SEARCH("*sell*",hdrs)*COLUMN(hdrs),ROW(INDIRECT("1:"&COUNTIF(hdrs,"*weight*"))))))))
因为这是一个数组公式,你需要 "confirm" 按住 ctrl + shift 的同时点击 输入。如果您正确执行此操作,Excel 将在公式周围放置大括号 {...}
,如在公式栏
注意我刚刚注意到你想要匹配"weight1",所以只需对上面的公式进行明显的更改即可。