希望将数据透视表过滤到日期范围内。日期过滤器位于枢轴的顶部,主表有3列。我有一张带有实际示例的图片,但无法在此处上传。
如果我输入2018年2月1日 - 2018年3月1日的日期范围,则过滤器可以正常工作。 如果我输入2018年2月1日 - 2018年2月28日的日期范围,过滤器会错过2月3日 - 2月9日,再次回顾2月10日剩余的数据。
不同的日期范围会产生此行为的变体。
从我的在线研究中,VBA中的这种类型的过滤存在某种错误,其中代码以美国日期格式读取数据,而不管Excel设置&数据本身(因此格式化代码,没有它会导致不匹配错误)。我在网上看过几个解决方法,比如使用CLng,但下面的方法是我最接近的。
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
答案 0 :(得分:0)
Excel将日期存储为数字值,即使您可以将其格式从"mm/dd/yyyy"
更改为"dd-mmm-yy"
,也可以更改为每月名称"mmmm"
,但它确实不会更改Excel将值存储在内部,即Numeric。
例如,如果您复制&gt;&gt;,请选择01-Feb-2018
将特殊(仅限值)粘贴到相邻单元格,您将获得43132
。
在您的情况下,最好的方法是比较日期的数值。
在您的代码中,替换您的行:
If Pi.Value >= Format(FromDate, "M/D/YYYY") And Pi.Value <= Format(ToDate, "M/D/YYYY") Then ...
使用:
If Pi.Value >= CDbl(FromDate) And Pi.Value <= CDbl(ToDate) Then ...
您可以稍微优化Do While
循环:
Do While pivno < 2 '25
Set pt = ws.PivotTables("PivotTable" & pivno)
Set pf = pt.PivotFields("Date")
With pf
.ClearAllFilters
For Each pi In .PivotItems
' since you already used .ClearAllFilters, you don't need to use Visible = True,
' only hide the ones which are not within your desired dates range
If Not (pi.Value >= CDbl(FromDate) And pi.Value <= CDbl(ToDate)) Then pi.Visible = False
Next
End With
pivno = pivno + 1
Loop
答案 1 :(得分:0)
好吧,看来我找到了解决方法。
用于创建数据透视的源数据需要是原始Excel编号,43108或其他任何内容而不是日期。
当使用CDbl(FromDate)&amp;这似乎有效。
只是试图澄清,问题源于枢轴项目名称(或标题或值等),当它是一个日期,无法格式化,设置或处理为美国日期以外的任何其他事项格式。试图将任何数据与它匹配似乎不起作用,只改变原始数据,如上所述。使用CDbl转换代码中的任何过滤条件似乎让我无处可去。
答案 2 :(得分:0)