2016-06-20 73 views
0

我想讓我的宏以特定順序(按季度/年 - 請參閱下面的代碼)排列我的透視圖的行標籤。根據以下代碼,宏將運行的一些數據將不包含任何所有行標籤 - 這就是爲什麼我插入「on error goto 0」的原因。按固定順序排列透視行標籤

不幸的是,只有一些數據/季度按照以下代碼以正確的順序排列。

任何人都可以幫助顯示我做錯了什麼?

With ActiveSheet.PivotTables("PivotTable1").PivotFields("Issue Quarter") 
On Error Resume Next 
    .PivotItems("Q1 2014").Position = 1 
    .PivotItems("Q2 2014").Position = 2 
    .PivotItems("Q3 2014").Position = 3 
    .PivotItems("Q1 2015").Position = 4 
    .PivotItems("Q2 2015").Position = 5 
    .PivotItems("Q3 2015").Position = 6 
    .PivotItems("Q4 2015").Position = 7 
    .PivotItems("Q1 2016").Position = 8 
    .PivotItems("Q2 2016").Position = 9 
    .PivotItems("Q3 2016").Position = 10 
    .PivotItems("Q4 2016").Position = 11 
On Error GoTo 0 
End With 

回答

1

如果至少有一個項目已經丟失(和晚一點的任何項目都存在),那麼你的代碼會搞亂...的順序

儘管此代碼它不是這樣,我會做到這一點,它應該是自解釋)

With ActiveSheet.PivotTables("PivotTable1").PivotFields("Issue Quarter") 
    Dim i As Byte 
    i = 1 
    On Error Resume Next 
    .PivotItems("Q1 2014").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q2 2014").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q3 2014").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q1 2015").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q2 2015").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q3 2015").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q4 2015").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q1 2016").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q2 2016").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q3 2016").Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    .PivotItems("Q4 2016").Position = i 
    On Error GoTo 0 
End With 

一個不太明顯的方式(這是更短的,但不相同):

With ActiveSheet.PivotTables("PivotTable1").PivotFields("Issue Quarter") 
    Dim i As Byte, x As Variant: i = 1 
    On Error Resume Next 
    For Each x In Array("Q1 2014","Q2 2014","Q3 2014","Q1 2015","Q2 2015","Q3 2015","Q4 2015","Q1 2016","Q2 2016","Q3 2016","Q4 2016") 
    .PivotItems(x).Position = i 
    If Err.Number Then Err.Clear Else i = i + 1 
    Next 
    On Error GoTo 0 
End With 

編輯

只是爲了顯示一種方式來做到沒有錯誤;)(它會排序所有看起來像「Q? ????」與最低的季度最早今年第一個和最後一年的最高季度最後一個/ - > Q1 2013 ... 2013年第四季度,2014年第一季度... Q4 2016)

Dim x, y() As Double, i As Long 
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Issue Quarter") 
    ReDim y(1 To .PivotItems.Count) 
    For Each x In .PivotItems 
    If x Like "Q? ????" Then 
     i = i + 1 
     y(i) = Right(x, 4) & "." & Mid(x, 2, 1) 
    End If 
    Next 
    If i = 0 Then Exit Sub 
    ReDim Preserve y(1 To i) 
    For i = 1 To UBound(y) 
    x = Application.Small(y, i) 
    x = "Q" & Right(x * 10, 1) & " " & Int(x) 
    .PivotItems(x).Position = i 
    Next 
End With 
0

你也可以只是順序顛倒,把每個項目在第一個位置:

With ActiveSheet.PivotTables("PivotTable1").PivotFields("Issue Quarter") 
    On Error Resume Next 
    .PivotItems("Q4 2016").Position = 1 
    .PivotItems("Q3 2016").Position = 1 
    .PivotItems("Q2 2016").Position = 1 
    .PivotItems("Q1 2016").Position = 1 
    .PivotItems("Q4 2015").Position = 1 
    .PivotItems("Q3 2015").Position = 1 
    .PivotItems("Q2 2015").Position = 1 
    .PivotItems("Q1 2015").Position = 1 
    .PivotItems("Q4 2014").Position = 1 
    .PivotItems("Q3 2014").Position = 1 
    .PivotItems("Q2 2014").Position = 1 
    .PivotItems("Q1 2014").Position = 1 
    On Error GoTo 0 
End With 

順便說一句,你似乎已經錯過了2014年第四季度