Power Pivot表 - 循环报告过滤器中的字段

时间:2013-09-13 11:58:30

标签: excel excel-vba powerpivot vba

免责声明:这个问题发布在msdn forum,但由于我没有得到任何回复(令人惊讶),我也在这里交叉发布。在尝试尝试此问题之前,您可能需要检查该链接。如果在该链接中发布解决方案,我不希望您浪费您的时间:)

问题:我想在报告过滤器中找到字段名称。所以我正在寻找RegionCountryNameCitynameProductKey。报告过滤器是动态的,可以更改。

截图

enter image description here

我尝试了什么:我已经检查了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

错误Scre​​enShot

enter image description here

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

修改

如果有人想要试用它,可以从HERE下载该文件我正在查看Inventory表。

3 个答案:

答案 0 :(得分:3)

经过一些测试后,您似乎可以通过列出PivotFields并检查其Orientation属性的值是否等于XlPageField来获取Page filter字段列表。请尝试以下代码:

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

希望这有帮助

答案 1 :(得分:1)

如果您将pt.pivotfields更改为realce_net帖子中的pt.pagefields,则应该运行。正如微软的参考文献所述,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

答案 2 :(得分:0)

自提出原始问题以来已经过去了两年多,但我仍然找不到令人满意的答案......

但我找到了解决方法:-) 您也可以通过切片机更改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

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