添加切片器缓存期间出现奇怪错误

Strange error during addition of slicer cache

我正在开发具有多个枢轴 table 和切片器的应用程序。

我尝试准备一个模板 sheet 并复制粘贴它以创建多重分析。

当我复制 sheet 时,Slicers 将链接到原始和新的枢轴 tables(属于相同的 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 & SlCSequence)

根据 MSDN help,即使不指定名称也应该可以工作:

The name Excel uses to reference the slicer cache (the value of the SlicerCache.Name property). If omitted, Excel will generate a name. By default, Excel concatenates "Slicer_" with the value of the PivotField.Caption property for slicers with non-OLAP data sources, ... (Replacing any spaces with "_".) If required to make the name unique in the workbook namespace, Excel adds an integer to the end of the generated name. If you specify a name that already exists in the workbook namespace, the Add method will fail.

然而,即使我像上面那样使用我的代码,或者我只是省略了第三个参数,我仍然得到

error 1004: The slicer cache already exists.

为了让事情变得更复杂,如果我使用一个变量作为 Slicercaches.Add (NewSlCName = .SlicerCache.Name & SlCSequence) 的名称参数,我会得到不同的:

error: 5 "Invalid procedure call or argument"

我真的不知道如何解决它。

更新

我使用了 SlicerCaches.Add2,因为它可以从对象提示中获得。
根据 another article .Add 已弃用,不应使用。
我也试过 .Add 而不是 .Add2,它给出了同样的错误。

到目前为止,我唯一可以使用的方法是:

创建两个具有相同布局和数据透视表的模板,其中一个带有切片器,另一个没有。

要创建一个新的 sheet:复制没有切片器的模板,然后 运行 下面的代码用于在新的 sheet 中创建切片器:

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