Excel AverageIF功能:仅采用符合条件的前X行

时间:2016-04-18 01:00:15

标签: excel average

我有一列标准和一列数据值。我可以使用AverageIF excel函数来平均符合条件的数据值。但我想要做的是,除了这个标准之外,还有一个额外的控制 - 只取前三(X)行的平均值来满足标准。

这可能吗?我考虑过AverageIFS,但我不确定如何在第二个标准中包含“计数”或“第一个”或“顶部”功能。

2 个答案:

答案 0 :(得分:0)

试试这个数组公式:

=AVERAGE(IF(ROW($A$2:$A$20)=SMALL(IF($A$2:$A$20=1,ROW($A$2:$A$20)),{1,2,3}),$B$2:$B$20))

作为数组公式,需要使用Ctrl-Shift-Enter确认。如果正确完成,则会将{}放在公式周围。

{1,2,3}从上到下依次表示前三个。对于前4个,可以将其更改为{1,2,3,4}所需的内容。

我在这部分1中使用了$A$2:$A$20=1的标准,将1更改为您想要的任何内容。如果要将标准放在单元格内,也可以使用单元格引用。

enter image description here

答案 1 :(得分:0)

感谢大家的想法和帮助。最后我做了一个宏/函数来完成这项工作。 r是要查找match的范围,count确定有多少匹配结果(取自范围averagerange)到平均值。 Ascending参数尚未实现,但允许选择匹配值的方向(即,第一个/顶部X或最后一个/底部X)。 match过于简化,因为它只找到相等的值(不是<>!=等。如果count大于匹配数,则返回匹配值的平均值。

Public Function PF_AverageIF(r As range, match As Variant, averagerange As range, count As Long, Ascending As Boolean) As Double
    'Debug.Print ("PF_AverageIF called")
    'Debug.Print ("range = " & r.Address)
    'Debug.Print ("criteria = " & criteria)
    'Debug.Print ("averagerange = " & averagerange.Address)

    Dim i As Long
    Dim total As Double                 

    For Row = 1 To r.Rows.count
        'Debug.Print ("=>" & r(Row, 1))
        If (r(Row, 1).Value = match) Then
            'Debug.Print ("........" & averagerange(Row, 1))
            'Debug.Print ("^^^^")
            total = total + averagerange(Row, 1)
            i = i + 1
            If (count > 0) And (i = count) Then
                Exit For
            End If
        End If
    Next Row

    PF_AverageIF = total / i

End Function