Excel VB代码将过滤器设置为一系列选项

Excel VB代码将过滤器设置为一系列选项,excel,vba,pivot-table,filtering,excel-2013,Excel,Vba,Pivot Table,Filtering,Excel 2013,我目前有一个数据透视表,它从SharePoint站点提取数据。对于这个数据透视表,我想使用一个按钮将过滤器设置为特定的日期范围。我使用此网站获取过滤器,将过滤器值更改为特定日期,代码如下: Sheets("Sheet2").Select ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").ClearAllFilters ActiveSheet.PivotTables("PivotTable1").PivotFields("Date

我目前有一个数据透视表,它从SharePoint站点提取数据。对于这个数据透视表,我想使用一个按钮将过滤器设置为特定的日期范围。我使用此网站获取过滤器,将过滤器值更改为特定日期,代码如下:

Sheets("Sheet2").Select
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").ClearAllFilters
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").CurrentPage = Date
这可以很好地将过滤器重置为当前日期,但我似乎找不到任何方法将过滤器设置为过去5天、10天或15天的所有日期,甚至无法将过滤器设置为当前月份的所有日期


非常感谢您的帮助。

鉴于您正试图将日期范围应用于您的报表筛选器,如.CurrentPage=date所示,您将需要遍历日期数据透视字段中的所有数据透视项,并根据您的日期范围进行测试

下面类似的内容未经测试:

Dim ws as Worksheet, pt as PivotTable, pf as PivotField, pi as PivotItem
Dim dStart as Date, dEnd as Date

dStart = #1/1/2015#
dEnd = #1/31/2015#

Set ws = Sheets("Sheet2")
Set pt = ws.PivotTables("PivotTable1")
Set pf = pt.PivotFields("Date")

With pf
   .ClearAllFilters
   For each pi in pf.PivotItems
      If pi.Value > = dStart And pi.Value <= dEnd Then 
         pi.Visible = True 'or maybe pi.Selected = True
      Else
         pi.Visible = False 'or maybe pi.Selected = False
      End If
   Next
End With

埃默森:你没有说你有什么版本的Excel。我使用的是Excel360,它提供了几种方法来直接过滤日期范围内的数据透视表

首先,如果日期字段恰好位于行或列区域,而不是特定情况下的过滤器/页面区域,则可以从过滤器下拉列表中选择日期过滤器选项:

其次,在Excel 2013或更高版本中有时间线:

正如Scott在上面的评论中正确地指出的那样,第一个选项仅在您要筛选的数据透视字段不是页面字段(即,它不在数据透视表字段列表的“筛选器”窗格中)时才直接起作用。因为如果它位于“过滤器”窗格中,则不会获得上面显示的任何过滤器选项,如以下屏幕截图所示:

但有一个简单的解决方法:只需将其从数据透视表中拖出,因为实际上您仍然可以对数据透视表中不存在的字段进行筛选:

当我设置“中间”过滤器时,启动宏记录器会产生以下代码:

ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").PivotFilters.Add2 _
        Type:=xlDateBetween, Value1:="23/12/2015", Value2:="31/12/2015"
这是一个通用版本,它会将任何日期数据透视字段过滤到您想要的最后一个X:

Sub LastXDays(lDays As Long, Optional pf As PivotField)

Dim StartDate As Date
Dim EndDate As Date
EndDate = Date
StartDate = EndDate - lDays + 1
If pf Is Nothing Then
    On Error Resume Next
    Set pf = ActiveCell.PivotField
    If Err.Number <> 0 Then GoTo errhandler

    On Error GoTo errhandler
End If
If Not IsDate(pf.PivotItems(1)) Then GoTo errhandler
pf.ClearAllFilters
pf.PivotFilters.Add2 _
    Type:=xlDateBetween, _
    Value1:=CStr(StartDate), _
    Value2:=CStr(EndDate)

errhandler:

End Sub 

如果不清楚您是否需要更多帮助来实现此功能,请发回。

您可以发布示例数据吗?使用该数据更容易测试您的代码吗?Scott:遍历数据透视项的速度非常慢:根据我在上一篇文章中的说法,即使对于一个小的数据透视表,这也可能需要很多分钟,即使在运行以下所有代码段之前将pt.ManualUpdate=True,数据透视表也不会在每次更改后尝试更新。抱歉,这应该是这样的:遍历数据透视项的速度非常慢:根据我在dailydoseofexcel.com/archives/2013/11/14/…对于中等大小的数据透视字段来说,这可能需要很多分钟,例如,即使在运行代码时将pt.ManualUpdate=True设置为20000,字段中的项目也可能需要很多分钟。诚然,您不会经常遇到数据透视表中有几百个以上的离散日期。但总的来说,当您可以使用“中间”过滤器时,避免迭代是值得的。@jeffreyweir-请删除您的反对票。在代码中,OP演示了他询问如何过滤ReportFilter,请参见.CurrentPage=Date,而不是列或行标签上的过滤器。如果是在列/行标签中,则您的注释是有意义的,但由于您不能在ReportFilter部分中过滤日期,因此您的注释不适用。不过,多亏了你的便条,我的回答才更清楚了。你的便条很有帮助:@ScottHoltzman–谢谢。你提供的东西很有用。我甚至可以对它进行一些修改,让它在当前日期和当前日期——5天、10天或15天内运行。我唯一要解决的问题是在过滤完成时发生的类型不匹配错误。有什么建议吗?斯科特:你说得对。时间线允许您设置一个中间日期,所以我将很快发布一些使用它们的代码。但是,在相当大的数据轴上,您的代码可以显著提高效率。首先,应该在循环之前将.ManualUpdate设置为TRUE,否则数据透视表将在每个项目都隐藏/取消隐藏后刷新。其次,您应该测试是否需要更改.visible状态,因为更改.visible状态所需的时间比读取它所需的时间要长得多。您的代码可以工作,但两个简单的调整将使其工作效率提高一个数量级。
Sub Last5Days()
LastXDays 5, ActiveSheet.PivotTables("PivotTable1").PivotFields("Date")
End Sub