Excel VBA将透视表项移动到最后一个位置

31moq8wy  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(253)

我有一个数据透视表,其中有一组国家,但表中的一个项目是一个名为"其他"的组。我想按降序对表进行排序,但项目"其他"应该始终在最后。我尝试先按降序排序,然后手动覆盖"其他"的位置,但每当我这样做时,整个表的顺序再次更改...

ActiveSheet.PivotTables(tblname).PivotFields("Country").AutoSort xlDescending, "Sum of Weight"

这个很好用。

ActiveSheet.PivotTables(tblname).PivotFields("Country").PivotItems("Other").Position = 8

这会将"其他"移到最后一个位置,但同时会更改所有其他先前排序项目的顺序。

7fyelxc5

7fyelxc51#

我相信有更干净的方法来做到这一点,但您可以尝试以下方法:

Sub Tester()
    Dim pt As PivotTable, pf As PivotField
    
    Set pt = ActiveSheet.PivotTables(1) 'for example
    Set pf = pt.PivotFields("Country")
    pf.AutoSort xlDescending, "Sum of Weight"
    
    'pf.PivotItems("Other").Position = pf.PivotItems.Count 'problem
    MoveLast pf, "Other"
End Sub

'Move the item `piName` to the last position for pivotfield `pf`
Sub MoveLast(pf As PivotField, piName As String)
    Dim arr, i As Long, pi As PivotItem
    ReDim arr(1 To pf.PivotItems.Count)
    i = 0
    'store current field postions in an array, with the
    '  specified one at the end (if found)
    For Each pi In pf.PivotItems
        Select Case pi
            Case piName: arr(UBound(arr)) = pi
            Case Else:
                i = i + 1
                arr(i) = pi.Caption
        End Select
    Next pi
    'Debug.Print "------" & vbLf & Join(arr, vbLf)
    For i = 1 To UBound(arr)
        pf.PivotItems(arr(i)).Position = i
    Next i
End Sub

相关问题