无法连接切片机的多个数据透视表 - 错误#424“对象需要”(Cannot Connect Slic

2019-10-30 03:35发布

我想切片器连接到此处描述的使用方法多重透视表: http://dailydoseofexcel.com/archives/2014/08/05/slicers-and-slicercaches/

首先,我依次通过我的数据透视表,并为每一个切片:

wkbDash.SlicerCaches.Add(wksPivots.PivotTables(sPTName), sSlicerName). _
    Slicers.Add wksSlicers, , sSlicerName, sSlicerName, 1, 1, 50, 100

然后,我遍历我的切片机,并尝试将其钩到每一个数据透视表

问题:我得到一个错误#424在这条线“对象需要”:

wkbDash.SlicerCaches(objSlicer).PivotTables.AddPivotTable 
(wksPivots.PivotTables(varPTNames(i, 1)))

代码挂钩片来透视表:

' Declarations
Dim objSlicerCache  As SlicerCache
Dim objSlicer       As Slicer
Dim objPT           As PivotTable
Dim varPTNames      As Variant
Dim wksDefPivots    As Worksheet
Dim wkbDash         As Workbook
Dim i               As Integer

' Initialize Variables
Set wkbDash = Workbooks(sDash)
Set wksDefPivots = Workbooks(sDash).Worksheets(sDefPivots)
varPTNames = wksDefPivots.Range("A2:A" & FindLastRow(wksDefPivots)).Value2
i = 0

' Procedure
    For Each objSlicerCache In Workbooks(sDash).SlicerCaches
        For Each objSlicer In objSlicerCache.Slicers
            For i = LBound(varPTNames) To UBound(varPTNames)
               wkbDash.SlicerCaches(objSlicer).PivotTables.AddPivotTable (wksPivots.PivotTables(varPTNames(i, 1)))
            Next i
        Next objSlicer
    Next objSlicerCache

基于Bob的意见,我已经修改了循环尝试和挂钩的数据透视表的SlicerCache对象,而不是切片。 我仍然得到错误#424“对象需要”

修订循环:

    For Each objSlicerCache In Workbooks(sDash).SlicerCaches
        For j = LBound(varPTNames) To UBound(varPTNames)
           objSlicerCache.PivotTables.AddPivotTable (wksPivots.PivotTables(varPTNames(j, 1)))
        Next j
    Next objSlicerCache

主要更新:我已经修改了代码,我非常接近。 新的代码序列:
1.创建1个PivotCache
2.使用PivotCache创建多个数据透视表
3.创建从第一数据透视表1 SlicerCache
4.添加额外的数据透视表SlicerCache
5.循环每一个数据透视表中SlicerCache并创建一个限幅器。

好消息:所有这些代码工作。 它创造了许多切片机,并且每个切片器将过滤所有的数据透视表

问题:所有的切片器仅过滤一个字段(见图像),而不是每个切片器providingng不同的字段来过滤。

码:

   For Each objSlicerCache In wkbDash.SlicerCaches
        objSlicerCache.Delete
    Next objSlicerCache

    sRF = Worksheets(sDefPivots).Range("B2").Value
    sPT = Worksheets(sDefPivots).Range("A2").Value

    Set objPT = Worksheets(sPivots).PivotTables(sPT)
    Set objPF = Worksheets(sPivots).PivotTables(sPT).PivotFields(sRF)

    Set objSlicerCache = wkbDash.SlicerCaches.Add(objPT, objPF.Name)

    Set objPT = Nothing
    Set objPF = Nothing

    For Each objPT In Worksheets(sPivots).PivotTables
        objSlicerCache.PivotTables.AddPivotTable objPT
    Next objPT

    For Each objSlicerCache In wkbDash.SlicerCaches
        For Each objPT In objSlicerCache.PivotTables
            objSlicerCache.Slicers.Add wksSlicers, , objPT.Name, objPT.Name, 1, 1, 50, 100
        Next objPT
    Next objSlicerCache

过滤器的屏幕截图

Answer 1:

看着这个文档很明显,你有语法问题。 为了得到一个单独的Slicer对象:

wkbDash.SlicerCaches("someString")

这与一般的一致Collection的语法:

myCollection("aKeyValue")

要么:

myCollection(anOffsetInteger)

你是把一个对象引用作为关键值,而不是字符串或整数。

现在, PivotTables是一个相关的集合SlicerCache对象。 你的外表For Each是通过这些迭代,所以如果你打算在每次迭代中添加数据透视表,你需要把它做你迭代的对象,所以:

For Each objSlicerCache In Workbooks(sDash).SlicerCaches
    For i = LBound(varPTNames) To UBound(varPTNames)
           objSlicerCache.PivotTables.AddPivotTable (wksPivots.PivotTables(varPTNames(i, 1)))
    Next i
Next objSlicerCache

你不能迭代Slicers集合中的每个SlicerCache循环内的对象,和枢轴表添加到单个Slicer对象,因为对象模型不成立的关联Slicer对象直接与PivotTable对象。 如果您在doc看,你会发现SlicerCache对象有一个PivotTables属性,而SlicersSlicer对象没有。



Answer 2:

问题解决了
码步骤:
1.从一个枢轴高速缓存中创建数据透视表
2.对于每个数据透视表中,创建一个切片器缓存
3.对于每个切片器缓存,创建切片机
4.对于每个切片器高速缓存,循环通过透视表,并将它们添加到SC

码:

' Procedure

    For Each objSlicerCache In wkbDash.SlicerCaches
        objSlicerCache.Delete
    Next objSlicerCache

    varSlicers = wksDefPivots.Range("A2:B" & CStr(FindLastRow(wksDefPivots))).Value2
    For i = LBound(varSlicers, 1) To UBound(varSlicers, 1)
        Set objPT = Worksheets(sPivots).PivotTables(CStr(varSlicers(i, 1)))
        Set objPF = Worksheets(sPivots).PivotTables(CStr(varSlicers(i, 1))).PivotFields(CStr(varSlicers(i, 2)))
        Set objSlicerCache = wkbDash.SlicerCaches.Add(objPT, objPF.Name) 'Create SlicerCache for each Pivot Table
    Next i

    For Each objSlicerCache In wkbDash.SlicerCaches
        For Each objPT In objSlicerCache.PivotTables
            objSlicerCache.Slicers.Add wksSlicers, , objPT.Name, objPT.Name, 1, 1, 50, 100 'Add Slicers for each Pivot Table
        Next objPT
    Next objSlicerCache

    Set objSlicerCache = Nothing
    Set objPT = Nothing

    Call FormatSlicers(sSlicers) 'Format size & location of slicers

   For Each objSlicerCache In wkbDash.SlicerCaches
        For Each objPT In wksPivots.PivotTables
                objSlicerCache.PivotTables.AddPivotTable objPT 'Add every Pivot Table to every SlicerCache
        Next objPT
    Next objSlicerCache


文章来源: Cannot Connect Slicer to Multiple Pivot Tables - Error #424 “Object Required”