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