我编译了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 :(得分: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
这会在表格中插入第一个PivotField
PageField
。