首页 文章

Excel VBA - 如何确定数据透视表中的行标签字段数?

提问于
浏览
4

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

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

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

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

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

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

尝试使用 Position = 99 瞄准高,给出了以下错误:

无法设置PivotField类的Position属性

有什么想法吗?

4 回答

  • 5

    PivotFields 有一个count属性 .

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

    此外,您可以替换其他选项来代替 PivotFields ,以便为您提供其他计数:

    • ColumnFields

    • DataFields

    • HiddenFields

    • PageFields

    • RowFields

    • VisibleFields

  • 2

    试着完全抛弃 .Position = 4 字符串,即:

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

    蛮力解决方案:

    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
    
  • 1

    如果手头的任务是计算pivottable中可能存在的行域数,您应该享受以下代码:

    pt.RowRange.cells.count
    

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

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

相关问题