4

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

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

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

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

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

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

试图瞄准高使用Position = 99会给我以下错误:

无法设置 PivotField 类的 Position 属性

请问有什么想法吗?

4

4 回答 4

5

PivotFields有一个计数属性。

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

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

  • 列字段
  • 数据字段
  • 隐藏字段
  • 页面字段
  • 行字段
  • 可见字段
于 2013-01-17T20:06:16.327 回答
2

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

With ActiveSheet.PivotTables("MyPivotTable").PivotFields("MyNewField")
    .Orientation = xlRowField
End With
于 2013-01-17T18:34:12.257 回答
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
于 2013-01-17T18:36:34.403 回答
1

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

pt.RowRange.cells.count

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

可以在此处找到有关如何引用可枢转范围的出色描述。

于 2013-01-17T19:23:11.123 回答