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的所有参数喝彩,所有参数都正确。对不起,这是我的最佳猜测。如果我我会尝试运行你的代码。