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

时间:2013-01-17 18:05:41

标签: excel excel-vba excel-2010 pivot-table vba

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

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

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

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

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

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

尝试使用Position = 99瞄准目标时出现以下错误:

  

无法设置PivotField类的Position属性

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

PivotFields有一个计数属性。

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

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

  • ColumnFields
  • DataFields
  • HiddenFields
  • PageFields
  • RowFields
  • VisibleFields

答案 1 :(得分:2)

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

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

答案 2 :(得分: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

答案 3 :(得分:1)

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

pt.RowRange.cells.count

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

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