2017-10-12 53 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