删除连接到同一工作簿中的单独源数据的切片器

时间:2017-05-09 10:27:03

标签: excel vba excel-vba

我真的不知道如何写出我的问题,所以你会明白,但我会尽我所能。我希望你能得到我想要的基础。

我有1个工作簿,包含2个单独的表,2个仪表板,每个表一个。多个与表1和表2连接的数据透视表。两个表看起来都是相同的标题,但它们中的数据不同。

我的工作簿表看起来像这样。

    Dashboard 1| Dashboard 2| Table 1| Table2| Pivot1Hours| Pivot2Hours|  Pivot1cost| Pivot2cost.

表1及其枢轴表用于仪表板1,表2用于仪表板2。

因为我想要分离这些我有不同的代码到uppdate仪表板1和2.此代码从图形和切片器中清除仪表板1并创建新的图形和切片器。

我的问题。我删除了每个仪表板中的slicercach和图表的代码如下所示。

Dim ws As Worksheet
Dim Chrtobj As ChartObject
Dim SC As SlicerCache
 Set ws = ThisWorkbook.Sheets("The dashboard i want to use")
 If Not ws.ChartObjects.Count = 0 Then ws.ChartObjects.Delete
 For Each SC In ActiveWorkbook.SlicerCaches
    SC.Delete
    Next SC

上面的代码显然删除了我工作簿中的所有切片器。即使是仪表板2中的那些,如果我想更新仪表板1,这是我不希望的。

我真的不知道如何声明我的代码所以我只删除连接到仪表板1中的表1或仪表板2中的表2的切片器,因此将它们保存在单独的仪表板中。如果有人能帮助我朝着正确的方向前进,我会非常高兴并加深对excel pivotcach的了解。

编辑 -

这是我用来从表1和2获取切片器的代码,我只更改了子名称。因此,对于表2,我从此代码中获取切片器,对于表1,除了用于pivottables的不同工作表名称之外,它是相同的。

 Sub dografer2()

Dim slizename As String
Dim rensaantal As Long
Dim i As Long
Dim ws As Worksheet
Dim Chrtobj As ChartObject
Dim sc As SlicerCache
Dim slizern As String
Dim col As Integer
Dim position As Integer
Dim topp As Integer


'Tar bort grafer
Set ws = ThisWorkbook.Sheets("Dashboard 2")
'~~> Check if there are any chartobjects in the sheet
If Not ws.ChartObjects.Count = 0 Then ws.ChartObjects.Delete
'remove slicers/slicercach

For Each sc In ActiveWorkbook.SlicerCaches
    sc.Delete
    Next sc

'Create graphs
Call HeltidsGraf_2
Call TimmarGraf_2
Call Totalgraf2_2
Call HeltidsGraf2_2
Call KostnadsGraf_2
Call Totalgraf_2



position = 25
topp = 150 + 300 + 300 + 300 - 600

   For col = 1 To 3

    'slicername
      slizern = Worksheets("Table2").Cells(2, col).Value
       Debug.Print (slizern)


    'Create slicers
    ActiveWorkbook.SlicerCaches.Add(Worksheets("Pivot2Hours").PivotTables(1), slizern) _
    .Slicers.Add Worksheets("Dashboard 2"), , slizern, slizern, topp, position, 210, 300
    Debug.Print (ThisWorkbook.SlicerCaches(col).Name)
     slizename = ThisWorkbook.SlicerCaches(col).Name

  ActiveWorkbook.SlicerCaches(slizename).PivotTables.AddPivotTable (Worksheets("Pivot2Cost").PivotTables(1))

    position = position + 210
Next col

position = 25
topp = 150 + 300 + 300
For col = 4 To 6

   'slicername
    slizern = Worksheets("Table2").Cells(2, col).Value
    Debug.Print (slizern)


   'Create slicers
    ActiveWorkbook.SlicerCaches.Add(Worksheets("Pivot2Hours").PivotTables(1), slizern) _
    .Slicers.Add Worksheets("Dashboard 2"), , slizern, slizern, topp, position, 210, 300
    Debug.Print (ThisWorkbook.SlicerCaches(col).Name)
    slizename = ThisWorkbook.SlicerCaches(col).Name

  ActiveWorkbook.SlicerCaches(slizename).PivotTables.AddPivotTable (Worksheets("Pivot2Cost").PivotTables(1))



    position = position + 210
Next col

