查找具有额外条件的范围的顶部和底部 n% 的平均值

Find average of top and bottom n percent of range with extra condition

示例:

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 中的用户定义函数来加快速度吗?

要在排序的 Part 数据上隔离与 'book' 相关的 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)

根据需要填写。


已排序的标准公式

未排序的数组¹ 公式

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

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


未排序数组公式


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