【发布时间】:2018-08-26 23:41:47
【问题描述】:
希望将数据透视表过滤到某个日期范围内。日期过滤器位于数据透视表的顶部,主表有 3 列。我有一张带有实际示例的图片,但无法在此处上传。
如果我输入的日期范围是 2018 年 2 月 1 日 - 2018 年 3 月 1 日,过滤器就可以完美运行。 如果我输入 2018 年 2 月 1 日至 2018 年 2 月 28 日的日期范围,则过滤器会漏掉 2 月 3 日至 2 月 9 日,然后重新拾取 2 月 10 日的其余数据。
不同的日期范围会产生这种行为的变体。
根据我的在线研究,VBA 中的这种类型的过滤存在某种错误,即代码以美国日期格式读取数据,而不管 Excel 设置和数据本身如何(因此格式化代码,没有它会导致不匹配错误)。我在网上看到了一些解决方法,例如使用 CLng,但下面的方法是我所拥有的最接近的方法。
- 数据透视表本身位于名为“数据透视”的工作表上。列 A-C,单元格 B2 中的日期,第 4 行中的主表格标题。
- 日期范围在名为“Paretos”的工作表上,单元格参考如下。
- 我在这里处理的表是 PivotTable1
Sub FilterPivotDates()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim ws As Worksheet, ws2 As Worksheet, pt As PivotTable, pf As PivotField, PI As PivotItem
Dim FromDate As Date, ToDate As Date
Set ws = ThisWorkbook.Worksheets("Pivots")
Set ws2 = ThisWorkbook.Worksheets("Paretos")
FromDate = ws2.Range("B1").Value
ToDate = ws2.Range("E1").Value
pivno = 1
MCCol = 25
Set pt = ws.PivotTables("PivotTable" & pivno)
Set pf = pt.PivotFields("Date")
'On Error Resume Next
Do While pivno < 2 '25
Set pt = ws.PivotTables("PivotTable" & pivno)
Set pf = pt.PivotFields("Date")
pt.PivotFields("Date").ClearAllFilters
With pf
For Each PI In pf.PivotItems
If PI.Value >= Format(FromDate, "M/D/YYYY") And PI.Value <= Format(ToDate, "M/D/YYYY") Then PI.Visible = True Else PI.Visible = False
Next
End With
pivno = pivno + 1
Loop
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
逐步使用 msgbox 命令,似乎缺少的日期在其中一项日期检查中失败,因此 AND 函数删除了该条目。我不知道发生了什么。
使用 Excel 2016
【问题讨论】: