【问题标题】:Excel VBA - How can I determine number of row label fields in Pivot Table?Excel VBA - 如何确定数据透视表中的行标签字段数?
【发布时间】:2013-01-01 08:41:02
【问题描述】:

我有一个 Excel 2010 数据透视表,最初包含 3 个行标签字段。

我需要创建一个宏,将某个字段添加为数据透视表中的最低行标签字段。 (由于我不会进入的原因,用户不能以正常方式自己添加此字段。)

但是,当用户运行此宏时,他们可能已经添加或删除了一些行标签。

当我在数据透视表的最低位置添加一个字段(已经选择了 3 个行标签)时,宏记录器会给我这个:

With ActiveSheet.PivotTables("MyPivotTable").PivotFields("MyNewField")
    .Orientation = xlRowField
    .Position = 4
End With

如果用户添加或删除了某些项目,则此位置编号 4 不正确。我如何将正确的位置编号传递给我的代码?

尝试使用Position = 99 瞄准高点会出现以下错误:

无法设置 PivotField 类的 Position 属性

有什么想法吗?

【问题讨论】:

    标签: excel excel-2010 pivot-table vba


    【解决方案1】:

    PivotFields 有一个 count 属性。

    With ActiveSheet.PivotTables("MyPivotTable").PivotFields("MyNewField")
        .Orientation = xlRowField
        .Position = ActiveSheet.PivotTables("MyPivotTable").PivotFields.Count + 1
    End With
    

    另外,除了PivotFields,您还可以替换其他选项来获得其他计数:

    • 列字段
    • 数据字段
    • 隐藏字段
    • 页面字段
    • 行字段
    • 可见字段

    【讨论】:

    • PivotFields.Count 为您提供总字段数,而不仅仅是显示的数:)
    • @SiddharthRout,添加了其他可用计数的信息
    • + 1 用于建议替代方法:)
    • 是的,你是对的。由于其他原因,我遇到了错误。我已经回滚了更改 :)
    • 我也删除了我的答案,因为你的答案比我的好:)
    【解决方案2】:

    尝试完全丢弃.Position = 4 字符串,即:

    With ActiveSheet.PivotTables("MyPivotTable").PivotFields("MyNewField")
        .Orientation = xlRowField
    End With
    

    【讨论】:

    • 谢谢彼得。这也有效,而且非常方便。但是,因为我还想知道当前使用了多少行标签,所以我勾选了 Sean 的答案。
    • @AndiMohr 没问题,你选择你最喜欢的那个)很高兴我的选择在某种程度上也很有用)
    【解决方案3】:

    蛮力解决方案:

    Public Function GetPivotFieldPos(pt As PivotTable, fieldName As String)
        Dim cnt As Integer
        Dim pos As Integer
        Dim pf As PivotField
    
        On Error GoTo ErrHandler
    
        cnt = 0   '  might be 1-based!?
        pos = -1
        For Each pf In pt.PivotFields
            cnt = cnt + 1
            If pf.Name = fieldName Then
                pos = cnt
                Exit For
            End If
        Next
    
        GetPivotFieldPos = pos
        Exit Function
    
    ErrHandler:
        GetPivotFieldPos = -1
        On Error GoTo 0
    End Function
    

    【讨论】:

    • 谢谢,我想知道我是否必须走这条路,但肖恩的回答是一个很好的解决方案。
    【解决方案4】:

    如果手头的任务是计算数据透视表中可能存在的行字段的数量,您应该喜欢这行代码:

    pt.RowRange.cells.count
    

    这将给出枢轴行的计数。但是,这将计算标题行和总行(如果总计应用于数据透视表)。因此,您需要根据您的情况减去 1 或 2。

    An excelent description of how to refer to pivottable ranges can be found here.

    【讨论】:

    • 谢谢廷伯。不完全是我所追求的,但感谢有用的链接。那里有很多方便的提示。好老乔恩·珀尔帖 :)
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2011-09-07
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多