Excel VBA自动筛选器数据透视表

时间:2014-08-27 20:34:46

标签: excel vba excel-vba pivot-table

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

我处于死胡同,所以感谢任何帮助。

1 个答案:

答案 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