按固定顺序排列枢轴行标签

时间:2016-06-20 08:49:32

标签: excel vba excel-vba pivot-table

我想让我的宏按特定顺序排列我的支点的行标签(按季度/年 - 请参阅下面的代码)。根据下面的代码,将运行宏的一些数据将不包括任何所有行标签 - 这就是我插入“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

2 个答案:

答案 0 :(得分: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?????&#34的枢轴项目进行排序;在最早的一年中最低的季度排在第一位和最后一位年度最高季度/ - >> 2013年第一季度... 2013年第四季度,2014年第一季度...... 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

答案 1 :(得分: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年第四季度。