2017-10-12 68 views
0

我一直在想这一段时间,现在正确的循环在这里使用。自定义排序数据透视项目(rowfield)

我正试图移动/排列这些水果的枢纽底部,但他们应该在底部(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 
+0

你能发布更多的代码吗? – QHarr

+0

抱歉,“PivotField”在行中,而不是列。 – kulapo

回答

0

您将需要调整以适应您的需求,但以下内容将排列您的列表。它假定你的数据布局为在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 

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

学分转到罗里这里:Sorting pivot items因为我用他的解决方案作为接近你的问题的框架。

+0

很高兴帮助。 :) – Rory

+0

调整结束时的项目位置,例如PivotFields(“PivotTable2”)。PivotFields(“Fruit”).PivotItems(“Grapes”_ ).Position = ActiveSheet.PivotTables(“PivotTable2”).PivotFields(“Fruit”).PivotItems.Count,Oranges would计数-1,苹果计数-2等等,并仍然使用错误处理来处理丢失的项目。不需要阵列。 – QHarr

+0

我只是根据你的回答找到答案。它不需要任何错误处理导致缺少的项目。感谢@QHarr的输入=) – kulapo