数据透视表字段没有项目

时间:2016-08-08 09:53:33

标签: excel vba ms-access pivot-table

我正在研究Excel上的一系列数据透视表,我希望通过以下方式使特定的过滤器自动化:用户在一个单元格中输入特定值,并且相应地刷新工作簿中的所有过滤器。我一直在阅读Stack Exchange中的帖子,它解释了如何做到这一点。但是,我遇到了一个我无法解决的问题。

我的数据来自外部Microsoft Access数据库。我在数据库和Excel文件之间建立了联系;数据将导入Excel文件,并在其中显示为表tblExcel。然后,我的数据透视表将链接到此tblExcel

要刷新过滤器,我想使用以下行:

item.Visible = (item.Caption = cd)

其中itemPivotItems个对象,cd是用户输入的值。这条线路不起作用,所以我编写了以下子程序来检查一下:

Sub Test()

check = 0

For Each field In Application.ActiveWorkbook.Worksheets("Sheet1").PivotTables("PivotTable").PivotFields("[tblExcel].[Field1].[Field1]").PivotItems
    check = check + 1
Next

MsgBox check

End Sub 

事实证明,对于我的所有字段,MsgBox总是返回0,就像它们是空的一样。

有谁知道为什么会这样?是因为我的数据模型结构?我怎么能绕过它?

1 个答案:

答案 0 :(得分:0)

尝试以下代码,出于调试目的,您有一个InputBox,其中您记下希望PIVOT表过滤的 Field1 值。

Option Explicit
Public Sub Filter_PivotTable_Items()

Dim PvtTbl                              As PivotTable
Dim pvtFld                              As PivotField
Dim cd                                  As String

' setting the Pivot Table to a PivotTable Object
Set PvtTbl = ActiveWorkbook.Worksheets("Sheet1").PivotTables("PivotTable")

Application.ScreenUpdating = False

' set Pivot table to show only the selected Project's Data
Set pvtFld = PvtTbl.PivotFields("Field1")

' select manually the value for Field 1 >> for debug purpose
cd = InputBox("Select Item")
Call SelectPivotItem(pvtFld, cd)

End Sub


Public Sub SelectPivotItem(Field As PivotField, cd As String)

Dim Item                            As PivotItem

On Error GoTo cd_Error
For Each Item In Field.PivotItems
    Item.Visible = (Item.Caption = cd)
Next

cd_Error:
If Err.Number = 1004 Then
    MsgBox "Item " & cd & " not found !"
    Exit Sub
End If

End Sub