1

我正在尝试根据这些行的值的排序对数据透视表中的项目进行分组。我正在尝试根据这些数据建立一个帕累托图。我已经在 SO 和 google 上查看了许多问题,但找不到太多帮助......不幸的是,这看起来并不是一个真正常见的问题。

示例

原始枢轴

State  |  Count
AK     |  14
AL     |  76
AR     |  40
AZ     |  129
CA     |  2666
CO     |  244
CT     |  61

排序枢轴

State  |  Count
CA     |  2666
CO     |  244
AZ     |  129
AL     |  76
CT     |  61
AR     |  40
AK     |  14

分组/最终枢轴

State  |  Count
CA     |  2666
CO     |  244
AZ     |  129
OTHER  |  191

我以前从未在 VBA 中进行过枢轴排序/分组(但手动执行此操作相当简单),所以我开始录制宏。我首先想出了如何应用排序,但是尝试分组给了我这样的东西:

ActiveSheet.PivotTables("PT7").PivotSelect _
    "State[AL,CT,AR,AK] Original 'NON-AA'", _
    xlDataAndLabel + xlFirstRow, True

这样做的问题是状态是基于枢轴中的值进行硬编码的。如果我想在不同状态低于阈值的另一组数据上运行此分组(前 3 行,而不是 的实际值count),则将包括错误的状态。

有没有办法只读取顶部/底部x行数,而无需知道它们对应的行标签?

我想要这样的工作(使用行号而不是标题/标签):

ActiveSheet.PivotTables("PT7").PivotSelect _
    "State[4, 5, 6, 7] Original 'NON-AA'", _
    xlDataAndLabel + xlFirstRow, True
4

2 回答 2

1

我相信这样做:

Sub GroupLowerPivotItems()
Dim pt As Excel.PivotTable
Dim ptField As Excel.PivotField
Dim ptItem As Excel.PivotItem
Dim GroupStart As Long
Dim FirstCell As Excel.Range
Dim LastCell As Excel.Range

GroupStart = 4
Set pt = ActiveSheet.PivotTables(1)
Set ptField = pt.PivotFields("State")
Set ptItem = ptField.PivotItems(GroupStart)
Set FirstCell = ptItem.LabelRange
Set ptItem = ptField.PivotItems(ptField.PivotItems.Count)
Set LastCell = ptItem.LabelRange
pt.Parent.Range(FirstCell, LastCell).Group
End Sub
于 2013-01-25T16:05:10.120 回答
0

我相信我已经自己解决了这个问题——需要重构。

Dim iFilterLoop As Integer
Dim vValue2List As Variant
Dim sValue2List As String


vValue2List = ActiveSheet.PivotTables("PT7").RowRange.Value2
sValue2List = ""

'Here's the key step in reading the string values:
For iFilterLoop = 4 To ActiveSheet.PivotTables("PT7").RowRange.Count ' Get all but the top 3 -- skip the first (start at 4), since that's the title
    sValue2List = sValue2List & vValue2List(iFilterLoop, 1) & ","
Next iFilterLoop

sValue2List = Left(sValue2List, Len(sValue2List) - 1)

ActiveSheet.PivotTables("PT7").PivotSelect( _
"State[" & sValue2List & "] Original 'NON-AA'", _
xlDataAndLabel + xlFirstRow, True).Group    
于 2013-01-25T16:19:24.867 回答