Excel - 将 SUMPRODUCT 公式概括为数组公式
Excel - Generalizing a SUMPRODUCT formula as an array formula
亲爱的 Whosebug 会员,
感谢一些 MrExcel 成员 (link) 的大力帮助,我创建了以下 SUMPRODUCT 公式。该公式的目标是 select 基于四个条件的大型查找 table 结果:CATEGORY(分类)、VALUE1(数字)、VALUE2(数字)、VALUE3(数字)。
输入数据
查找 table 如下所示:
LOOKUPTABLE
希望的结果
我正在尝试制作的 table 如下所示:
WISHED RESULT
当前解
作为结果的公式,我使用以下公式(例如,对于左上角的结果单元格):
B8 = SUMPRODUCT(MAX(
(LOOKUPTABLE[CATEGORY]=$A8)
*(LOOKUPTABLE[VALUEFROM1]<=IF(B="";LOOKUPTABLE[VALUEFROM1];B))
*(LOOKUPTABLE[VALUETO1]>=IF(B="";LOOKUPTABLE[VALUETO1];B))
*(LOOKUPTABLE[VALUEFROM2]<=IF(B="";LOOKUPTABLE[VALUEFROM2];B))
*(LOOKUPTABLE[VALUETO2]>=IF(B="";LOOKUPTABLE[VALUETO2];B))
*(LOOKUPTABLE[VALUEFROM3]<=IF(B="";LOOKUPTABLE[VALUEFROM3];B))
*(LOOKUPTABLE[VALUETO3]>=IF(B="";LOOKUPTABLE[VALUETO3];B))
*(LOOKUPTABLE[RESULT])))
(此公式还考虑了 VALUE1 或 VALUE2 或 VALUE3 可能为空的特殊情况)
结果如下:
FINAL RESULT
大table有更好的解决方案吗?例如。数组公式?
这很好用,但是一旦我向结果 table 添加更多行(通过添加类别 D-P),我向 table 添加更多列(大约 40),然后我添加更多行到查找 table(直到 30,000),这些公式变得更慢。因此,我想为整个结果 table 编写一个数组公式。如果这不可能,那么如果我可以为每个类别提供一个数组公式,我会很高兴。
我尝试了什么(我是如何失败的)
我尝试使用下面的数组公式,但它并没有像我希望的那样工作,因为它 returns N/A:
{=SUMPRODUCT(MAX(
(Table35[CATEGORY]=$A8:$A10)
*(Table35[VALUEFROM1]<=IF(B:F="";Table35[VALUEFROM1];B:F))
*(Table35[VALUETO1]>=IF(B:F="";Table35[VALUETO1];B:F))
*(Table35[VALUEFROM2]<=IF(B:F="";Table35[VALUEFROM2];B:F))
*(Table35[VALUETO2]>=IF(B:F="";Table35[VALUETO2];B:F))
*(Table35[VALUEFROM3]<=IF(B:F="";Table35[VALUEFROM3];B:F))
*(Table35[VALUETO3]>=IF(B:F="";Table35[VALUETO3];B:F))
*(Table35[RESULT])))}
此外,我为每个类别尝试了以下数组公式,但它不起作用,因为它对类别的整行给出了相同的结果:
{=SUMPRODUCT(MAX(
(LOOKUPTABLE[CATEGORY]=$A8)
*(LOOKUPTABLE[VALUEFROM1]<=IF(B:F="";LOOKUPTABLE[VALUEFROM1];B:F))
*(LOOKUPTABLE[VALUETO1]>=IF(B:F="";LOOKUPTABLE[VALUETO1];B:F))
*(LOOKUPTABLE[VALUEFROM2]<=IF(B:F="";LOOKUPTABLE[VALUEFROM2];B:F))
*(LOOKUPTABLE[VALUETO2]>=IF(B:F="";LOOKUPTABLE[VALUETO2];B:F))
*(LOOKUPTABLE[VALUEFROM3]<=IF(B:F="";LOOKUPTABLE[VALUEFROM3];B:F))
*(LOOKUPTABLE[VALUETO3]>=IF(B:F="";LOOKUPTABLE[VALUETO3];B:F))
*(LOOKUPTABLE[RESULT])))}
你有什么建议吗?
你有什么想法,我该如何解决这个问题?
非常感谢您提出任何建议!
在这种情况下不需要使用 SUMPRODUCT
和 MAX
,因为您只是从 table 中查找。我建议仅使用 INDEX
/MATCH
方法而不使用 SUMPRODUCT
.
请参阅下面的示例,我没有将其作为基准 table 但我仍然使用了您的数据并注意到我得到了与您相同的结果。
请注意,这仍然是一个数组公式。不确定这是否会解决您的效率问题。可能是这样,但底线是您仍然有很多条件需要检查。选择哪一行匹配的唯一方法是比较每列的条件以查看是否出现匹配。
亲爱的 Whosebug 会员,
感谢一些 MrExcel 成员 (link) 的大力帮助,我创建了以下 SUMPRODUCT 公式。该公式的目标是 select 基于四个条件的大型查找 table 结果:CATEGORY(分类)、VALUE1(数字)、VALUE2(数字)、VALUE3(数字)。
输入数据
查找 table 如下所示: LOOKUPTABLE
希望的结果
我正在尝试制作的 table 如下所示: WISHED RESULT
当前解
作为结果的公式,我使用以下公式(例如,对于左上角的结果单元格):
B8 = SUMPRODUCT(MAX(
(LOOKUPTABLE[CATEGORY]=$A8)
*(LOOKUPTABLE[VALUEFROM1]<=IF(B="";LOOKUPTABLE[VALUEFROM1];B))
*(LOOKUPTABLE[VALUETO1]>=IF(B="";LOOKUPTABLE[VALUETO1];B))
*(LOOKUPTABLE[VALUEFROM2]<=IF(B="";LOOKUPTABLE[VALUEFROM2];B))
*(LOOKUPTABLE[VALUETO2]>=IF(B="";LOOKUPTABLE[VALUETO2];B))
*(LOOKUPTABLE[VALUEFROM3]<=IF(B="";LOOKUPTABLE[VALUEFROM3];B))
*(LOOKUPTABLE[VALUETO3]>=IF(B="";LOOKUPTABLE[VALUETO3];B))
*(LOOKUPTABLE[RESULT])))
(此公式还考虑了 VALUE1 或 VALUE2 或 VALUE3 可能为空的特殊情况)
结果如下: FINAL RESULT
大table有更好的解决方案吗?例如。数组公式?
这很好用,但是一旦我向结果 table 添加更多行(通过添加类别 D-P),我向 table 添加更多列(大约 40),然后我添加更多行到查找 table(直到 30,000),这些公式变得更慢。因此,我想为整个结果 table 编写一个数组公式。如果这不可能,那么如果我可以为每个类别提供一个数组公式,我会很高兴。
我尝试了什么(我是如何失败的)
我尝试使用下面的数组公式,但它并没有像我希望的那样工作,因为它 returns N/A:
{=SUMPRODUCT(MAX(
(Table35[CATEGORY]=$A8:$A10)
*(Table35[VALUEFROM1]<=IF(B:F="";Table35[VALUEFROM1];B:F))
*(Table35[VALUETO1]>=IF(B:F="";Table35[VALUETO1];B:F))
*(Table35[VALUEFROM2]<=IF(B:F="";Table35[VALUEFROM2];B:F))
*(Table35[VALUETO2]>=IF(B:F="";Table35[VALUETO2];B:F))
*(Table35[VALUEFROM3]<=IF(B:F="";Table35[VALUEFROM3];B:F))
*(Table35[VALUETO3]>=IF(B:F="";Table35[VALUETO3];B:F))
*(Table35[RESULT])))}
此外,我为每个类别尝试了以下数组公式,但它不起作用,因为它对类别的整行给出了相同的结果:
{=SUMPRODUCT(MAX(
(LOOKUPTABLE[CATEGORY]=$A8)
*(LOOKUPTABLE[VALUEFROM1]<=IF(B:F="";LOOKUPTABLE[VALUEFROM1];B:F))
*(LOOKUPTABLE[VALUETO1]>=IF(B:F="";LOOKUPTABLE[VALUETO1];B:F))
*(LOOKUPTABLE[VALUEFROM2]<=IF(B:F="";LOOKUPTABLE[VALUEFROM2];B:F))
*(LOOKUPTABLE[VALUETO2]>=IF(B:F="";LOOKUPTABLE[VALUETO2];B:F))
*(LOOKUPTABLE[VALUEFROM3]<=IF(B:F="";LOOKUPTABLE[VALUEFROM3];B:F))
*(LOOKUPTABLE[VALUETO3]>=IF(B:F="";LOOKUPTABLE[VALUETO3];B:F))
*(LOOKUPTABLE[RESULT])))}
你有什么建议吗?
你有什么想法,我该如何解决这个问题?
非常感谢您提出任何建议!
在这种情况下不需要使用 SUMPRODUCT
和 MAX
,因为您只是从 table 中查找。我建议仅使用 INDEX
/MATCH
方法而不使用 SUMPRODUCT
.
请参阅下面的示例,我没有将其作为基准 table 但我仍然使用了您的数据并注意到我得到了与您相同的结果。
请注意,这仍然是一个数组公式。不确定这是否会解决您的效率问题。可能是这样,但底线是您仍然有很多条件需要检查。选择哪一行匹配的唯一方法是比较每列的条件以查看是否出现匹配。