我正在研究Excel上的一系列数据透视表,我希望通过以下方式使特定的过滤器自动化:用户在一个单元格中输入特定值,并且相应地刷新工作簿中的所有过滤器。我一直在阅读Stack Exchange中的帖子,它解释了如何做到这一点。但是,我遇到了一个我无法解决的问题。
我的数据来自外部Microsoft Access数据库。我在数据库和Excel文件之间建立了联系;数据将导入Excel文件,并在其中显示为表tblExcel
。然后,我的数据透视表将链接到此tblExcel
。
要刷新过滤器,我想使用以下行:
item.Visible = (item.Caption = cd)
其中item
是PivotItems
个对象,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,就像它们是空的一样。
有谁知道为什么会这样?是因为我的数据模型结构?我怎么能绕过它?
答案 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