position = 25
topp = 150 + 300
For col = 7 To 9
     'slicername
    slizern = Worksheets("Table2").Cells(2, col).Value
    Debug.Print (slizern)


   'Create slicers
    ActiveWorkbook.SlicerCaches.Add(Worksheets("Pivot2Hours").PivotTables(1), slizern) _
    .Slicers.Add Worksheets("Dashboard 2"), , slizern, slizern, topp, position, 210, 300
    Debug.Print (ThisWorkbook.SlicerCaches(col).Name)
    slizename = ThisWorkbook.SlicerCaches(col).Name

  ActiveWorkbook.SlicerCaches(slizename).PivotTables.AddPivotTable (Worksheets("Pivot2Cost").PivotTables(1))

    position = position + 210
 Next col

position = 25
topp = 150
'topp = 150 + 300 + 300 + 300


col = 10
       'Slicername
     slizern = Worksheets("Table2").Cells(2, col).Value
    Debug.Print (slizern)

    'Create slicers
       ActiveWorkbook.SlicerCaches.Add(Worksheets("Pivot2Hours").PivotTables  (1), slizern) _
      .Slicers.Add Worksheets("Dashboard 2"), , slizern, slizern, topp, position, 210, 300
     Debug.Print (ThisWorkbook.SlicerCaches(col).Name)
    slizename = ThisWorkbook.SlicerCaches(col).Name

    ActiveWorkbook.SlicerCaches(slizename).PivotTables.AddPivotTable (Worksheets("Pivot2Cost").PivotTables(1))



End Sub

提前致谢! / d

2 个答案:

答案 0 :(得分:0)

您可以检查切片分配到哪个数据透视表(但请注意切片器可以分配给多个数据透视。然后可能取决于数据透视表的名称(或数据透视图的数据源),您可以决定是否删除切片机。 请注意,从集合中删除某些内容时,您始终必须向后循环。 也许这段代码可以给你一个提示:

Sub DeleteSlicerCache()

Dim si As Long, s As SlicerCache
For si = ThisWorkbook.SlicerCaches.Count To 1 Step -1
    Set s = ThisWorkbook.SlicerCaches(si)

    Debug.Print "Slicer: ", si, s.Name
    Dim pi As Long
    For pi = 1 To s.PivotTables.Count
        Dim p As PivotTable
        Set p = s.PivotTables(pi)
        Debug.Print "Pivot:", si & "." & pi & p.Name, p.SourceData
        If p.Name = "PivotTable1" Then ' <== Enter your condition here
            ThisWorkbook.SlicerCaches(si).Delete
            Exit for
        End If
    Next pi
Next si
End Sub

答案 1 :(得分:0)

如果我理解正确,你为&#34;仪表板2&#34;创建了10个切片机。 - 我假设你在&#34; Dashboard 1&#34;的某个地方做同样的事情。我建议将切片器命名为可以识别它们。

我修改了您的子程序,使其适用于两个仪表板,只需将工作表作为参数传递 - 但由于我没有设置您的工作簿,因此它完全未经测试。您可以看到所有10个Slicers都是在一个循环中创建的。也许你必须使用topPos / leftPos计算,但我认为你明白了。 请注意,删除切片器时,您必须访问slicerCache-Object的切片器成员以检查名称(之前没有知道)

Sub AddSlicers(postFix As String, tableWs As Worksheet, dashboardWs As Worksheet, hoursWs As Worksheet, costWs As Worksheet)

Dim sc As SlicerCache
For Each sc In ActiveWorkbook.SlicerCaches
    If Right(sc.Slicers(1).Name, Len(postFix)) = postFix Then sc.Delete
Next sc

Dim col As Long, topPos As Double, leftPos As Double
topPos = 150
leftPos = 25

For col = 1 To 10

    Dim slicerFieldName As String, slicerName As String
    slicerFieldName = tableWs.Cells(2, col).Value
    slicerName = tableWs.Cells(2, col).Value & postFix

    ActiveWorkbook.SlicerCaches.Add(hoursWs.PivotTables(1), slicerFieldName) _
        .Slicers.Add dashboardWs, , slicerName, slicerFieldName, topPos, leftPos, 210, 300

    Call ActiveWorkbook.SlicerCaches(slicerName).PivotTables.AddPivotTable(costWs.PivotTables(1))

    If col Mod 3 = 0 Then
        topPos = topPos + 300
        leftPos = 25
    Else
        leftPos = leftPos + 210
    End If

Next col

End Sub

调用它
    Call AddSlicers("Set2", ThisWorkbook.Worksheets("table2"), _
                        ThisWorkbook.Worksheets("Dashboard 2"), _
                        ThisWorkbook.Worksheets("Pivot2Hours"), _
                        ThisWorkbook.Worksheets("Pivot2Cost"))

您提到的运行时错误可能会解释:您必须在删除SlicerCache后退出内部循环。我已经编辑了我的第一个答案。