添加切片器缓存期间出现奇怪错误
Strange error during addition of slicer cache
我正在开发具有多个枢轴 table 和切片器的应用程序。
我尝试准备一个模板 sheet 并复制粘贴它以创建多重分析。
当我复制 sheet 时,Slicer
s 将链接到原始和新的枢轴 tables(属于相同的 SlicerCache
),所以我需要:
- 取消原始
SlicerCache
与新枢轴 table 的链接
- 从新的sheet
中删除原来的Slicer
- 使用相同的连接设置创建新的
SlicerCache
- 在新sheet上新建
Slicer
,属于新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
我正在开发具有多个枢轴 table 和切片器的应用程序。
我尝试准备一个模板 sheet 并复制粘贴它以创建多重分析。
当我复制 sheet 时,Slicer
s 将链接到原始和新的枢轴 tables(属于相同的 SlicerCache
),所以我需要:
- 取消原始
SlicerCache
与新枢轴 table 的链接
- 从新的sheet 中删除原来的
- 使用相同的连接设置创建新的
SlicerCache
- 在新sheet上新建
Slicer
,属于新SlicerCache
Slicer
到目前为止我的代码:
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