Vba 当数据透视表数据字段有子标题时如何使用getpivotdata

Vba 当数据透视表数据字段有子标题时如何使用getpivotdata,vba,pivot-table,Vba,Pivot Table,我正在尝试使用getpivotdata将某些特定的数据透视表数据复制到数据表中。如果没有副标题,我可以做到。然而,当有副标题时,我在运行代码时遇到了问题 我试过很多不同的方法,但都没有用,请帮忙。我相信我遗漏了getpivotdata括号中的某些内容。请看一下代码 当我不包括副标题时,它起作用 Dim PT As PivotTable Set PT = Sheet2.PivotTables("PivotTable2") Range("C28").Value = PT.G

我正在尝试使用getpivotdata将某些特定的数据透视表数据复制到数据表中。如果没有副标题,我可以做到。然而,当有副标题时,我在运行代码时遇到了问题

我试过很多不同的方法,但都没有用,请帮忙。我相信我遗漏了getpivotdata括号中的某些内容。请看一下代码

当我不包括副标题时,它起作用

Dim PT As PivotTable

    Set PT = Sheet2.PivotTables("PivotTable2")

    Range("C28").Value = PT.GetPivotData("Profit", "Region", "2", "Department", "107").Value
当我包含如下所示的副标题时,它不起作用。它将给出错误1004(应用程序定义或对象定义错误)


我希望它能在C28单元中显示Staff Jim下的数据,但现在我只能获得同一部门107下所有员工的数据。

所以就像我告诉过你的那样,将所有过滤器放到行中非常简单,如下所示:

使用此代码的这种方式:

Option Explicit
Sub Test()

    Dim PT As PivotTable

    With ThisWorkbook.Sheets("Test")
        Set PT = .PivotTables("Test")

        .Cells(1, 1) = PT.GetPivotData("Profit", "Region", "2", "Department", "107", "Staff", "Jim").Value
    End With

End Sub
如你所见,给了我Jim在A1单元的利润值。请注意,执行此操作时,过滤器具有优先级。在这种情况下,您必须始终筛选区域,然后是部门,最后是员工

顺序是不相关的,但当您想要获取员工数据时,必须首先提供地区和部门

当您想要获取部门数据时,您只需要提供地区和部门。最后,如果您只需要按区域划分的数据,只需提供de区域


希望能有所帮助。

就像我告诉过你的那样,将所有过滤器放到行中非常简单,如下所示:

使用此代码的这种方式:

Option Explicit
Sub Test()

    Dim PT As PivotTable

    With ThisWorkbook.Sheets("Test")
        Set PT = .PivotTables("Test")

        .Cells(1, 1) = PT.GetPivotData("Profit", "Region", "2", "Department", "107", "Staff", "Jim").Value
    End With

End Sub
如你所见,给了我Jim在A1单元的利润值。请注意,执行此操作时,过滤器具有优先级。在这种情况下,您必须始终筛选区域,然后是部门,最后是员工

顺序是不相关的,但当您想要获取员工数据时,必须首先提供地区和部门

当您想要获取部门数据时,您只需要提供地区和部门。最后,如果您只需要按区域划分的数据,只需提供de区域


希望有帮助。

在添加了一些错误测试代码后,代码终于可以工作了

Sub Test()

    Dim PT As PivotTable
    Dim wkSheet As Worksheet
    Set wkSheet = Worksheets("Sheet2")

    wkSheet.Activate
    With ThisWorkbook.Sheets("Sheet2")
        Set PT = .PivotTables("PivotTable2")
        Sheets("Sheet2").Range("C30").Select

    On Error Resume Next
.Cells(30, 5) = PT.GetPivotData("Profit", "Region", "5", "Department", "109", "Staff", "John").Value
'Your Line here which causes 1004 error
If Err.Number > 0 Then
  Debug.Print Err.Number & ":" & Err.Description
End If

    End With

End Sub```

在添加了一些错误测试代码之后,代码终于可以工作了

Sub Test()

    Dim PT As PivotTable
    Dim wkSheet As Worksheet
    Set wkSheet = Worksheets("Sheet2")

    wkSheet.Activate
    With ThisWorkbook.Sheets("Sheet2")
        Set PT = .PivotTables("PivotTable2")
        Sheets("Sheet2").Range("C30").Select

    On Error Resume Next
.Cells(30, 5) = PT.GetPivotData("Profit", "Region", "5", "Department", "109", "Staff", "John").Value
'Your Line here which causes 1004 error
If Err.Number > 0 Then
  Debug.Print Err.Number & ":" & Err.Description
End If

    End With

End Sub```


我通常会在行上添加所有的标题,所以获得我想要的结果没有问题。但你必须知道,要做到这一点需要一定的水平。行上的第一个值必须始终作为筛选器,然后是第二个值,依此类推。。。这样试试,看看它是否有效。当它不起作用时,它会做什么?@TimWilliams它会给我错误1004(应用程序定义或对象定义错误)@Damian如果我把所有的头放在行上,它不会给我我想要的数据你能提供一个数据样本吗?我通常会把所有的头放在行上,所以得到我想要的结果没有问题。但你必须知道,要做到这一点需要一定的水平。行上的第一个值必须始终作为筛选器,然后是第二个值,依此类推。。。这样试试,看看它是否有效。当它不起作用时,它会做什么呢?@TimWilliams它会给我错误1004(应用程序定义的或对象定义的错误)@Damian如果我把所有的标题都放在行上,它就不会给我想要的数据你能提供一个数据样本吗?没有办法在列中使用它们吗?这对我来说也很有效。。。与按列显示数据的方式相同。奇怪的是,它不在你的工作表上。这个代码需要在一个模块上。您是在模块上使用它还是在工作簿本身@JoachimTan上使用它?代码在模块上。介意分享一下你的代码屏幕截图吗?在专栏里没有办法和他们一起做吗?这对我来说也很有效。。。与按列显示数据的方式相同。奇怪的是,它不在你的工作表上。这个代码需要在一个模块上。您是在模块上使用它还是在工作簿本身@JoachimTan上使用它?代码在模块上。介意分享你的代码屏幕截图吗?