Excel 遍历数据透视表列中的项

Excel 遍历数据透视表列中的项,excel,vba,pivot-table,Excel,Vba,Pivot Table,当给定行和列的数据字段为空时,我的循环不起作用。 有关守则如下:- For Each PivotItem In PvtTbl.RowFields("Agent").PivotItems rw = rw + 1 If PvtTbl.GetPivotData("PRD", "Agent", PivotItem.Name, "CT1", "IB") = 0 Then Worksheets("Sheet1").Cells(16, rw).Value = 0

当给定行和列的数据字段为空时,我的循环不起作用。 有关守则如下:-

For Each PivotItem In PvtTbl.RowFields("Agent").PivotItems
    rw = rw + 1
        If PvtTbl.GetPivotData("PRD", "Agent", PivotItem.Name, "CT1", "IB") = 0 Then
            Worksheets("Sheet1").Cells(16, rw).Value = 0
         Else
            Worksheets("Sheet1").Cells(16, rw).Value = PvtTbl.GetPivotData("PRD", "Agent", PivotItem.Name, "CT1", "IB")
         End If
Next PivotItem
我得到的错误是:

运行时错误1004/“应用程序定义或对象定义错误”


我尝试了“iError”而不是将有问题的行设置为零,但这两种方法都不起作用。

这无疑是因为数据透视表中不存在PvtTbl.GetPivotData(“PRD”、“代理”、PivotItem.Name、“CT1”、“IB”)的某些组合。因此,您需要检查它是否返回错误,然后进行相应的处理

也就是说,我觉得奇怪的是,您首先希望通过迭代来实现这一点。为什么不直接检查数据字段中的内容是否为零?或者为什么不在相关的工作表单元格中使用GETPIVOTDATA公式


你能详细说明一下你想用这段代码实现什么吗?

我的意思是,我已经说过这是因为你刚才说的。我的问题正是,正如你所说,如何在不改变桌子本身的情况下处理它。我之所以想这样做,是因为我试图自动生成一个图表,显示代理的PRD计数,包括CT1、IB、CT2和OB,无论他们是否必须拥有符合这些标准的票证。应该有办法做到这一点,我不明白为什么它会返回一个错误,而不是一个空列和完整行字段的0。你不能创建一个数据透视图,直接显示这一点,不使用VBA吗?迭代PivotItems集合以获取有关数据字段的信息是一种非常间接的方法,无论您在做什么。如果您这样做是因为希望每个代理都有单独的图表,那么您应该查看ShowReportFilterPages功能,该功能为特定字段中的每个项生成单独的报告。请参阅您的评论“我不明白为什么它会返回一个错误,而不仅仅是一个空列和完整行字段的0”…这是因为数据透视表根本没有您所要求的组合值。如果微软在没有这种组合的情况下返回一个零(这是一个数字),那将是一个糟糕的编程;我的意思是用不同的格式排列相同的数字。我需要继续这样做的工作,我试图自动化它,因此使用VBA。至于“数据透视表根本没有那个值,返回任何值都是不好的编程”,您是不正确的,因为同一个GETPIVOTDATA操作的这个屏幕截图()显示在VBA编辑器上下文之外。您不能只使用工作表函数GETPIVOTDATA以不同的格式排列相同的数字吗?你能详细说明你为什么需要VBA吗?不,关于这个错误我没有错。相反,你没有理解我。您的代码遍历每个代理,并询问CT1字段=“IB”所在的值。但对于代理C和D,没有数据,其中CT1=“IB”。同样,数据透视表没有您所要求的组合的值。