【问题标题】:VBA Pivot Filter - Date RangeVBA 枢轴过滤器 - 日期范围
【发布时间】: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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    PivotItems.Value 属性返回一个 String 值。 Format 函数还返回一个 String (Variant) 值。

    因此,当您执行 PI.ValueFromDate / ToDate 的比较时,您的代码似乎执行了 TEXT 比较,不是日期比较。在文本比较中,某些日期完全“超出范围”。

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

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

    【讨论】:

      【解决方案2】:

      Excel 将日期存储为数值,即使您可以将其格式从 "mm/dd/yyyy" 更改为 "dd-mmm-yy" 或像 "mmmm" 这样的月度名称,它确实不会改变 Excel 在其中存储值的方式,即数字。

      例如,取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
      

      【讨论】:

      • 谢谢。这是我之前尝试过的一种解决方案,但我无法让它发挥作用。原因似乎是 PI.Value 无法转换为字符串,它总是类似于 2018 年 1 月 1 日的 4/1/2018。如果我尝试,例如CDbl(pi.value) 我什至没有得到结果,例如使用 msgbox 甚至不显示 msgbox。 - 抱歉,这里的评论失败了:)
      • 很遗憾,我有同样的问题。我确实接受了你关于循环的建议,干杯
      • @amcghee1看来您的“日期”不是有效日期。复制 >> 粘贴它们,看看你得到什么值
      • 它们是日期,英国地区格式日期。问题似乎是数据透视缓存如何处理日期。资料来源:dailydoseofexcel.com/archives/2013/11/09/a-date-with-pivotitems 他们提到该问题已在 Excel 2013 中解决,但我似乎遇到了这个问题。我不认为这个问题可以重现,除非根据我的理解将 excel 设置为使用英国日期格式。我还应该说我已经尝试过 PI.caption 和 PI.name 看看我是否可以以这种方式使用这些值,但遇到了同样的问题。
      【解决方案3】:

      好的,看来我找到了解决方法。

      用于创建数据透视的源数据需要是原始 Excel 数字、43108 或其他任何内容,而不是日期。

      当使用 CDbl(FromDate) 完成此操作时,似乎可以工作。

      只是想澄清一下,问题源于枢轴项目名称(或标题或值等),当它是日期时,无法格式化或设置或处理为美国日期以外的任何内容格式。尝试将任何数据与之匹配似乎不起作用,仅如上所述更改原始数据并使用 CDbl 转换代码中的任何过滤条件似乎可以让我到任何地方。

      【讨论】:

        猜你喜欢
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 2012-05-23
        • 2015-07-31
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多