Excel 透视表顶层的计数函数

Excel 透视表顶层的计数函数,excel,excel-formula,pivot-table,Excel,Excel Formula,Pivot Table,我有一个透视表,如下所示: 我想编写一个函数,计算透视表最高级别(即a、B、C和D)中的条目数。我可以编写哪些Excel函数来生成此透视表的结果4 谢谢 使用数据透视表字段(PivotFields)的关键在于,有几个条件需要检查,以确保您正在处理所需的条件。在本例中,您希望确保查看的字段是行,并且位于第一个位置(顶层) 我有一整套公共数据透视表函数,这些函数公开了这些类型的检查,以便于我进行操作。我用其中两个来向你展示你问题的解决方案 Option Explicit Public Funct

我有一个透视表,如下所示:

我想编写一个函数,计算透视表最高级别(即a、B、C和D)中的条目数。我可以编写哪些Excel函数来生成此透视表的结果4


谢谢

使用数据透视表字段(
PivotFields
)的关键在于,有几个条件需要检查,以确保您正在处理所需的条件。在本例中,您希望确保查看的字段是
,并且位于第一个位置(顶层)

我有一整套公共数据透视表函数,这些函数公开了这些类型的检查,以便于我进行操作。我用其中两个来向你展示你问题的解决方案

Option Explicit

Public Function TopLevelRows() As Long
    Dim thisWS As Worksheet
    Dim thisPT As PivotTable
    Set thisWS = ThisWorkbook.Sheets("Sheet1")
    Set thisPT = thisWS.PivotTables(1)

    Dim numberOfTopLevelRows As Long
    numberOfTopLevelRows = 0

    Dim pField As PivotField
    For Each pField In thisPT.PivotFields
        If PivotFieldIsRow(thisPT, pField.Name) And _
          (PivotFieldPosition(thisPT, pField.Name) = 1) Then
            '--- there will only be one of these, so iterate on the items
            Dim pItem As PivotItem
            '--- we can't assume that the .Count equals the number of
            '    items because there may be a "(blank)" entry
            'Debug.Print "count = " & pField.PivotItems.count
            For Each pItem In pField.PivotItems
                If pItem.Caption <> "(blank)" Then
                    numberOfTopLevelRows = numberOfTopLevelRows + 1
                End If
            Next pItem
        End If
    Next pField

    Debug.Print "there are " & numberOfTopLevelRows & " top level rows in the pivot table"
    TopLevelRows = numberOfTopLevelRows 'return value
End Function

Private Function PivotFieldIsRow(ByRef pTable As PivotTable, _
                                 ByVal ptFieldName As String) As Boolean
    Dim field As PivotField
    PivotFieldIsRow = False
    For Each field In pTable.RowFields
        If field.Name = ptFieldName Then
            PivotFieldIsRow = True
            Exit Function
        End If
    Next field
End Function

Private Function PivotFieldPosition(ByRef pTable As PivotTable, _
                                    ByVal ptFieldName As String) As Long
    Dim field As PivotField
    PivotFieldPosition = 0
    For Each field In pTable.PivotFields
        If field.Name = ptFieldName Then
            If TypeName(field.position) = "Error" Then
                '--- we'll get an error if the field is not included as a
                '    row or column. this isn't a problem, but there's no
                '    real position in this case, so return 0
            Else
                PivotFieldPosition = field.position
            End If
            Exit Function
        End If
    Next field
End Function
选项显式
公共函数TopLevelRows()的长度为
将此WS设置为工作表
将thisPT设置为数据透视表
设置thisWS=ThisWorkbook.Sheets(“Sheet1”)
Set thisPT=thisWS.PivotTables(1)
变暗TopLevelRows的数量与长度相同
numberOfTopLevelRows=0
作为数据透视字段的Dim pField
对于此PT.PivotFields中的每个pField
如果PivotFieldIsRow(thisPT,pField.Name)和_
(PivotFieldPosition(thisPT,pField.Name)=1)然后
'---其中只有一项,因此请迭代这些项
作为数据透视项的Dim pItem
“---我们不能假设.Count等于
'项目,因为可能有一个“(空白)”条目
'Debug.Print“count=“&pField.PivotItems.count
对于pField.PivotItems中的每个pItem
如果pItem.Caption“(空白)”则
numberOfTopLevelRows=numberOfTopLevelRows+1
如果结束
下一个坑
如果结束
下一个普菲尔德
调试。打印“透视表中有”&numberOfTopLevelRows&“顶级行”
TopLevelRows=numberOfTopLevelRows的返回值
端函数
私有函数PivotFieldIsRow(ByRef pTable作为数据透视表_
ByVal ptFieldName(作为字符串)作为布尔值
作为数据透视字段的Dim字段
PivotFieldIsRow=False
对于pTable.RowFields中的每个字段
如果field.Name=ptFieldName,则
PivotFieldIsRow=True
退出功能
如果结束
下一场
端函数
专用函数PivotFieldPosition(ByRef pTable作为数据透视表_
ByVal ptFieldName(作为字符串)长度相同
作为数据透视字段的Dim字段
PivotFieldPosition=0
对于pTable.PivotFields中的每个字段
如果field.Name=ptFieldName,则
如果TypeName(field.position)=“Error”,则
“---如果该字段未包含为
'行或列。这不是问题,但没有问题
'在本例中为实际位置,因此返回0
其他的
PivotFieldPosition=字段位置
如果结束
退出功能
如果结束
下一场
端函数

现在在单元格A30中写入公式
=TopLevelRows()
,您应该会得到结果。

只需将第二个字段完全从数据透视表中拖出,将第一个字段从行区域拖动到值区域,如果它是文本字段,您将自动获得字段数的计数。(否则,将聚合从SUM更改为COUNT)


谢谢@PeterT!请原谅我的无知,但我如何利用此函数在Excel工作簿的单元格中生成4的计数值?再次感谢!感谢@PeterT提供更多详细信息;然而,我认为我没有正确地提出我的问题。让我再试一次,如果我想在单元格A30中写一个公式,我需要写什么函数才能在该单元格中生成4的结果?希望这能澄清我的问题!据我所知,没有一个现有的Excel函数可以为您提供所需的结果。我稍微修改了代码,将计数
Sub
转换为
函数
(这使其成为一个自定义函数)。将您的电子表格另存为启用宏的电子表格,这将起作用。非常感谢您提供更多信息@PeterT。我尝试将其添加到电子表格中,并将工作簿保存为启用了宏,但
=TopLevelRows()
公式会产生一个#名称?输入单元格A30时出错。思考我可能做错了什么?我的代码中有一个错误。对于
TopLevelRows
例程,它应该以
end Function
而不是
end Sub
结束。如果你改变这一点,它应该会起作用(对我来说效果很好);但是,我应该更好地表达我的问题,因为这个层次化数据透视表是仪表板的一部分,并且最高级别的计数需要在单独的单元格中,以便随时向最终用户显示。感谢您的贡献。很好:将GETPIVOTDATA与上述方法结合使用,并使用切片器将两个数据透视表连接在一起,以便在有人筛选主“显示”数据透视表时,字段同步。