VBA数据透视过滤器 - 日期范围

时间:2018-03-18 07:41:48

标签: excel vba

希望将数据透视表过滤到日期范围内。日期过滤器位于枢轴的顶部,主表有3列。我有一张带有实际示例的图片,但无法在此处上传。

如果我输入2018年2月1日 - 2018年3月1日的日期范围,则过滤器可以正常工作。 如果我输入2018年2月1日 - 2018年2月28日的日期范围,过滤器会错过2月3日 - 2月9日,再次回顾2月10日剩余的数据。

不同的日期范围会产生此行为的变体。

从我的在线研究中,VBA中的这种类型的过滤存在某种错误,其中代码以美国日期格式读取数据,而不管Excel设置&数据本身(因此格式化代码,没有它会导致不匹配错误)。我在网上看过几个解决方法,比如使用CLng,但下面的方法是我最接近的。

  • 数据透视表本身位于名为“Pivots”的工作表上。列 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

3 个答案:

答案 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)

PivotItems.Value 属性返回 String 值。 格式函数还会返回字符串(变体)值。

因此,当您执行 PI.Value FromDate / ToDate 的比较时,您的代码似乎会执行TEXT比较,不是DATE比较。在文本比较中,某些日期是正确的&#34;超出范围&#34;。

重现下图中的简单表(确保在输入值之前将所有字段设置为文本格式),并且您将看到它可以重现相同的&#34;错误&#34;你提到的行为。

解决方案可能会以某种方式将您比较的值转换回日期格式。

Simple test