嵌套数组公式

时间:2015-12-30 17:21:23

标签: excel excel-formula array-formulas

我想要一个费率总和。让我解释一下:我想总结列D中与2个条件匹配的数字(excel中的绿色行)。第一个:列F等于“关闭”。第二个:C列等于那些与下列条件匹配的数字:F列等于“Partial Sold”。同时,先前总和中的每个数字可能除以列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

3 个答案:

答案 0 :(得分:3)

使用可以使用的数组公式一步完成:

books
  

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

它会生成一个二维数组,其中包含原始值作为行关闭,并将此1D数组除以:

  • 通过col C =转置col C
  • 构建2D阵列
  • 将每一行乘以col D
  • 如果不是" Partial Sold"
  • ,则将每行中的所有项目设置为0

对于每个div为0,db.allDocs({include_docs: true}).then(function(docs) { var highest; $.each(docs.rows, function() { var item = $(this)[0].doc if (highest == undefined || item.x > highest) { highest = item.x } }) map = function(doc, emit) { if (doc.x == highest) { emit([doc.x]) } } db.query(map, {include_docs: true}).then(function(result) { console.log(result) }) }) 将其设置为0
并且=SUM(IFERROR((D66:D86*(F66:F86="Closed"))/((C66:C86=TRANSPOSE(C66:C86))*TRANSPOSE(D66:D86*(F66:F86="Partial Sold"))),0)) 中的所有内容都会为您提供输出

enter image description here

答案 1 :(得分:2)

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

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

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

Excel

如果您确实不想使用辅助列,则可以将辅助列公式包装在SUM中,并替换阵列的各个单元格引用(即将F66交换为$F$66:$F$86,依此类推),然后将其作为数组公式输入,其中 Ctrl + Shift + Enter↵< / KBD>。整件事情看起来像这样:

=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))

答案 2 :(得分:1)

如果没有辅助列,我不会看到这样做。在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)), "")

根据需要填写。结果将是那些'帮助'数字的总和。

helper_sum_column

即使可以在单个公式中完成,计算开销也可能过高。将一部分数组计算拆分为一个辅助列,该列可以直接引用C列中的值进行另一次查找,从而显着降低了这一点。

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