使用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'级别…所以我连接的图片只是混淆了我的哈哈哈哈。