【问题标题】:Nested array formulas嵌套数组公式
【发布时间】:2016-04-04 16:45:33
【问题描述】:

我想要一个费率的总和。让我解释一下:我想对 D 列中符合 2 个条件的数字求和(Excel 中的绿色行)。第一个:F 列等于“关闭”。第二个:C 列等于那些反过来符合以下条件的数字:F 列等于“部分售出”。同时,之前求和中的每个数字可能会除以与 F 列中的“部分出售”匹配的 D 列的数字。 我附上了表格/图的示例:(4510 / 9820) + (6500 / 9820) + (9100 / 15400) + (2388 / 2995) + (12400 / 9820) + (2904 / 5855)。 我的细胞是:(D69 / D66) + (D70 / D66) + (D76 / D74) + (D82 / D78) + (D83 / D66) + (D84 / D72)。

@Jeeped 与您的单元格将是:(D6 / D3) + (D7 / D3) + (D13 / D11) + (D19 / D15) + (D20 / D3) + (D21 / D9)

..     C      D        E           F

65     #     Total    Side    Condition
66     1     9820     Buy     Partial Sold
67     2     3850     Buy     Closed
68     3     7151     Buy     Partial Sold
69     1     4510     Sell    Closed
70     1     6500     Sell    Closed
71     4     8180     Buy     Open
72     5     5855     Buy     Partial Sold
73     6     2553     Buy     Open
74     7     15400    Buy     Partial Sold
75     2     4600     Sell    Closed
76     7     9100     Sell    Closed
77     8     7531     Buy     Open
78     9     2995     Buy     Partial Sold
79     3     3000     Sell    Closed
80     10    8691     Buy     Open
81     3     2500     Sell    Closed
82     9     2388     Sell    Closed
83     1     12400    Sell    Closed
84     5     2904     Sell    Closed
85     11    3848     Buy     Open
86     12    7745     Buy     Open

【问题讨论】:

  • 为了改进我们的答案,我们现在需要知道是否有可能多行保持相同的 # 和“部分已售出”,如果是,如何处理它们 :)

标签: excel excel-formula array-formulas


【解决方案1】:

要使用数组公式一步完成,您可以使用:

=SUM(IFERROR((D66:D86*(F66:F86="Closed"))/((C66:C86=TRANSPOSE(C66:C86))*TRANSPOSE(D66:D86*(F66:F86="Partial Sold"))),0))

这是一个数组公式,必须用Ctrl+Shift+Enter↵确认。

它会生成一个二维数组,将原始值保存为行,并将这个一维数组除以:

  • 通过 col C = transposed col C 构建二维数组
  • 每行乘以col D
  • 如果不是“部分售出”,则将每行中的所有项目设置为 0

对于每个 0 的 div,IFERROR 会将其设置为 0
SUM 中的所有内容都会为您提供输出

【讨论】:

  • 如果 OP 没有@Jeeped 回答中所述的AGGREGATE 功能,他会有IFERROR() 吗?
  • 我的公式版本:=SUM(IFERROR((F66:F86="Closed")*(D66:D86/SUMIFS(D66:D86,F66:F86,"Partial Sold",C66:C86,C66:C86)),0))
  • Scott,我确实有 iferror 功能。 Dirk,Brak 出色的解决方案。有时你需要一个能从 vos 中思考的人。我太沉迷于这个问题,甚至无法思考不同的问题。再次感谢!
  • 它是在我不知道他可能没有这样的功能时制作的。此外,我不建议使用更大的表格,因为它可能会冻结 excel 几秒钟到几分钟,甚至在为整个列完成时崩溃。 最好使用辅助列来拆分所有内容,就像提到的吉普车一样!
  • 是的,这是我的错。无论如何,感谢您完成问题和答案。然后为了防止崩溃,最好将其拆分。到目前为止,我将使用矩阵 foprmula。但现在的重点是,Dirk 或 Brak 解决方案哪个更有效?我知道结果是一样的,但他们甚至执行同样的事情吗?
【解决方案2】:

我也建议使用辅助列。不过,您不需要使用数组公式来获得答案。您可以在下一个可用列中使用以下内容:

=IF(F66="Closed",IFERROR(D66/SUMIFS($D$66:$D$86,$F$66:$F$86,"Partial Sold",$C$66:$C$86,C66),0),0)

这将为符合您的条件的所有内容返回值,为其他所有内容返回零。然后你可以把这个帮助列的总和作为你最终的费率总和。

如果您真的不想使用辅助列,您可以将辅助列公式包装在 SUM 中,并将单个单元格引用换出数组(即交换 F66 $F$66:$F$86 等),然后使用 Ctrl+Shift+Enter↵ 将其作为数组公式输入。整个事情看起来像这样:

=SUM(IF($F$66:$F$86="Closed",IFERROR($D$66:$D$86/SUMIFS($D$66:$D$86,$F$66:$F$86,"Partial Sold",$C$66:$C$86,$C$66:$C$86),0),0))

【讨论】:

    【解决方案3】:

    如果没有帮助列,我看不到这样做。在 F66 右侧未使用的列中,放入此数组¹ 公式。

    =IF(AND(OR(C66=INDEX(C$66:C$86*(F$66:F$86="Partial Sold"), , )), F66="Closed"), D66/INDEX(D$66:D$86, AGGREGATE(15, 6, ROW($1:$21)/((C$66:C$86=C66)*(F$66:F$86="Partial Sold")), 1)), "")
    

    根据需要填写。结果将是这些“帮助”数字的总和。

            

    即使这可以在单个公式中完成,计算开销也可能会令人望而却步。将数组计算的一部分拆分到辅助列中,该辅助列可以直接引用 C 列中的值以进行另一次查找,从而显着减少了这种情况。


    ¹ 数组公式需要使用 Ctrl+Shift+Enter↵ 完成。一旦正确输入第一个单元格,它们就可以像任何其他公式一样被填充或向下或向右复制。尝试将全列引用减少到更接近代表实际数据范围的范围。数组公式以对数方式消耗计算周期,因此最好将引用范围缩小到最小值。更多信息请参见Guidelines and examples of array formulas

    【讨论】:

    • 由于我的 Excel 版本有点旧,我没有有用的功能 AGGREGATE。让我问你,如果我用这个公式代替你的有什么区别? =IF(AND(OR(C66=INDEX(C$66:C$86*(F$66:F$86="Partial Sold"),,)),F66="Closed"),D66/SUMIFS(D$66:D$86,C$66:C$86,C66,F$66:F$86,"Partial Sold"),"")我希望现在格式化没问题...
    • 如果没有帮助列,我看不到这是完成的。 -> 挑战完成 :P
    猜你喜欢
    • 2022-01-12
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多