[英]Use VBA to Set Pivot Table to Specific Date Based on Another Field
我已经尝试了许多在 web 上找到的迭代,但无法使其正常工作。 我有一个 pivot 表,我需要每周更新一次,我需要根据工作表中的字段将日期设置为变量。 日期是一个过滤器。 使用下面的代码,我可以将日期更改为特定日期。
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 是日期发生变化的地方。 它根据公式进行更新。 我也尝试过硬编码单元格中的日期,但这也不起作用。 还尝试将更新格式与 pivot 匹配,但没有帮助。 如果重要的话,该字段会提取上周五的日期。 如果有帮助的话,我会很好地将它放入代码中(我试过了,我得到了一个错误,即字符串无法转换为日期)。
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--我试着上传一张表格,但我不知道怎么做,看起来我只能做图片,所以我上传了。 下面是日期过滤器问题所在的 pivot,下面是 pivot 的示例。
编辑:已在此处共享文件示例: 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
编辑
请问...我怎样才能 select MULTIPLE 在同一张纸上旋转并对他们的过滤器执行此操作,为所有这些选择相同的日期(单元格 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
编辑:从未使用过多维数据集,但这似乎可以满足您的要求:
Sub My_macro()
Dim dt As Date, pt As PivotTable, pf As PivotField
dt = ActiveSheet.Range("d2")
Set pt = ActiveSheet.PivotTables(1)
Set pf = pt.PageFields("[_Data].[Date].[Date]")
With pf
.ClearAllFilters
.CubeField.EnableMultiplePageItems = True
.VisibleItemsList = _
Array("[_Data].[Date].&[" & Format(dt, "yyyy-mm-dd") & "T00:00:00]")
End With
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.