使一个工作表上的所有数据透视表在扩展和折叠行方面彼此模仿

时间:2012-09-10 13:37:08

标签: excel vba excel-2010 pivot-table

好吧,我是VBA的新手,但我知道这一定是可能的。我花了一段时间编写Android应用程序,但我不会称自己几乎是专家,可能甚至不是中间的诚实。但是,唉,excel不使用java。这是我的问题:

我需要的是在同一张纸上制作6个其他数据透视表,模仿我称之为主数据透视表的内容。它需要模仿的唯一特征(现在我想)是当主要扩展/崩溃时,其他人应该效仿。

我猜测代码将类似于java中的onclicklistener,当代码“听到”主要数据透视表中的折叠或扩展点击时,它只会将相同的折叠或扩展应用于其他六个。其他6个枢轴将始终具有相同的行标签,因此将点击的“位置”从主要部分转移到其他部分时出错应该永远不会成为问题。

我尝试在我的数据透视表中记录其中一个行标签的扩展,然后重新获得此代码。

ActiveSheet.PivotTables("PivotTable1").PivotFields("Year").PivotItems("2005"). _
    ShowDetail = True

我知道,这是执行扩展的编码(而ShowDetail = False会使其崩溃)。我认为我需要的就像我说的那样,听到“听到”主要数据透视表的任何扩展/折叠的点击,一种存储/携带有关点击的行标签的信息的方式(“位置”)如果你愿意的话,点击一下,然后用另一个6来执行上面代码的通用版本,我猜测它是一种for循环。

我是否在正确的轨道上削减任何帮助人员?一如既往地感谢你。

1 个答案:

答案 0 :(得分:4)

这应该适合你:

将它放在标准模块中(这是效率较低的方法 - 因为它会检查所有字段):

Sub LinkPivotTables_ByFieldItemName_ToShowDetail(pt As PivotTable)

Dim wkb As Workbook
Set wkb = ThisWorkbook

Dim wks As Worksheet
Set wks = wkb.Sheets(1)

Dim PivotTableIndex As Integer
Dim PivotFieldIndex As Integer
Dim PivotItemIndex As Integer

Dim PivotFieldIndexName As String
Dim PivotItemIndexName As String

Dim BoolValue As Boolean

Application.ScreenUpdating = False
Application.EnableEvents = False

On Error Resume Next

    For PivotFieldIndex = 1 To pt.PivotFields.Count

    PivotFieldIndexName = pt.PivotFields(PivotFieldIndex).Name

        For PivotItemsIndex = 1 To pt.PivotFields(PivotFieldIndex).PivotItems.Count

        PivotItemIndexName = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).Name
        BoolValue = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail

            For PivotTableIndex = 1 To wks.PivotTables.Count

                ' This If statement will dramatically increase efficiency - because it takes a long long time to set the value but it doesn't take long to check it.
                If wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndexName).PivotItems(PivotItemIndexName).ShowDetail <> BoolValue Then
                    wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndexName).PivotItems(PivotItemIndexName).ShowDetail = BoolValue
                End If

            Next PivotTableIndex

        Next PivotItemsIndex

    Next PivotFieldIndex


Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

然后要在任何数据透视表编辑中自动运行此宏,您需要将其放在Sheet1代码中(如果您需要帮助,请告诉我们)。

Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

    Call LinkPivotTables_ByFieldItemName_ToShowDetail(Target)

End Sub

如果所有数据透视表都在第一页上,它将起作用。您可能必须首先复制/粘贴到wordpad或其他文本编辑器,因为我不担心行长度限制(注意自动换行)。

EDIT / ADDITION:

这是将代码放在特定工作表对象上的方法: PutCodeOnSheetObject

EDIT2 / ADDITION2 - 效率方法:

此方法将大大提高效率,但您必须明确告诉它要同步哪个字段(它不会同步所有字段):

Sub LinkPivotTables_ByFieldItemName_ToShowDetail(pt As PivotTable)  'takes as argument - pt As PivotTable

Dim wkb As Workbook
Set wkb = ThisWorkbook

Dim wks As Worksheet
Set wks = wkb.Sheets(1)

Dim PivotTableIndex As Integer
Dim PivotItemIndex As Integer
Dim PivotFieldIndex As String
Dim BoolValue As Boolean
Dim ItemName As String

Application.ScreenUpdating = False
Application.EnableEvents = False

PivotFieldIndex = "Year"

On Error Resume Next


        For PivotItemsIndex = 1 To pt.PivotFields(PivotFieldIndex).PivotItems.Count

        BoolValue = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail
        ItemName = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).Name

            For PivotTableIndex = 1 To wks.PivotTables.Count

                ' This If statement will dramatically increase efficiency - because it takes a long long time to set the value but it doesn't take long to check it.
                If wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail <> BoolValue Then
                    wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail = BoolValue
                End If

            Next PivotTableIndex

        Next PivotItemsIndex

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

您必须在此行中手动告诉您要同步的字段:

PivotFieldIndex = "Year"

我在网上发现了其他几种使用相同循环方法来同步数据透视表的解决方案 - 问题是当你得到合适大小的数据透视表时,它们都会遇到相同的效率问题。这些问题通过包含一个在设置它之前检查Item.ShowDetail值的IF语句来解决这个问题(因为设置值需要的时间比检查它的时间长)。祝你好运。