特定枢轴字段

时间:2015-05-22 20:06:37

标签: excel vba excel-vba excel-formula average

我有一个表,其中在一列中我有分配给特殊硬件模型的值。该表如下所示:

Screenshot

我们需要找到该表中每个模型的平均三个最高数字,例如:

我们有一个模型22PFx4109,我们需要从分配给它的值中获得平均三个最高数字。因此对于22PFx4109,它将是average(278,279,289)。然后我们需要为每个其他模型做这件事。结果必须显示在每个模型值列表的末尾,因此它将显示在289值的右侧。

我没能写出能够做到这一点的功能。你能用VBA帮助我吗?或者也许仅使用一个函数可以做到这一点?

4 个答案:

答案 0 :(得分:1)

对于公式解决方案,如果包含"OUTPUT"的单元格为C3,则应将以下公式放入D4并向下粘贴。

=IF(C4="","",IF(C5<>"","",IF(C3="",C4,AVERAGE(C2:C4))))

只有当您的前3个值位于每个组(模型)的底部时,这才有效。

答案 1 :(得分:0)

试试这个公式:

AVERAGE(OFFSET(E1,COUNTA(E:E)-3,0,3,1))

在我的例子中,在E1中我有列的标题,并且在该列的最后一个值之后没有值(使用counta)

答案 2 :(得分:0)

看到您的数据透视表我创建了一个非常相似的数据库。

以下sub适用于我,我相信它也适合您:)

Sub Average_Top3()

    Const top As Byte = 3
    Dim pi As PivotItem
    Dim pi2 As PivotItem
    Dim i As Byte
    Dim vSUM As Variant
    Dim dAVG As Double
    Dim rng As Range

    With ActiveSheet.PivotTables(1)
        For Each pi In .PivotFields("WORK_DATE").PivotItems
            For Each pi2 In .PivotFields("ID_MODELU").PivotItems
                Set rng = Intersect(pi.DataRange, pi2.DataRange)
                If Not rng Is Nothing Then
                    dAVG = 0
                    vSUM = 0
                    For i = 1 To top
                        vSUM = vSUM + Application.WorksheetFunction.Large(rng, i)
                    Next
                    dAVG = Round(vSUM / top, 2)
                    rng.Cells(rng.Rows.Count).Offset(0, 1).Value2 = dAVG
                    Set rng = Nothing
                End If
            Next
        Next
    End With

End Sub

即使你的前三个值不在每个组(模型)的底部,这个子组仍然可以工作。

答案 3 :(得分:-1)

您还可以尝试以下公式:

=AVERAGE(LARGE(C:C,1),LARGE(C:C,2),LARGE(C:C,3))