Power Pivot表格 - 循环遍历报告筛选器中的字段

10
免责声明: 此问题最初发布于msdn论坛,但由于我没有得到任何回复(出人意料),所以我也在这里发布了。在尝试解决此问题之前,您可能会想要检查一下该链接。如果该链接中已经发布了解决方案,我不希望您浪费时间 :)

问题: 我想找出报告筛选器中的字段名称。因此,我正在寻找RegionCountryNameCitynameProductKey。报告筛选器是动态的,可能会更改。

截图:

enter image description here

我的尝试: 我已经检查了Power Pivot的每个属性,但我没有找到可以让我循环遍历Power Pivot字段的属性。

我甚至尝试了这段代码,但显然它在Set pf = pt.PageFields(1)上给我报错了。

Sub Sample()
    Dim pt As PivotTable, pi As PivotItem, pf As PivotField
    Dim lLoop As Long

    Set pt = Sheet1.PivotTables(1)
    Set pf = pt.PageFields(1)

    For Each pi In pf.PivotItems
        Debug.Print pi.Name
    Next pi
End Sub

错误截图

此处输入图片描述

那么我错过了什么?或者我应该采取不同的方法吗?

编辑

如果有人想尝试它,可以从这里下载文件。 我正在查看Inventory表。


这只是一个快速尝试,但为什么PivotField.PivotFilters属性在这里不起作用呢? - Aaron Thomas
感谢您对此进行了尝试。pf.PivotFilters.Count返回0 :) - Siddharth Rout
3个回答

3

经过一些测试,发现可以通过列举PivotFields并检查它们的Orientation属性的值是否等于XlPageField来获取页面筛选器字段列表。请尝试下面的代码:

Sub Test()
    Dim pt as PivotTable
    Dim pf as PivotFields
    set pt=Sheets("test").PivotTables(1)
    For each pf in pt.PivotFields
        If pf.Orientation=xlPageField Then 
            Debug.Print  pf.Name
        End If
    Next pf
End Sub

希望这能有所帮助。

感谢您的回答,但这不是普通的数据透视表,而是 Power Pivot。行For each pf in pt.PivotFields使我遇到了“运行时错误13,类型不匹配”。如果您想尝试一下,可以从此处下载。 - Siddharth Rout
很抱歉它没有帮助,从我所阅读的内容来看,PowerPivot 似乎使用 CubeFields,但我无法测试。你试过了吗? - flaberenne
我想你忘记了提到链接。 - Siddharth Rout
嗨,这是其中一个链接:link - flaberenne

1
如果您在 realce_net 的帖子中将 pt.pivotfields 更改为 pt.pagefields,它应该可以运行。正如 Microsoft 参考所说,pagefields 是在 Office 2013 中引入的。
    Dim pt As PivotTable
    Dim pf As PivotFields
    Set pt = Sheets("test").PivotTables(1)
    For Each pf In pt.PageFields
        If pf.Orientation = xlPageField Then
            Debug.Print pf.Name
        End If
    Next pf

1

原问题提出已经超过两年了,但我仍然没有找到令人满意的答案...

但我找到了一个解决方法 :-) 您也可以通过切片器更改PowerPivot表。

我使用了这段代码来更改文件中选择的月份:

Private Sub SpinButton21_SpinDown()
 Dim SC As SlicerCache
 Dim SL As SlicerCacheLevel
 Dim SI As SlicerItem

 Set SC = ActiveWorkbook.SlicerCaches("Slicer_Month4")
 Set SL = SC.SlicerCacheLevels(1)

 'get the current item number
 c = 1
 For Each SI In SL.SlicerItems
    If SI.Selected = True Then
        MONTHindex = c
        Exit For
    End If
    c = c + 1
 Next SI
 If MONTHindex = 1 Then
    MONTHindex = SC.SlicerCacheLevels.Item.Count + 1
 End If
 SC.VisibleSlicerItemsList = SL.SlicerItems(MONTHindex - 1).Name
End Sub

我不是专业人士,但我希望它有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接