【问题标题】:excel vba - sort pivot table if filter is changedexcel vba - 如果过滤器更改,则对数据透视表进行排序
【发布时间】:2017-10-01 03:00:21
【问题描述】:

有没有办法在每次更改数据透视表的给定过滤器时自动对数据透视表进行排序?

我想按第三列中的降序对数据透视表进行排序。此表的过滤器每月更新一次。因此,我不想每次都手动对其进行排序。

这是我手动操作时的 vba 代码。

Sub example()
'
' example Macro
'
    Range("BO12").Select
    'change period filter from "3" to "4"
    With ActiveSheet.PivotTables("PivotTable2").PivotFields("Period")
        .PivotItems("3").Visible = True
        .PivotItems("4").Visible = False
    End With
    'sort the table in descending order by the values in the 3rd column
    ActiveSheet.PivotTables("PivotTable2").PivotFields("Channel").AutoSort _
        xlDescending, "Sum of Shares", ActiveSheet.PivotTables("PivotTable2"). _
        PivotColumnAxis.PivotLines(3), 1
End Sub

有没有办法自动化这个?

相关表格的图片:

我尝试过的都无济于事。

Private Sub SortTables(ByVal Target As Range)
'
' SortTables Macro
'
'
    Range("D12").Select
    If Target.Name = "PivotTable3" Then
    ActiveSheet.PivotTables("PivotTable3").PivotFields("Channel").AutoSort _
        xlDescending, "Sum of Shares", ActiveSheet.PivotTables("PivotTable3"). _
        PivotColumnAxis.PivotLines(3), 1
    End If
End Sub

【问题讨论】:

  • 您想让数据透视表按照第 3 列排序?第三列PivotFields.Name 是什么?是"Channel" 吗?你想按"Channel" 值对它们进行排序吗?
  • 第三列包含最近一个月的数据。 “期间”=“4”,即四月。见图片。
  • 好的,所以您想根据"Period" = "4" 以降序对"Sum of Shares" 进行排序?输出应该是7.11 , 1.18, 0.77, 0.32, 0.02 ?
  • 正确! "Period" = "4" 的数据在第 3 列。

标签: vba excel sorting pivot-table


【解决方案1】:

试试下面的代码,它会根据PivotFields("Period").PivotItems("3")Sort 的值(您可以稍后轻松修改它以满足您的需要)。

代码

Option Explicit

Sub example()

Dim PivTbl          As PivotTable
Dim PivFld          As PivotField
Dim RngKey1         As Range

' set the Pivot Table to an object
Set PivTbl = ActiveSheet.PivotTables("PivotTable2")

'change period filter from "3" to "4"
With PivTbl
    With .PivotFields("Period")
        .PivotItems("3").Visible = True
        .PivotItems("4").Visible = False
    End With

    ' set "Period" to a PivotField Object
    Set PivFld = .PivotFields("Period")

    ' set the SortRange to PivotItem "3" of PivotField "Period"
    Set RngKey1 = PivFld.PivotItems("3").DataRange

    ' sort the Pivot Table's values in escending order, according to PivotItem "3" column
    PivFld.PivotItems("3").DataRange.Sort key1:=RngKey1, Order1:=xlDescending, Type:=xlSortValues, Orientation:=xlTopToBottom
End With

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2015-11-15
    • 1970-01-01
    相关资源
    最近更新 更多