excel - 使用 VBA 将数据透视表设置为基于另一个字段的特定日期
问题描述
我已经尝试了很多我在网上找到的迭代,但无法让它工作。我有一个需要每周更新的数据透视表,并且需要根据工作表中的字段将日期设置为变量。日期是一个过滤器。使用下面的代码,我可以将日期更改为特定日期。
Sub Macro7()
'
ActiveSheet.PivotTables("PivotTable2").PivotFields("[Test_Data].[Date].[Date]" _
).ClearAllFilters
ActiveSheet.PivotTables("PivotTable2").PivotFields("[Test_Data].[Date].[Date]" _
).CurrentPageName = "[Test_Data].[Date].&[2020-07-12T00:00:00]"
End Sub
但是,当我尝试将日期设置为变量(例如指向包含日期的工作表单元格的字符串)时,它会出错,通常会显示“无法设置 PivotField 类的 CurrentPage 属性”。我尝试了许多不同的选项和不同的代码,但没有任何效果。D2 是日期发生变化的地方。它根据公式进行更新。我也尝试过硬编码单元格中的日期,但这也不起作用。还尝试将日期格式与枢轴匹配,但没有帮助。如果重要的话,该字段会提取上周五的日期。如果有帮助的话,我会很好地将它放入代码中(我试过了,我得到了一个错误,即字符串无法转换为日期)。
Sub My_macro()
Dim str As String
str = ActiveSheet.Range("d2")
ActiveSheet.PivotTables("PivotTable2").PivotFields("[Test_Data].[Date].[Date]" _
).ClearAllFilters
ActiveSheet.PivotTables("PivotTable2").PivotFields("[Test_Data].[Date].[Date]").CurrentPage = str
End Sub
有人可以告诉我如何纠正这个吗?已经尝试了几个小时,只是无法弄清楚。谢谢。PS--我试着上传一张表格,但我不知道怎么做,看起来我只能做图片,所以我上传了。下面是日期过滤器问题所在的支点,下面是提供支点的示例。
编辑:已在此处共享文件示例: https ://www.dropbox.com/sh/4tzrrue0mggf6om/AAAd6024feSdc9MbCd9IZD0Wa?dl=0
解决方案
当你录制一个宏时,你会得到这样的东西
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveSheet.PivotTables("PivotTable2").PivotFields("[_Data].[Date].[Date]"). _
ClearAllFilters
ActiveSheet.PivotTables("PivotTable2").PivotFields("[_Data].[Date].[Date]"). _
CurrentPage = "[_Data].[Date].&[2019-08-16T00:00:00]"
End Sub
即使宏为您提供了该代码,如果您直接运行它而不更改任何内容,它也会出错。
解决方案:这是一个非常古老的问题,可以通过更改CurrentPage
为CurrentPageName
现在改变它以满足您的需要......
Sub Sample()
Dim ws As Worksheet
Set ws = Sheet1
Dim rngDt As Range
Set rngDt = ws.Range("D2")
Dim dtString As String
dtString = Format(rngDt.Value2, "yyyy-mm-dd")
Dim pt As PivotTable
Set pt = ws.PivotTables("PivotTable2")
Dim pf As PivotField
Set pf = pt.PivotFields("[_Data].[Date].[Date]")
pf.ClearAllFilters
pf.CurrentPageName = "[_Data].[Date].&[" & dtString & "T00:00:00]"
End Sub
编辑
请问...我如何在同一张纸上选择多个枢轴并对它们的过滤器执行此操作,为所有它们选择相同的日期(单元格 D2)?只需重复代码,替换名称,或者像数组这样的东西可以工作吗?再次感谢您,将您的标记为答案!– learningthisstuff 2天前
您可以循环执行此操作。对于 ws.PivotTables 中的每个 pt,然后对于 pt.PivotFields 中的每个 pf :) – Siddharth Rout 2 天前
谢谢....我把这些线放在哪里?我尝试了几个我认为有意义但不断出错的地方。我会继续尝试选项,想知道是否需要删除“set pt/pf”行?谢谢你。– learningthisstuff 14 小时前 >
他们有相同的字段“日期”吗?– Siddharth Rout 13 小时前
是的,它们几乎完全相同。相同的过滤器。– learningthisstuff 11 小时前
您可以尝试这样的事情(未经测试)
Sub Sample()
Dim ws As Worksheet
Set ws = Sheet1
Dim rngDt As Range
Set rngDt = ws.Range("D2")
Dim dtString As String
dtString = Format(rngDt.Value2, "yyyy-mm-dd")
Dim pt As PivotTable
Dim pf As PivotField
For Each pt In ws.PivotTables
Set pf = pt.PivotFields("[_Data].[Date].[Date]")
pf.ClearAllFilters
pf.CurrentPageName = "[_Data].[Date].&[" & dtString & "T00:00:00]"
Next pt
End Sub
编辑
根据 OP 对此答案的编辑要求,由于存在多个枢轴,因此最终对上述代码进行了以下更改。
Sub Sample2()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Dim rngDt As Range
Set rngDt = ws.Range("F32")
Dim dtString As String
dtString = Format(rngDt.Value2, "yyyy-mm-dd")
Dim pt As PivotTable
Dim pf As PivotField
For Each pt In ws.PivotTables
If pt = "PivotTable2" Then
Set pf = pt.PivotFields("[_Data].[Date].[Date]")
pf.ClearAllFilters
pf.CurrentPageName = "[_Data].[Date].&[" & dtString & "T00:00:00]"
Else
Set pf = pt.PivotFields("[Sales_Data].[Date].[Date]")
pf.ClearAllFilters
pf.CurrentPageName = "[Sales_Data].[Date].&[" & dtString & "T00:00:00]"
End If
Next pt
End Sub
推荐阅读
- javascript - JS 搜索框提交未发送值 - 返回未定义或 [Object,Object]
- asp.net - 网络服务托管
- python - ValueError:在数据框中创建多个列时,要解压的值太多(预期为 4)
- firebase - 在 Firebase Functions 流程链中捕获更高层抛出的错误
- html - 悬停时的相对背景颜色
- powershell - 如果 URI 包含 URL 编码值,则使用 Powershell Invoke-RestMethod 的 Team City 构建步骤将失败
- visual-studio-code - 如何在 VS Code 中隐藏一个未知菜单?
- android - 如何在 AAR 中引用 SO 文件?
- php - 如何使用 Laravel 工厂上的其他状态创建“别名”数据库状态?
- ios - 是否有可能专注于选定的 SCNNode