使用VBA在Excel中按字母顺序排列数据透视表下拉列表中的值

使用VBA在Excel中按字母顺序排列数据透视表下拉列表中的值,vba,excel,excel-2007,pivot-table,Vba,Excel,Excel 2007,Pivot Table,如果设置了透视表,单击字段的下拉列表,并查看显示的值过滤器部分,我希望它按字母顺序显示。例如,如果字段是states,我有轴显示在密苏里州、俄克拉荷马州。。。这让我很难找到我想要的。或者,想象一个日期字段,当您尝试筛选时,其中的日期是完全随机的 我在谷歌上搜索了如何按字母顺序排列这个列表,发现大多数解决方案都不理想,也就是说,可能没有任何好的方法可以在Excel中实现这一点。我正在寻找解决方案,特别是那些涉及VBA的解决方案,因为我有许多透视表,其中一些具有许多不同的字段,我希望修复这些透视表。

如果设置了透视表,单击字段的下拉列表,并查看显示的值过滤器部分,我希望它按字母顺序显示。例如,如果字段是states,我有轴显示在密苏里州、俄克拉荷马州。。。这让我很难找到我想要的。或者,想象一个日期字段,当您尝试筛选时,其中的日期是完全随机的

我在谷歌上搜索了如何按字母顺序排列这个列表,发现大多数解决方案都不理想,也就是说,可能没有任何好的方法可以在Excel中实现这一点。我正在寻找解决方案,特别是那些涉及VBA的解决方案,因为我有许多透视表,其中一些具有许多不同的字段,我希望修复这些透视表。如果这是唯一的选择,那么手动操作只是少数人的选择

要清楚的是,我不是说对数据透视表本身进行排序。我知道怎么做。我说的是在下拉列表的值过滤器部分对值进行排序,这样我就可以轻松地将数据透视表过滤到我关心的特定类别


我使用的是Excel 2007。

事实证明,当某个字段位于过滤器中时,您无法对其执行任何操作。但是,当项目位于行中时,您可以对其进行排序。因此,一种解决方案是将某些内容从筛选器移到行,然后进行排序,然后将其移回筛选器。如果你有一些事情要做,这没关系。但是,即使这样,如果附近有任何其他单元格的数据在数据透视表更改大小后将被覆盖,则手动执行此操作非常困难

但是,使用VBA,即使字段位于透视表的字段部分,也可以对字段进行排序

For Each ws In ThisWorkbook.Worksheets
    For Each pt In ws.PivotTables

        pt.ManualUpdate = True

        For Each pf In pt.PivotFields
            pf.AutoSort xlAscending, pf.Name
        Next pf

        pt.ManualUpdate = False

    Next pt

Next ws

行动有点晚,但这对我很有用。。 继GeoffDS之后,如果您只想对数据透视表的“Filters”部分中的字段进行排序,则可以添加If语句,将排序限制为pf.orientation为“xlPageField”的字段。使用SourceName而不是Name排序也更安全,因为SourceName是固定的,但是用户可以更改名称,从而导致例程崩溃

其他pf.方向为xlRowField、xlColumnField、xlDataField,用于已用字段,xlHidden用于未用字段

For Each ws In ThisWorkbook.Worksheets
    For Each pt In ws.PivotTables

        pt.ManualUpdate = True

        For Each pf In pt.PivotFields
           If pf.Orientation = xlPageField then

              pf.AutoSort xlAscending, pf.SourceName

           End If
        Next pf

        pt.ManualUpdate = False

    Next pt

Next ws

在您的问题中添加一个示例屏幕截图会有所帮助。此外,还提供了一些代码来显示您尝试过的内容。您是否想过在过滤范围内(应用过滤器之前)迭代下拉列表并使用VBA选择值?过滤的条件是什么?