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),并连接到一个透视表
对于最后一行的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