Excel VBA-切片机添加数据透视表错误-1004

Excel VBA-切片机添加数据透视表错误-1004,excel,vba,slicers,Excel,Vba,Slicers,问题: 在下面的代码部分获取运行时错误'1004:应用程序定义的错误或对象定义的错误 ActiveWorkbook.SlicerCaches(sl.Name).PivotTables.AddPivotTable pt (其中“sl”是切片机名称,“pt”是数据透视表对象,因此直接引用该对象) 我也为以上做了不同的参考,但仍然失败得很惨,就像 ActiveWorkbook.SlicerCaches(sl.Name).PivotTables.AddPivotTable Worksheet("Piv

问题:
在下面的代码部分获取运行时错误'1004:应用程序定义的错误或对象定义的错误

ActiveWorkbook.SlicerCaches(sl.Name).PivotTables.AddPivotTable pt
(其中“sl”是切片机名称,“pt”是数据透视表对象,因此直接引用该对象)

我也为以上做了不同的参考,但仍然失败得很惨,就像

ActiveWorkbook.SlicerCaches(sl.Name).PivotTables.AddPivotTable Worksheet("PivotSheet").PivotTables(pt.name)
目的:
尝试将其他透视表(共30个)连接到现有切片缓存(共5个),其中这些透视表由类对象(“PivTab”)实例化和创建

做了什么:

  • 可以通过循环并实例化前面提到的一个新类来生成透视表和透视图
  • 可以生成所需的切片器和切片器(5),并连接到一个透视表
(1)循环生成透视表/图表/切片器所需信息的代码函数


对于最后一行的i=2,我发现了问题。。。数据透视表未连接到同一个数据透视缓存(因为每个数据透视缓存都是作为PivTab类内循环中的新实例创建的)。这就是为什么切片机无法检测多个要连接的数据透视,而只能检测一个数据透视表。通过将数据透视缓存实例化一次并将其置于循环之外解决了此问题。很高兴您解决了此问题!如果您觉得您的解决方案对其他读者有用,请在下面的答案部分添加完整答案。我发现了问题。。。数据透视表未连接到同一个数据透视缓存(因为每个数据透视缓存都是作为PivTab类内循环中的新实例创建的)。这就是为什么切片机无法检测多个要连接的数据透视,而只能检测一个数据透视表。通过将数据透视缓存实例化一次并将其置于循环之外解决了此问题。很高兴您解决了此问题!如果您认为您的解决方案对其他读者有用,请在下面的答案部分添加完整答案。
    For i = 2 To LastRow <- each row contains specs to build pivot table, pivot chart, slicer
        Dim oPT As New PivTab
        Dim oPC As New PivCht
        Dim oPS As New PivSlicer

        With PropSheet
            Set rLoop = .Range(.Cells(i, 1), .Cells(i, LastCol))

            oPT.ReadData PropSheet, rLoop
            oPT.SetupTable PivSheet, PivRange

            oPC.ReadData PropSheet, rLoop
            oPC.MakeCht PivSheet, oPT.ID

            oPS.ReadData PropSheet, rLoop
            oPS.SetSlicer PivSheet, oPT.PivTable, NameFieldDict

        End With
    Next
Public Function SetSlicer(ByVal PivSheet As Worksheet, pt As Object, dictNameField As Dictionary)
    Dim k, j As Variant
    Dim sl As SlicerCache
    Dim pvts As SlicerPivotTables

    If iCounter = 0 Then
        For Each k In dictNameField.Keys
            Set SCache = ActiveWorkbook.SlicerCaches.Add2(pt, CStr(dictNameField(k)), CStr(Replace(k, " ", "")))
        Next

        Call CreateFormatSlicer(PivSheet, ActiveWorkbook.Worksheets("Chart")) <- creates slicer

        For Each sl In ActiveWorkbook.SlicerCaches
            For Each j In ReqDict.Keys
                If InStr(1, j, sl.Name, vbBinaryCompare) > 0 And CStr(ReqDict(j)) = "Yes" Then
                    ActiveWorkbook.SlicerCaches(sl.Name).PivotTables.AddPivotTable pt
                End If
            Next
        Next
    End If