繁体   English   中英

数据透视表 VBA 过滤器之前的日期

[英]Pivot Table VBA Filter for dates before

我是这个论坛的新手,对于我过去 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

您的代码有几个错误。 首先,要将字符串转换为日期,请将其包装在 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 语句的结果(真或假)被传递给 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM