2015-05-19 24 views
0

我試圖設置幾個簡單的按鈕來過濾工作簿中多個工作表上的多個樞軸。這裏沒什麼特別的!這些樞紐不共享一個共同的資源,所以切片機不適合我。但都分享我想要過濾的通用字段名稱。 (F8)但是如果我嘗試直接運行它(F5),則會出現「代碼執行已被中斷」的錯誤,調試器會突出顯示第一個下一個。如果我註釋掉修改過濾器的那一行,那麼無論我以哪種方式執行,函數都可以正常運行。請幫助?Excel VBA樞軸功能在穿越時起作用,但在運行時不起作用

Sub troubleshoot() 

Dim wks As Worksheet, strName As String, pvt As PivotTable, strPvtName As String 

For Each wks In Worksheets 
    strName = wks.Name 
     For Each pvt In wks.PivotTables 
     strPvtName = pvt.Name 
     Debug.Print strName + "/" + strPvtName 
     Sheets(strName).PivotTables(strPvtName).PivotFields("OrderSubType").ClearAllFilters 
    Next 
Next 

Set wks = Nothing 
Set pvt = Nothing 

End Sub 
+0

有沒有試過用'FOR i'&'FOR j'而不是2'FOR EACH'?有時,當您修改引用的對象或內容時,FOR EACH停止工作 –

+0

順便說一句,此行'Sheets(strName).PivotTables(strPvtName).PivotFields(「OrderSubType」)。ClearAllFilters'可以被'pvt替換。 PivotFields(「OrderSubType」)。ClearAllFilters'因爲您已經有了對數據透視表對象的引用 –

+0

縮短行的好處。我在某個時候曾經這樣做過,但在嘗試排除故障時不斷改變這些問題。 回覆:您的其他建議使用i&j,我需要做一些類似於 的'For i = 1 To ThisWorkbook.Worksheets.Count' for the first loop,right?但是我還沒有能夠想出正確的方法來獲得給定電子表格中的數據透視表的類似計數以用於第二個循環中的j?我知道VBA足夠讓自己陷入困境...... –

回答

0

這是一種使用2 for循環來檢查所有數據透視表,並清除所有過濾器上的「OrderSubType」字段(當該字段存在)。我也有一些錯誤處理。

Public Sub troubleshoot() 

    Application.ScreenUpdating = False 
    On Error GoTo EndOfSub 

    Dim wks As Worksheet, pvt As PivotTable, pvts As PivotTables 
    Dim i As Integer, j As Integer 

    For i = 1 To ThisWorkbook.Sheets.Count 
     Set wks = ThisWorkbook.Sheets(i) 
     Set pvts = wks.PivotTables 'GET PIVOTTABLES COLLECTION 
     For j = 1 To pvts.Count 
      Set pvt = pvts(j) 
      Debug.Print wks.Name + "/" + pvt.Name 
      If PivotContainsField(pvt, "OrderSubType") Then 
       pvt.PivotFields("OrderSubType").ClearAllFilters 'CLEAR FILTERS 
      Else 
       Debug.Print "OrderSubType field not found in : " + pvt.Name 
      End If 
     Next j 
    Next i 

    Set wks = Nothing 
    Set pvt = Nothing 

EndOfSub: 
    Application.ScreenUpdating = True 
    If Err.Number <> 0 Then 
     MsgBox "Error : " & Err.Description 
    End If 
End Sub 

Public Function PivotContainsField(pvt As PivotTable, fieldName As String) As Boolean 
On Error Resume Next 
    pvt.PivotFields (fieldName) 
    PivotContainsField = (Err.Number = 0) 
On Error GoTo 0 
End Function 
相關問題