2014-02-19 60 views
1

我想循環選擇一定範圍內的所有切片器項目。比方說,從36的所有項目。我的切片機包含以下項目1 , 2, 3, 5, 6, 8使用VBA循環切片器項目

這裏是我試過

Sub SlicerTest() 

With ActiveWorkbook.SlicerCaches("Slicer_rtytr") 

    Dim maxNumberOfDays As Long 
    maxNumberOfDays = 9 'I want to be able to identify the number of items programmatically but do not know how to do this  
    Dim fromDay As Long 
    fromDay = 3 

    Dim toDay As Long 
    toDay = 6    

    For i = 1 To maxNumberOfDays 

     If (i > fromDay And i < toDay) Then 
      .SlicerItems(CStr(i)).Selected = True 
     Else 
      .SlicerItems(CStr(i)).Selected = False 
     End If  
    Next i 

End With 

End Sub 

的結果應該是切片機僅選秀權,但5它拋出一個錯誤。我試過一個普通的1,2,3,4,5,6,7,8數組,它工作正常。我猜這是因爲錯過了值而不起作用?

回答

1

正常數組的工作原理(正常被量化爲在此上下文中包含數組中的9個元素)是因爲您指定要在此行中循環1到9,這裏是For i = 1 To maxNumberOfDays。在你的例子中,你只有6個項目,所以你會通過嘗試訪問比當前在數組中的更多的項目來打錯誤。

不幸的是,我不太熟悉切片器對象,但是,要解決此問題,您需要知道切片器中有多少項目。快速瀏覽silcers的文檔後,似乎沒有計數屬性,但是,有一個numberOfColumns屬性。如果列數你有多少個對象相關(再次不能完全確保它不會),那麼只分配:

maxNumberOfDays = ActiveWorkbook.SlicerCaches("Slicer_rtytr").numberOfColumns

如果這不工作,我會探索其他選項搞清楚元素的數量這將在你的陣列中。

+0

謝謝你,我決定來計算的限幅器'= SUM元素的數量(IF(FREQUENCY(MATCH(A3:A16,A3:A16, 0),MATCH(A3:A16,A3:A16,0))> 0,1))'。但問題是我如何處理錯誤? 「試着抓住」? –

+0

「期待」一個錯誤並嘗試用嘗試捕獲來規避它通常是不好的做法。這個excel查詢是以編程方式完成的嗎?如果是這樣,則將其分配給您的maxNumberOfDays變量。記住你會想動態地找出有多少元素(除非你總是有一個靜態數量的元素)。 – Max

2

本文解釋您需要什麼,以及一些。

https://paultebraak.wordpress.com/2012/02/24/accessing-the-slicer-through-vba/

相關位:

Dim sC As SlicerCache 
Dim SL As SlicerCacheLevel 
Dim sI As SlicerItem 

Set sC = ActiveWorkbook.SlicerCaches(「Slicer_Dates_Hie」) 
Set SL = sC.SlicerCacheLevels(1) 

Debug.Print 「——————————————————————————「 

For Each sI In SL.SlicerItems 

    Debug.Print 「Caption –> 」 & sI.Caption 
    Debug.Print 「Value –> 」 + CStr(sI.Value) 
    Debug.Print 「Unique Name –> 」 + sI.Name 
    Debug.Print 「——————————————————————————「 

Next