数据透视项目自定义排序(行字段)

时间:2017-10-12 08:16:16

标签: vba excel-vba excel

我正在考虑这一段时间,以便在这里使用正确的循环。

我正在尝试在枢轴底部移动/分类那些水果,但是它们应该在底部确切的特定顺序( fruit1,fruit2,...,苹果,橙子,葡萄)。

但是,有可能在数据中可能不会出现底部3个水果中的一个,因此我无法从PivotItems.Count中减去其位置。

With pvt

   .PivotField("fruits").Orientation = xlRowField
   .RowAxisLayout xlTabularRow

   For Each pi In .PivotFields("fruits").PivotItems
      Select Case LCase(pi.Name)
         Case "apples", "oranges", "grapes"
            .PivotFields("fruits").PivotItems(pi.Name).Position = .PivotFields("fruits").PivotItems.Count
      End Select
   Next pi

End with

1 个答案:

答案 0 :(得分:1)

您需要根据自己的需要进行调整,但以下内容将为您的清单订购。它假设您在sheet2中按如下方式布置数据:

Data layout

它在Sheet7中创建了一个支点

Pivot Layout

Option Explicit
Public Sub CreateOrderedFruitPivot()

    Dim pc As PivotCache, pt As PivotTable, pi As PivotItem
    Dim varSubsOff, varItemList, varItem
    varSubsOff = Array(False, False, False, False, False, False, False, False, False, False, False, False)

    With ActiveSheet 'better to used named Sheet

        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
                                          "'Sheet2'!R1C1:R4C2", Version:=6).CreatePivotTable TableDestination:="Sheet7!R3C1", _
                                          TableName:="PivotTable2", DefaultVersion:=6

        Set pt = ThisWorkbook.Worksheets("Sheet7").PivotTables("PivotTable2")

        With pt

            .AddDataField .PivotFields("fruits"), "Count of fruits", xlCount

            With .PivotFields("fruits")
                .Orientation = xlRowField
                .Position = 1
            End With
            ActiveWorkbook.ShowPivotTableFieldList = False
            On Error Resume Next

            With .PivotFields("fruits")
                .PivotItems("(blank)").Visible = False
                varItemList = Array("Apples", "Oranges", "Grapes")

                For Each varItem In varItemList
                    Set pi = .PivotItems(varItem)
                    pi.Visible = True
                    pi.Position = .VisibleItems.Count
                    Set pi = Nothing
                Next varItem
                On Error GoTo 0
            End With

            pt.RowAxisLayout xlTabularRow
        End With

    End With

End Sub

您需要相应地修改您的工作表和范围(也请检查字段名称),但您真正感兴趣的部分如下:

 On Error Resume Next
 With .PivotFields("fruits")
                .PivotItems("(blank)").Visible = False
                varItemList = Array("Apples", "Oranges", "Grapes")

                For Each varItem In varItemList
                    Set pi = .PivotItems(varItem)
                    pi.Visible = True
                    pi.Position = .VisibleItems.Count
                    Set pi = Nothing
                Next varItem
                On Error GoTo 0
            End With

在这里,您按照要查看项目的顺序循环数组并添加它们,并且错误处理处理项目不存在。

致信Rory:Sorting pivot items因为我使用他的解决方案作为解决问题的框架。