使用 VBA 将数据透视表设置为基于另一个字段的特定日期

Posted

技术标签:

【中文标题】使用 VBA 将数据透视表设置为基于另一个字段的特定日期【英文标题】:Use VBA to Set Pivot Table to Specific Date Based on Another Field 【发布时间】:2020-11-03 05:40:59 【问题描述】:

我已经尝试了很多我在网上找到的迭代,但无法让它工作。我有一个需要每周更新的数据透视表,并且需要根据工作表中的字段将日期设置为变量。日期是一个过滤器。使用下面的代码,我可以将日期更改为特定日期。

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

【问题讨论】:

如果您想分享工作簿,您需要将其上传到 dropbox/onedrive/box 等并在此处分享链接。 您尝试设置的日期是否存在于数据中?将有助于显示基础源数据的样本。 嗨,谢谢...我不确定你的意思,但查询确实存在于工作簿中,是的。我遇到的唯一问题是将日期过滤器设置为特定日期。我试图上传这些数据,但被告知我不能上传,因为它是机密的专有数据。只能上传您在此处看到的内容。不过,我会用示例更新问题! 你不必使用你的实际数据,它只需要足以说明问题。除非“日期”的概念是公司机密...... ;-) 我添加了一个示例,说明数据本身的外观如何为枢轴提供数据。我希望这会有所帮助,因为我迫切需要帮助! =) 【参考方案1】:

编辑:从未使用过多维数据集,但这似乎可以满足您的要求:

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

【讨论】:

谢谢蒂姆,但还是不行。完全相同的错误:无法设置 PivotField 类的 CurrentPage 属性。它可以很好地找到单元格、识别它、清除它等等。当您实际尝试更新它时就会停止。 如果 D2 中的日期实际上在数据集中,它对我有用。除非您可以共享示例工作簿,否则我没有其他建议。 嗨,蒂姆,所以我做了一些令人信服的事情,并将其添加到此处的保管箱:dropbox.com/sh/4tzrrue0mggf6om/AAAd6024feSdc9MbCd9IZD0Wa?dl=0【参考方案2】:

当你录制一个宏时,你会得到这样的东西

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

编辑

请问...我该如何选择 MULTIPLE 在同一张纸上旋转,并对其过滤器执行此操作 好吧,为所有这些选择相同的日期(单元格 D2)?只是重复 编码,替换名称,或者像一个数组 工作?再次感谢您,将您的标记为答案! – 2天前学习这个东西

您可以循环执行此操作。对于每个 pt ws.PivotTables 然后对于 pt.PivotFields 中的每个 pf :) – Siddharth 2天前溃败

谢谢....我应该把这些行放在哪里?我尝试了几个地方 想法是有道理的,但不断出错。我会继续努力 选项,想知道我是否需要删除“set pt/pf”行?谢谢 你。 – learningthisstuff 14 hours ago >

它们是否具有相同的“日期”字段? – 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

【讨论】:

悉达多,你这个疯狂的天才!非常感谢,成功了!我不确定除了日期格式之外你做了什么不同的事情,因为我也尝试了 CurrentPageName 并且无法让它工作,但你的做了!太感谢了!请问...我如何在同一张纸上选择多个枢轴并对它们的过滤器执行此操作,为所有它们选择相同的日期(单元格 D2)?只需重复代码,替换名称,或者像数组这样的东西?再次感谢您,将您的答案标记为答案! 您可以循环执行此操作。 For each pt in ws.PivotTables 然后For each pf in pt.PivotFields :) 谢谢....我把这些行放在哪里?我尝试了几个我认为有意义但不断出错的地方。我会继续尝试选项,想知道是否需要删除“set pt/pf”行?谢谢。 他们的“日期”字段是否相同? 是的,它们几乎完全相同。相同的过滤器。

以上是关于使用 VBA 将数据透视表设置为基于另一个字段的特定日期的主要内容,如果未能解决你的问题,请参考以下文章

Excel 使用 VBA 遍历嵌套的数据透视表行字段

如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计

如何刷新数据透视图

Excel VBA 代码将过滤器设置为一系列选项

如何用vba实现数据透视表自动筛选

Excel 2007 VBA - 数据透视表字段列表???产生错误