Excel VBA自动筛选数据透视表

我编译了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惠特没有结果。 所以它通过代码运行一次并停止。

我在一个死胡同,所以任何帮助表示赞赏。

对不起,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循环,那么你的循环将立即退出。 解决方法是始终确保至less有一个PageField 。 您可以通过在For Loop之前input以下代码来实现此目的:

 pTbl.PivotFields(1).Orientation = xlPageField 

这会将第一个PivotField作为PageField插入到表中。