2013-12-10 39 views
4

我嘗試過使用谷歌搜索和搜索這一個,但只是不能完全得到它。我所要做的就是循環遍歷活動工作表上的切片器,並刪除切片器(如果存在的話)。使用VBA循環瀏覽工作簿切片器名稱

目前我有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 

但是,如果我已經刪除了切片機,這是不好的。

現在我想(注白平衡設置爲姓「公」模塊中的全局變量)

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級別,但我不知道如何訪問它在切片機級別...

任何想法將不勝感激。謝謝。

如果這失敗了,我會去建立數組並刪除這種方式,但我仍然需要一種測試切片機目前是否存在的方法。

+0

'我只是不知道如何在切片機級別訪問它......'我沒有得到你的問題 –

+0

嗨悉達特Rout。我希望我的這個結構和邏輯正確。我正在通過圖像(下面鏈接)。當我在工作表上看到切片器時,我假設這是'切片器'級別,這是我可以訪問這些名稱的位置,這樣我就可以檢測到我是否可以刪除它... http://blogs.office。com/cfs-filesystemfile.ashx/__ key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-00-44-metablogapi/0636.image_5F00_2ADE6206.png –

+0

所以你想要所有切片器的名稱或檢查切片器存在? –

回答

5

我可以想到兩種方法。

一種是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 
+0

感謝Siddarth Rout。現在我想我會在完成這項工作時選擇這個第一個選項(這與我原本打算將它包裝在「On error Resume Next」中的情況類似),我會堅持一下,看看有人能夠想出一個循環答案,因爲我的工作表可能會得到更多的切片,我不想手動將它們全部添加到代碼中。再次感謝,這有助於與人們討論這些問題 –

+0

我可以給你一個循環代碼,但是你將不得不將這些名稱存儲在某個地方? –

+0

@JayKilleen:請參閱上面的回答中的編輯。您可能需要刷新頁面 –

2

這是另一個代碼我終於想通過做我最初試圖實現的。

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。你讓我瞭解了最初的障礙並提供了很好的解決方案。我認爲我最初的問題是認爲切片機是切片切片的孩子。現在看來,它似乎去了slicerCaches,SlicerCache然後SlicerItem和'切片機',因爲我在我原來的問題中提到的是'SlicerCache'級別......所以我連接的圖片只是混淆了我的哈哈。

相關問題