无法设置PivotItem类(VBA)的Visible属性

时间:2012-07-13 10:28:50

标签: excel vba excel-vba pivot-table

我正在尝试通过VBA操作Excel 2007数据透视表,以便我可以循环使用数据透视表的类别,将all设置为不可见但只有一个,将工作表另存为pdf并继续下一个类别。为此,我使用以下代码。

Dim pf As PivotField
Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("NAME")

Dim pi as PivotItem
For Each pi In pf.PivotItems

    If pi.Visible = False Then
        pi.Visible = True 'Error here
    End If

    Dim pi2 As PivotItem
    For Each pi2 In pf.PivotItems
        If pi2 <> pi Then
            pi2.Visible = False
        End If
    Next pi2

    'Saving to PDF goes here
Next pi

循环似乎是第一次工作。取消选择每个类别,但第一个类别输出一个漂亮的PDF文件。下次进入循环时,它会在指定的行给出“无法设置PivotItem类的Visible属性”错误。我知道在数据透视表中必须至少选择一个项目,但这不是问题,因为我试图将可见性设置为TRUE而不是FALSE。

我尝试通过检查它来修复它,因为可能你不允许将已经可见的PivotItem设置为可见,但这似乎不起作用。

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:7)

这是由于数据透视表使用缓存的透视项而不是当前透视项。确保表格不保留任何旧项目。要执行此操作,请右键单击数据透视表,单击“数据”选项卡,然后将“每个字段保留的数量”设置为“无”。在VBA中执行此操作的代码是:

Dim pt As PivotTable

pt.PivotCache.MissingItemsLimit = xlMissingItemsNone

答案 1 :(得分:3)

我意识到这已经过时了,但希望为那些寻求未来解决方案的人做出贡献。

我遇到了同样的错误,我提出的解决方案就是在开始你的pivotitem循环之前刷新pivottable。

尝试以下代码行:

ActiveSheet.PivotTables("PivotTable1").RefreshTable

答案 2 :(得分:0)

检查PivotItem的方向。我相信如果Orientation是xlHidden,你不能将Visible设置为True。如果就是这样,那么只需先将方向更改为其他内容。

答案 3 :(得分:0)

可能存在下列情况之一:

  • 您需要至少一个可见的PivotItem,并且您将它们全部设置为隐藏
  • PivotField的Orientation == XlPivotFieldOrientation.xlHidden(0)
  • PivotField的AutoSortOrder!= Constants.xlManual(-4135)

您可以在下面找到C#帮助函数中的示例,用于按特定的透视项过滤透视字段:

@Table(name = "data")
public class Data {
    @Id
    @Column(name = "name")
    private String name;

    @Column(name = "number")
    private String number;

    private String info;

    ... getters/setters...
}

答案 4 :(得分:0)

如果没有其他可见的PivotItem,则不能使PivotItem不可见。

即您无法隐藏最后一个。