Excel 添加切片器缓存时出现奇怪错误
我正在开发一个包含多个透视表和切片器的应用程序 我试着准备一个模板表并复制粘贴它,以便创建多个分析 复制工作表时,Excel 添加切片器缓存时出现奇怪错误,excel,excel-2013,vba,Excel,Excel 2013,Vba,我正在开发一个包含多个透视表和切片器的应用程序 我试着准备一个模板表并复制粘贴它,以便创建多个分析 复制工作表时,切片器将链接到原始和新的透视表(属于同一个切片器),因此我需要: 从新数据透视表中取消原始SlicerCache链接 从新工作表中删除原始的切片器 使用相同的连接设置创建新的SlicerCache 在新工作表上创建新的切片器,属于新的切片器 到目前为止,我的代码是: Function DuplicateSlicer(PreviousSlicer As Slicer) As Sli
切片器
将链接到原始和新的透视表(属于同一个切片器
),因此我需要:
- 从新数据透视表中取消原始
链接SlicerCache
- 从新工作表中删除原始的
切片器
- 使用相同的连接设置创建新的
SlicerCache
- 在新工作表上创建新的
,属于新的切片器
切片器
Function DuplicateSlicer(PreviousSlicer As Slicer) As Slicer
Dim NewSlC As SlicerCache
Dim NewSlicer As Slicer
Dim DestWorkSheet As Worksheet
Dim SlCSequence As Integer
Dim NewSlCName As String
With PreviousSlicer
Set DestWorkSheet = .Parent
.SlicerCache.PivotTables.RemovePivotTable (DestWorkSheet.PivotTables(1))
SlCSequence = 1
Do Until GetSlicerCache(DestWorkSheet.Parent, .SlicerCache.Name & SlCSequence) Is Nothing
SlCSequence = SlCSequence + 1
Loop
NewSlCName = .SlicerCache.Name & SlCSequence
Set NewSlC = DestWorkSheet.Parent.SlicerCaches.Add2(DestWorkSheet.PivotTables(1), _
.SlicerCache.SourceName, .SlicerCache.Name & SlCSequence)
Set NewSlicer = NewSlC.Slicers.Add(DestWorkSheet, Caption:=.SlicerCache.SourceName, _
Top:=.Top, Left:=.Left, Width:=.Width, Height:=.Height)
NewSlicer.SlicerCache.CrossFilterType = xlSlicerCrossFilterHideButtonsWithNoData
.Delete
End With
End Function
我的问题在于线路DestWorkSheet.Parent.SlicerCaches.Add2(DestWorkSheet.PivotTables(1)_
.SlicerCache.SourceName、.SlicerCache.Name和slc序列)
根据规定,即使不指定名称,它也应起作用:
Excel用于引用切片器缓存的名称(
SlicerCache.Name属性)。如果省略,Excel将生成一个名称。通过
默认情况下,Excel将“切片器”与
具有非OLAP数据源的切片器的PivotField.Caption属性,
... (将任何空格替换为“u”。)如果需要,则命名
Excel在工作簿命名空间中是唯一的,它会在工作簿的末尾添加一个整数
生成的名称。如果指定的名称已存在于
工作簿命名空间,添加方法将失败
然而,即使我像上面那样使用我的代码,或者我只是省略了第三个参数,我仍然会得到
错误1004:切片器缓存已存在
为了使事情更加复杂,如果我对SlicerCache.Add的name参数使用一个变量(NewSlCName=.SlicerCache.name&SlCSequence
),我会得到不同的变量:
错误:5“过程调用或参数无效”
我真的不知道怎么修理它
更新
我使用了对象提示中提供的SlicerCaches.Add2
。根据
。Add
已弃用,不应使用。我也尝试了
.Add
而不是.Add2
,它给出了相同的错误。到目前为止,我唯一能做的工作是:
使用相同的布局和透视表创建两个模板,其中一个使用切片器,另一个不使用切片器
创建新工作表:复制不带切片器的模板,然后运行以下代码在新工作表中创建切片器:
Sub DuplicateSlicers(NewWorkSheet As Worksheet, SourceWorkSheet As Worksheet)
Dim SlC As SlicerCache
Dim sl As Slicer
For Each SlC In SourceWorkSheet.Parent.SlicerCaches
For Each sl In SlC.Slicers
If (sl.Parent Is SourceWorkSheet) Then
Call DuplicateSlicer(sl, NewWorkSheet)
End If
Next sl
Next SlC
End Sub
Function DuplicateSlicer(PreviousSlicer As Slicer, NewSheet As Worksheet) As Slicer
Dim NewSlC As SlicerCache
Dim NewSlicer As Slicer
If PreviousSlicer Is Nothing Then
Set DuplicateSlicer = Nothing
Exit Function
End If
On Error GoTo ErrLabel
With PreviousSlicer
Set NewSlC = NewSheet.Parent.SlicerCaches.Add2(NewSheet.PivotTables(1), _
.SlicerCache.SourceName)
Set NewSlicer = NewSlC.Slicers.Add(NewSheet, Caption:=.Caption, Top:=.Top, Left:=.Left, _
Width:=.Width, Height:=.Height)
End With
NewSlicer.SlicerCache.CrossFilterType = xlSlicerCrossFilterHideButtonsWithNoData
Set DuplicateSlicer = NewSlicer
Exit Function
ErrLabel:
Debug.Print PreviousSlicer.Caption & " - " & Err.Number & ": " & Err.Description
Err.Clear
End Function
将
.Add2(
替换为.Add(
)会出现相同的错误(请参阅我的更新)添加新缓存时,PreviousSlicer
是否仍然存在?我想知道删除数据透视表(如果是最后一个数据透视表)是否也会删除缓存?@Doug是的,它仍然存在并链接到原始表中的数据透视表。我为.Add2的所有参数喝彩,所有参数都正确。对不起,这是我的最佳猜测。如果我我会尝试运行你的代码。