如何更好地更新数据透视表数据过滤器?

时间:2013-10-14 08:28:16

标签: excel excel-vba excel-2007 vba

我正在使用以下代码更新数据透视表过滤器 它仅过滤日期字段下等于今天日期的项目 工作正常,但有更快的方法吗?

Dim wsPivot1 as Worksheet
Dim pt as PivotTable
Dim pt_item as PivotItem

Set wsPivot1 = Thisworkbook.Sheets("Pivot")

For Each pt In wsPivot1.PivotTables
    pt.RefreshTable
    If DatePart("h", Now()) < 6 Then
        date_stamp = Format(Now() - 1, "m/d/yyyy")
    Else
        date_stamp = Format(Now(), "m/d/yyyy")
    End If
    If pt.Name = "PivotTable1" Then
        pt.PivotFields("Date_Adj").ClearAllFilters
        For Each pt_item In pt.PivotFields("Date_Adj").PivotItems
            Select Case pt_item.Name
            Case date_stamp
                pt_item.Visible = True
            Case Else
                pt_item.Visible = False
            End Select
        Next pt_item
    End If
Next pt

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

由于您似乎只想显示一个日期并隐藏其余日期,因此您可以为该日期创建自定义过滤器。替换for循环,即

For Each pt_item In pt.PivotFields("Date_Adj").PivotItems
    Select Case pt_item.Name
        Case date_stamp
            pt_item.Visible = True
        Case Else
            pt_item.Visible = False
    End Select
Next pt_item

使用此行

pt.PivotFields("Date_Adj").PivotFilters.Add _
    Type:=xlSpecificDate, Value1:=date_stamp

请注意,只有“Date_Adj”列中的值存储为日期时,上述代码才有效。如果不是,则需要使用这行代码

pt.PivotFields("Date_Adj").PivotFilters.Add _
    Type:=xlCaptionEquals, Value1:=date_stamp

示例 了解我的示例数据可能过于简单,这是我用来测试我的解决方案(注意:使用Excel 2007创建的示例)。

Sample Data

“发货日期”是输入日期; “Date_Adj”只是左相邻单元格+ 1(例如=B2+1)。

然后我创建了Pivot表并运行了代码,如下图所示

Pivot Table and Macro

答案 1 :(得分:1)

这是Jaycal建议的方法 假设您在“Pivot”工作表中有一个数据透视表,其中过滤器在范围(“A2”)中。

此代码有效:

Dim wsPivot1 as Worksheet
Dim cel as Range


Set wsPivot1 = Thisworkbook.Sheets("Pivot")
Set cel = wsPivot1.Range("A2")

cel.PivotField.PivotFilters.Add xlCaptionEquals, "Date_Adj", date_stamp

但它有一个限制 它仅适用于行和列标签中的过滤器 不在报告过滤器上。

编辑1:如果您正在使用Report Filters

,请使用此功能
Dim pt As PivotTable

For Each pt in wsPivot1
    pt.RefreshTable
    pt.PivotFields("Date_Adj").ClearAllFilters
    pt.PivotFields("Date_Adj").CurrentPage = date_stamp
Next