【问题标题】:Pivot Table VBA Filter for dates before之前日期的数据透视表 VBA 过滤器
【发布时间】:2020-02-25 20:36:57
【问题描述】:

我是这个论坛的新手,非常感谢关于我过去 4 天一直在处理的问题的一些指导。

我有一个宏来过滤数据透视表,以便在同一张表中的单元格 B5 上的某个日期之前的日期。不幸的是,它产生了一些数据,但不是所有数据。

以下是我拥有的代码(基于研究/复制粘贴),如果代码不是最佳实践,我深表歉意。 我还附上了一张图片供参考。提前感谢您的评论和支持。

'Sub BeforeDate()

Dim sSheetName As String
Dim sPivotName As String
Dim sFieldName As String
Dim sFilterCrit As String
Dim pi As PivotItem

    'Set the variables
    sSheetName = "PivotTable"
    sPivotName = "PivotTable1"
    sFieldName = "apptdate"
    'sFilterCrit = "5/2/2019"
    sFilterCrit = ThisWorkbook.Worksheets(sSheetName).Range("B5").Value

    With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName)
        'Clear all filter of the pivotfield
        .ClearAllFilters

        'Loop through pivot items of the pivot field
        'Hide or filter out items that do not match the criteria

        For Each pi In .PivotItems
            If pi > Range("B5") Then
                pi.Visible = False
            Else
                pi.Visible = True
            End If
        Next pi

    End With

End Sub

【问题讨论】:

    标签: excel vba filter


    【解决方案1】:

    您的代码有几个问题。首先,要将字符串转换为日期,请将其包装在 CDate() 中(即CDate(ThisWorkbook.Worksheets(sSheetName).Range("B5").Value))。

    此外,您的 For Each 正在将 pi(PivotItem 对象)与 Range("B5") 进行比较 - 我相信您的意思是指 sFilterCrit 而不是 Range("B5"),并且 pi 应该是 pi.Value (我认为它仍然可以像在 VBA 中一样工作,但你真的想要值,而不是对象)。此外,这应该像上面的 sFilterCrit 值一样传递给 CDate()。

    最后,您可以使用以下代码来简化您的 If 语句: pi.Visible = CDate(pi.Value) < sFilterCrit 本质上,您的 If 语句的结果(true 或 false)被传递给 Visible 属性(注意切换的比较运算符)。

    这是更新后的代码:

    Sub BeforeDate()
    
    Dim sSheetName As String
    Dim sPivotName As String
    Dim sFieldName As String
    Dim sFilterCrit As String
    Dim pi As PivotItem
    
        'Set the variables
        sSheetName = "PivotTable"
        sPivotName = "PivotTable1"
        sFieldName = "apptdate"
        'sFilterCrit = "5/2/2019"
        sFilterCrit = CDate(ThisWorkbook.Worksheets(sSheetName).Range("B5").Value)
    
        With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName)
            'Clear all filter of the pivotfield
            .ClearAllFilters
    
            'Loop through pivot items of the pivot field
            'Hide or filter out items that do not match the criteria
    
            For Each pi In .PivotItems
                pi.Visible = CDate(pi.Value) < sFilterCrit
            Next pi
    
        End With
    
    End Sub
    

    【讨论】:

    • 我想补充一点,核心问题是 VBA 将字符串与字符串进行比较,而不是日期与日期之间的比较。字符串比较的工作方式与您预期的略有不同(例如 2020 年 1 月 25 日在 2020 年 1 月 24 日之前排序)。
    • 非常感谢!有效!非常感谢您抽出宝贵时间对此进行审查并提供指导/解决方案。你不知道我多么感谢你的帮助!
    • 我自己也经常去那里。祝你好运!
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多