我想對符合特定條件的PivotTable
的某些PivotItems
的DataRange.Value
進行求和,我不會在每次更改PageFilter
時都這樣做。這裏是我的代碼:只對已篩選的PivotItems執行循環操作
Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim pt As PivotTable, pi As PivotItem, q as Double
Set pt = ActiveSheet.PivotTables(1)
q = 0
For Each pi In pt.PivotFields(1).PivotItems
If pi.Name = someCriteria Then
q = q + pi.DataRange.Value
End If
Next pi
End Sub
代碼運行每次PT改變(明顯),並且運行得非常好,直到PageFilter
隱藏匹配someCriteria
一個項目,然後1004 Error
發生,因爲它將無法獲取pi
的DataRange
財產。
兩個問題:
(在這種情況下)有沒有一種方法來運行代碼,只有當一個PageFilter
變化(或者它必須與Worksheet_Change
事件做)?
如何僅在已過濾項目中運行For-Loop
?
我已經想出了一個解決方案,做一些錯誤處理,但我猜測必須有一個更優雅的方式來做到這一點。
謝謝。
這很聰明。我只是做Worksheet_Change並檢查單元格是否在數據透視表的報表過濾器範圍內。您可以檢查命名的範圍,或以編程方式確定報告過濾器範圍。我會做第一個,除非數據透視表可能會移動。 – 2012-03-13 18:11:48
關於過濾器的更改,我不得不使用'PivotTable_Update'事件和'Worksheet_Change'事件的組合來捕獲它,因爲無法將過濾器與表的其餘部分隔離。數據透視表中的任何更改(不僅在過濾器中)都觸發宏。關於'for-loop',我不明白你爲什麼會遇到'13'錯誤,我從來沒有得到它。另一方面,我確定我一直在對「PivotItems」做一個不好的參考。實際的'PivotField'是一個'RowField',它是第二個層次結構。在實際的代碼中,我是用名字來引用它,這可能是一個問題。 – Pragabhava 2012-03-13 18:16:03