2014-08-27 296 views
1

我編譯了VBA代碼來過濾數據透視表中的每個名稱,然後調用其他子例程來操作和格式化表。這段代碼在過去對我來說非常完美,但是在更新源表並對數據透視表進行小的格式更改之後,它現在無法讓我了。Excel VBA自動篩選器樞軸表

下面是代碼:

Sub AutoFilterEachName() 

Piv_Sht = ActiveSheet.Name 
Sheets(ActiveSheet.Name).Select 
For Each PivotItem In ActiveSheet.PivotTables(1).PageFields(1).PivotItems 
ActiveSheet.PivotTables(1).PageFields(1).CurrentPage = PivotItem.Value 
Call PivotCopyFormatValues 
Call DeleteRows2 
Call DeleteRows2 
Call AddComment 
Call Move_Save_As 

Sheets(Piv_Sht).Select 

Next 
End Sub 

第一:行ActiveSheet.PivotTables(1).PageFields(1).CurrentPage = PivotItem.Value當代碼開始不更換過濾器的名稱過濾器的第一個值。

第二:例行程序到達Next時,它將轉至End Sub,並回到For Each一行。我曾嘗試加入Next PivotItem惠特沒有結果。所以它通過代碼運行一次並停止。

我在死路一條,所以任何幫助表示讚賞。

回答

0

對不起,延遲7個月迴應;如果你還需要幫助......我想,這可能會幫助你實現你正在尋找的結果:

Sub AutoFilterEachName() 

    Dim pTbl As PivotTable 
    Dim piv_sht As Worksheet 
    Dim i As Long 

    Set piv_sht = ThisWorkbook.ActiveSheet 
    Set pTbl = piv_sht.PivotTables(1) 

    piv_sht.Select 

    For i = 1 To pTbl.PageFields(1).PivotItems.Count 

     'set the PageField page equal to the name of the PivotItem at index i 
     'if you need to cycle through multiple PageFields, consider a nested For loop or For Each loop 
     pTbl.PageFields(1).CurrentPage = pTbl.PageFields(1).PivotItems(i).Name 

     Call PivotCopyFormatValues 
     Call DeleteRows2 
     Call DeleteRows2 
     Call AddComment 
     Call Move_Save_As 

     piv_sht.Select 

    Next i 

End Sub 

一個原因你For Next不執行,立即將End Sub是因爲你的PageFields是空的;如果沒有PageFields循環,那麼你的循環將立即退出。解決方法是始終確保至少有一個PageField。你可以通過你的For Loop才進入這個代碼實現這一點:

pTbl.PivotFields(1).Orientation = xlPageField 

這將在你的表中插入第一PivotFieldPageField