2016-04-18 35 views
0

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

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

+0

一些最近发布了一个问题,关于如何制作一个只包含符合标准的前三个事件的列表。我会按照他们在那篇文章中所做的来减少你的名单,然后你是否平均,如果日常工作。 –

+0

[这是该帖子](http://stackoverflow.com/questions/36612287/excel-keep-1st-three-rows-and-delete-rest-of-duplicates/36612693#comment60822229_36612693) –

回答

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键回车确认数组公式。如果做得正确,excel会在公式的周围放置{}

{1,2,3}表示从上到下的前三个。它可以改变为每个想要的东西,如前面的{1,2,3,4}

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

enter image description here

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