1

我正在使用下面的代码来更新数据透视表过滤器。
它只过滤日期字段下等于今天日期的项目。
它工作正常,但有没有更快的方法来做到这一点?

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

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

4

2 回答 2

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 创建的示例)。

样本数据

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

然后我创建了数据透视表并运行代码,如下图所示

数据透视表和宏

于 2013-10-14T17:02:52.260 回答
1

这是 Jaycal 建议的方法。
假设您在“数据透视表”中有一个数据透视表,过滤器位于 Range(“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

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

Edit1:如果您正在处理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
于 2013-11-11T06:41:36.610 回答