Excel-将SUMPRODUCT公式概括为数组公式

时间:2018-08-23 15:11:25

标签: arrays excel performance excel-formula dot-product

尊敬的Stackoverflow成员,

由于某些MrExcel成员(link)的出色帮助,我创建了以下SUMPRODUCT公式。公式的目标是根据四个条件从大型查询表中选择结果:CATEGORY(类别),VALUE1(数字),VALUE2(数字),VALUE3(数字)。

输入数据

查找表如下所示: LOOKUPTABLE

希望的结果

我要制作的表如下所示: WISHED RESULT

当前解决方案

作为结果的公式,我使用以下内容(例如,左上角的结果单元格):

B8 = SUMPRODUCT(MAX(
(LOOKUPTABLE[CATEGORY]=$A8)
*(LOOKUPTABLE[VALUEFROM1]<=IF(B$2="";LOOKUPTABLE[VALUEFROM1];B$2))
*(LOOKUPTABLE[VALUETO1]>=IF(B$2="";LOOKUPTABLE[VALUETO1];B$2))
*(LOOKUPTABLE[VALUEFROM2]<=IF(B$3="";LOOKUPTABLE[VALUEFROM2];B$3))
*(LOOKUPTABLE[VALUETO2]>=IF(B$3="";LOOKUPTABLE[VALUETO2];B$3))
*(LOOKUPTABLE[VALUEFROM3]<=IF(B$4="";LOOKUPTABLE[VALUEFROM3];B$4))
*(LOOKUPTABLE[VALUETO3]>=IF(B$4="";LOOKUPTABLE[VALUETO3];B$4))
*(LOOKUPTABLE[RESULT])))

(此公式还说明了VALUE1或VALUE2或VALUE3可能为空的特殊情况)

这将产生以下结果: FINAL RESULT

大表是否有更好的解决方案?例如。数组公式?

这很好用,但是一旦我向结果表中添加了更多行(通过添加类别DP)并且向表中添加了更多列(约40个),并且我向查找表中添加了更多行(至30,000) ,这些公式变慢。因此,我想为整个结果表编写一个数组公式。如果这不可能,那么我很高兴每个类别可以有一个数组公式。

我尝试过的方法(失败的方式)

我尝试使用以下数组公式,但由于它返回N / A,因此无法正常运行:

{=SUMPRODUCT(MAX(
(Table35[CATEGORY]=$A8:$A10)
*(Table35[VALUEFROM1]<=IF(B$2:F$2="";Table35[VALUEFROM1];B$2:F$2))
*(Table35[VALUETO1]>=IF(B$2:F$2="";Table35[VALUETO1];B$2:F$2))
*(Table35[VALUEFROM2]<=IF(B$3:F$3="";Table35[VALUEFROM2];B$3:F$3))
*(Table35[VALUETO2]>=IF(B$3:F$3="";Table35[VALUETO2];B$3:F$3))
*(Table35[VALUEFROM3]<=IF(B$4:F$4="";Table35[VALUEFROM3];B$4:F$4))
*(Table35[VALUETO3]>=IF(B$4:F$4="";Table35[VALUETO3];B$4:F$4))
*(Table35[RESULT])))}

此外,我为每个类别尝试了以下数组公式,但是它不起作用,因为它为类别的整个行提供了相同的结果:

{=SUMPRODUCT(MAX(
(LOOKUPTABLE[CATEGORY]=$A8)
*(LOOKUPTABLE[VALUEFROM1]<=IF(B$2:F$2="";LOOKUPTABLE[VALUEFROM1];B$2:F$2))
*(LOOKUPTABLE[VALUETO1]>=IF(B$2:F$2="";LOOKUPTABLE[VALUETO1];B$2:F$2))
*(LOOKUPTABLE[VALUEFROM2]<=IF(B$3:F$3="";LOOKUPTABLE[VALUEFROM2];B$3:F$3))
*(LOOKUPTABLE[VALUETO2]>=IF(B$3:F$3="";LOOKUPTABLE[VALUETO2];B$3:F$3))
*(LOOKUPTABLE[VALUEFROM3]<=IF(B$4:F$4="";LOOKUPTABLE[VALUEFROM3];B$4:F$4))
*(LOOKUPTABLE[VALUETO3]>=IF(B$4:F$4="";LOOKUPTABLE[VALUETO3];B$4:F$4))
*(LOOKUPTABLE[RESULT])))}

您有建议吗?

您有什么想法,我该如何解决这个问题?

非常感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

在这种情况下,不需要使用SUMPRODUCTMAX,因为您只是从表中查找。我建议仅使用INDEX / MATCH方法,而不使用SUMPRODUCT

请参见下面的示例,我没有将其作为数据透视表,但是我仍然使用您的数据,并注意到我得到的结果与您相同。

请注意,这仍然是一个数组公式。不确定是否可以解决您的效率问题。可能会,但最重要的是您仍然需要检查很多条件。选择哪一行匹配的唯一方法是比较每列的条件以查看是否发生匹配。

enter image description here