如何获取数据透视表中子字段的设置数据点中的最大数字?

时间:2017-12-22 13:04:16

标签: excel vba excel-vba pivot-table

在下面的截图中,我使用x来获得12.50%的" Short"在"一年级。"但是,我正在寻求对此进行扩展,以找到"一年级"字段并返回名称。在"一年级"例如,它将是" Tall"。

Sub PivotTest()

    Dim pvt As PivotTable: Set pvt = Sheets("Sheet2").PivotTables("PivotTable1")

    x = pvt.GetPivotData("Count Of Height", "Grade", "First Grade", "Height", pvt.PivotFields("First Grade").PivotItems(1)).Value

End Sub

数据透视表截图

enter image description here

2 个答案:

答案 0 :(得分:1)

所以你可以摆弄以下内容,但它会给你一个可以使用的形状。为任何打字错误道歉,因为我现在无法粘贴,因此无法粘贴。

GetMaxInfo子调用函数MaxHeightInfo,它将Grade作为参数,并返回一个数组,其中包含找到最大计数的高度描述,例如: “高大”,计数值本身。在函数调用之后,它们由(0)和(1)索引访问。

函数MaxHeightInfo使用GetPivotData函数检索指定Grade的信息,并将maxCount设置为它找到的最高值。它存储了在maxHeight变量中找到此值的高度描述。

Option Explicit

Public Sub GetMaxInfo()

    Msgbox MaxHeightInfo("First Grade")(0)
    Msgbox MaxHeightInfo("First Grade")(1)

    Msgbox MaxHeightInfo("Second Grade")(0)
    Msgbox MaxHeightInfo("Second Grade")(1)

End Sub

Public Function MaxHeightInfo(ByVal myGrade As String) As Variant

    Dim myHeight()
    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet2") 'change as appropriate

    Dim pvt As PivotTable

    Set pvt = ws.PivotTables("PivotTable1")

    myHeight = Array("Short","Average","Tall")

    Dim currHeight As Long
    Dim maxCount As Double
    Dim maxHeight As String

    maxCount = 0
    maxHeight = vbNullString

    Dim testVal As Double

    For currHeight = LBound(myHeight) To UBound(myHeight)

        testVal = pvt.GetPivotData("Count of Height"),"Grade", myGrade,"Height", myHeight(currHeight)).Value

        If testVal > maxCount Then
            maxCount = testVal
            maxHeight = myHeight(currHeight)
        End If

    Next currHeight

    MaxHeightInfo = Array(maxHeight, maxCount)
End Function

答案 1 :(得分:0)

我会通过几个步骤提供非VBA解决方案: 首先从enter image description here

切换数据透视表的视图

enter image description here

之后,您可以使用max if和索引匹配两个条件来解决它: 在示例中:

{=MAX(IF(H3:H8="First Grade";J3:J8))}     

=>此数组公式为您提供一年级的最大高度。 然后使用双重标准索引匹配,您可以搜索第一年级的最大高度:

{=INDEX(H3:J8;MATCH(1;(H3:H8="First Grade")*(J3:J8=*Cell of the maxIf*);0);2)}  

或整个公式更长:

{=INDEX(H3:J8;MATCH(1;(H3:H8="First Grade")*(J3:J8=MAX(IF(H3:H8="First Grade";J3:J8)));0);2)}

在我的Excel上运行得很好。我想人们可以很容易地适应VBA,但不会是最干净的。