找出额外条件下顶部和底部n%的平均值

时间:2015-12-16 10:59:16

标签: excel excel-vba excel-formula excel-udf vba

示例:

Part, Qty  
Book, 1  
Book, 2  
Book, 3  
Book, 4  
Book, 5  
Book, 6  
Book, 7  
Book, 8  
Book, 9  
Book, 10  
Pen, 4  
Pen, 7  

我试图计算B:B范围内前10%的书数量平均值 尝试使用基于以下内容的数组公式:

{=AVERAGE(IF(B:B>PERCENTILE(B:B,0.9),B:B))}  

当我试图使用数组公式时,我意识到我有很多数据,并且在添加新数据时需要花费大量时间进行计算。

这可以通过VBA中的用户定义函数来加速吗?

1 个答案:

答案 0 :(得分:1)

要隔离B列中与已排序的零件数据上的“预订”相关的值,您可以将B列中的单元格引用为:

INDEX(B:B, MATCH("book", A:A, 0):INDEX(B:B, MATCH("book", A:A)

要隔离B列中与未排序的 Part 数据的任何部分相关的值,您可以将B列中的单元格引用为:

B2:INDEX(B:B, MATCH("zzz", A:A)

这些范围将在添加新值时动态更新,但第一个范围仅在使用A列中的值时才准确。

已排序的标准公式

在下面的示例图像中,E4:F4中的标准公式为:

=PERCENTILE(INDEX(B:B, MATCH(D4,A:A, 0)):INDEX(B:B, MATCH(D4,A:A )), 0.9)
=AVERAGEIF(INDEX(B:B, MATCH(D4,A:A, 0)):INDEX(B:B, MATCH(D4,A:A  )), ">"&PERCENTILE(INDEX(B:B, MATCH(D4,A:A, 0)):INDEX(B:B, MATCH(D4,A:A )), 0.9))
'alternate standard formula for F4
=AVERAGEIF(INDEX(B:B, MATCH(D4,A:A, 0)):INDEX(B:B, MATCH(D4,A:A  )), ">"&E4)

根据需要填写。

Find average of top and bottom n percent of range with extra condition2
已分类的标准公式

数组¹未排序的公式

在下面的示例图像中,E10:F10中的数组公式为:

=PERCENTILE(IF(A$2:INDEX(A:A, MATCH("zzz",A:A ))=D10, B$2:INDEX(B:B, MATCH("zzz",A:A ))), 0.9)
=AVERAGEIFS(B:B,A:A, D10,B:B, ">"&PERCENTILE(IF(A$2:INDEX(A:A, MATCH("zzz",A:A ))=D10, B$2:INDEX(B:B, MATCH("zzz",A:A ))), 0.9))
'alternate standard formula for F10
=AVERAGEIFS(B:B,A:A, D10,B:B, ">"&E10)

Find average of top and bottom n percent of range with extra condition
未排序的数组公式

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