使用VBA循环使用工作簿切片器名称

我试过谷歌search这一个,但只是不能完全得到它。 我所要做的就是通过活动工作表上的切片器进行循环,并删除切片器(如果存在的话)。

目前我有6个切片机坐在那里。 以前我有过

ActiveSheet.Shapes.Range(Array("Market Segment Name 2", "Line of Business 2" _ , "Customer Name", "Product Group Name", "Product Type Name", "Product Code") _ ).Select Selection.Delete 

但是,如果我已经删除了切片机,这是不好的。

现在我正在尝试(注意wb被设置为名为“Public”的模块中的全局variables)

 Option Explicit Dim sl As Slicer Dim slName As String Set wb = ActiveWorkbook For Each sl In wb.SlicerCaches If sl.Name = "Market Segment Name 2" Or _ sl.Name = "Line of Business 2" Or _ sl.Name = "Customer Name" Or _ sl.Name = "Product Group Name" Or _ sl.Name = "Product Type Name" Or _ sl.Name = "Product Name" Then slName = sl.Name ActiveSheet.Shapes.Range(slName).Delete End If Next sl 

对我来说,它似乎应该工作。 我已经得到它的工作,如果我下降到SlicerItem级别,但我只是不知道如何访问它在切片机级…

任何想法将不胜感激。 谢谢。

如果这失败了,我会去build立数组和删除这种方式,但我仍然需要一种testing切片机目前是否存在的方式。

有两种方法我可以想到。

一个是Force方法。 这里我们不检查切片机是否存在。 如果它存在,我们简单地删除它。 例如

 On Error Resume Next ActiveSheet.Shapes.Range("Market Segment Name 2").Delete ActiveSheet.Shapes.Range("Line of Business 2").Delete ' '~~> And so on ' On Error GoTo 0 

另一种方法是实际检查切片机是否存在,然后删除它。 例如

 Dim sl As SlicerCache On Error Resume Next Set sl = ActiveWorkbook.SlicerCaches("Market Segment Name 2") On Error GoTo 0 If Not sl Is Nothing Then sl.Delete 'For Each sl In ActiveWorkbook.SlicerCaches 'Debug.Print sl.Name 'Next 

编辑

从评论后续。

将第一个代码转换成循环。

 Sub Sample() Dim sSlicers As String Dim Myar Dim i As Long '~~> Slicers you want to delete sSlicers = "Market Segment Name 2,Line of Business 2" sSlicers = sSlicers & "," & "Customer Name,Product Group Name" sSlicers = sSlicers & "," & "Product Type Name,Product Code" '~~> Split the names using "," as a delimiter '~~> If your slicer names have "," then use a different delimiter Myar = Split(sSlicers, ",") For i = LBound(Myar) To UBound(Myar) On Error Resume Next ActiveSheet.Shapes.Range(Myar(i)).Delete On Error GoTo 0 Next i End Sub 

这是另一个代码,我终于想出了我最初想做的事情。

 Sub LoopSlicerNames() Dim slCaches As SlicerCaches Dim slCache As SlicerCache Set slCaches = ThisWorkbook.SlicerCaches For Each slCache In slCaches 'MsgBox (slCache.Name & " is used for " & slCache.PivotTables.Item(1).Name) If slCache.PivotTables.Item(1).Name = "PTDashboard" Then slCache.Delete 'MsgBox ("Slicer has been deleted") End If 'If slCache.Name = "Slicer_Market_Segment_Name2" Then slCache.Delete Next slCache End Sub 

与此不同的是,我将切片器作为基于其父切换表的工作表,因此我不需要将切片器的确切名称添加到代码中。 如果我想将切片机的名称添加到代码中,则可以切换注释。

再次感谢Siddarth。 你让我了解了最初的障碍,并提供了很好的解决scheme。 我认为我最初的问题是认为切片机是切片辣椒的孩子。 现在看来,它似乎去slicerCaches,SlicerCache然后SlicerItem和'切片机',我在我原来的问题中提到的是'SlicerCache'级别…所以我连接的图片只是混淆了我的哈哈哈哈。