excel - 按月周期的 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
.
这就是我的动态表的外观,这是数据来自的表。
这可能与我的动态表没有日期字段有关吗?
解决方案
如果你有它作为一行,你应该能够使用你拥有它的代码。如果您将日期添加为过滤器字段,则需要执行以下操作:
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
推荐阅读
- python - 从图像中剪下一块不是矩形的(例如梯形),然后将其变成适合板的矩形
- css - 如何在 rtl css 和 ltr css 生成的 rtl css 文件之间进行选择
- c# - 如何修复“无效的登录令牌”。尝试将经过身份验证的用户与 AWS 和 Cognito 用户池一起使用时
- visual-studio - Visual Studio 2017 中的 ROOT cern
- javascript - Git 在发出拉取请求时会看到分支中的许多更改
- php - PHP数组:条件和
- android - 以编程方式将位置添加到推文
- vue.js - 具有隐藏/显示面板的灵活布局
- docker - 如何在 Docker 上为 Vue-router 配置 nginx
- three.js - 如何设置初始相机位置(Three.js/VR)?