特定数据透视字段中前 3 个值的平均值
Average of top 3 values within a specific pivot field
我有一个 table,其中一列中有分配给特殊硬件型号的值。 table 看起来像这样:
我们需要找到每个模型中三个最高数字的平均值 table,例如:
我们有一个模型 22PFx4109
,我们需要从分配给它的值中获取三个最高数字的平均值。所以对于 22PFx4109
它将是 average(278,279,289)
。然后我们需要为每个其他模型做它。结果必须显示在每个模型值列表的末尾,因此这里它将显示在 289
值的右侧。
我未能编写能够做到这一点的函数。你能用 VBA 帮我解决这个问题吗?或者也许只用一个函数就可以做到?
试试这个公式:
AVERAGE(OFFSET(E1,COUNTA(E:E)-3,0,3,1))
在我的示例中,在 E1 中,我的列有 header,并且在该列的最后一个值之后没有值(使用计数)
您也可以试试下面的公式:
=AVERAGE(LARGE(C:C,1),LARGE(C:C,2),LARGE(C:C,3))
看到你的支点table我创建了一个非常相似的。
以下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 个值不在每个组(模型)的底部,此子项仍然有效。
关于公式解,如果"OUTPUT"
的单元格是C3
,下面的公式要放在D4
里,往下粘贴。
=IF(C4="","",IF(C5<>"","",IF(C3="",C4,AVERAGE(C2:C4))))
这仅在您的前 3 个值位于每个组(模型)的底部时才有效。
我有一个 table,其中一列中有分配给特殊硬件型号的值。 table 看起来像这样:
我们需要找到每个模型中三个最高数字的平均值 table,例如:
我们有一个模型 22PFx4109
,我们需要从分配给它的值中获取三个最高数字的平均值。所以对于 22PFx4109
它将是 average(278,279,289)
。然后我们需要为每个其他模型做它。结果必须显示在每个模型值列表的末尾,因此这里它将显示在 289
值的右侧。
我未能编写能够做到这一点的函数。你能用 VBA 帮我解决这个问题吗?或者也许只用一个函数就可以做到?
试试这个公式:
AVERAGE(OFFSET(E1,COUNTA(E:E)-3,0,3,1))
在我的示例中,在 E1 中,我的列有 header,并且在该列的最后一个值之后没有值(使用计数)
您也可以试试下面的公式:
=AVERAGE(LARGE(C:C,1),LARGE(C:C,2),LARGE(C:C,3))
看到你的支点table我创建了一个非常相似的。
以下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 个值不在每个组(模型)的底部,此子项仍然有效。
关于公式解,如果"OUTPUT"
的单元格是C3
,下面的公式要放在D4
里,往下粘贴。
=IF(C4="","",IF(C5<>"","",IF(C3="",C4,AVERAGE(C2:C4))))
这仅在您的前 3 个值位于每个组(模型)的底部时才有效。