查找具有额外条件的范围的顶部和底部 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。
示例:
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。