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
插入到表中。