首页 > 解决方案 > 按月周期的 VBA 透视过滤器

问题描述

我正在尝试为我的动态表创建一个宏,以过滤仅显示某个月份发生的元素的元素。我有以下脚本:

Sub Change_Filter()
    Dim months As Variant
    Dim month As Integer
    Dim filter As String
    months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
    month = CInt(Sheets("Índice").Range("I12"))
    filter = "xlAllDatesInPeriod" & months(month - 1)
    Worksheets("pivotTable").Activate
    ActiveSheet.PivotTables("PivotTable1").ClearAllFilters
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").PivotFilters.Add Type:=filter
End Sub

但是,当我到达最后一行时,我得到了错误Error 13: Type mismatch

我什至试图只使用

ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").PivotFilters.Add Type:=xlAllDatesInPeriodJanuary

看看它是否有效,但我得到Error 1004: Error defined by the application or object. 就是我的动态表的外观,是数据来自的表。

这可能与我的动态表没有日期字段有关吗?

标签: excelvbapivot-table

解决方案


如果你有它作为一行,你应该能够使用你拥有它的代码。如果您将日期添加为过滤器字段,则需要执行以下操作:


Sub PageItemFilter()
Dim pvtF As PivotField
Dim pvtI As PivotItem

Set pvtF = Worksheets("Sample").PivotTables("PivotTable1").PivotFields("Date")
For Each pvtI In pvtF.PivotItems
    If DateValue(pvtI.Name) >= Range("C2").Value2 And DateValue(pvtI.Name) <= Range("C3").Value2 Then
        pvtI.Visible = True
    Else
        pvtI.Visible = False
    End If
Next pvtI

End Sub

或者也许使用切片机

    ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.PivotTables("PivotTable1"), _
        "Date", , xlTimeline).Slicers.Add ActiveSheet, , _
        "Date", "Date", 239.25, 449.25, 262.5, 108

  
    ActiveWorkbook.SlicerCaches("NativeTimeline_Date"). _
        TimelineState.SetFilterDateRange "09/01/2021", "09/30/2021"

从数据表中的年份拆分月份定义一个新列并使用以下公式拆分月份

=TEXT(MONTH(Date),"MMMM")

我没有测试过以下内容,但它应该可以满足您的需求。

Sub PageItemFilter()
Dim pvtF As PivotField
Dim pvtI As PivotItem
months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
month = CInt(Sheets("Índice").Range("I12"))+1

Set pvtF = Worksheets("Sample").PivotTables("PivotTable1").PivotFields("Date")
For Each pvtI In pvtF.PivotItems
    If Month(DateValue(pvtI.Name)) == month Then
        pvtI.Visible = True
    Else
        pvtI.Visible = False
    End If
Next pvtI

End Sub


推荐阅读