VBA:根据先前定义的变量过滤数据透视表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA:根据先前定义的变量过滤数据透视表相关的知识,希望对你有一定的参考价值。

我有以下情况:需要一个VBA公式来过滤两个最新日期(已经完成)的原始数据表(HISTORICALS)。然后,应在这两个日期过滤相应的枢轴(在PIVOT表中称为PivotTable1)。日期所在的相应列称为“ipg:date”。这是我的代码:

Sub Select_Last_Two_Days()

' select the PIVOT worksheet

With Worksheets("PIVOT")    
' select two highest dates
    Highest_Max = Format(WorksheetFunction.Large(Worksheets("HISTORICALS").Range("A:A"), 1), "Short Date")
    Second_Highest_Max = Format(WorksheetFunction.Large(.Range("A:A"), WorksheetFunction.CountIf(.Range("A:A"), WorksheetFunction.Max(.Range("A:A"))) + 1), "Short Date")
    Debug.Print Highest_Max, Second_Highest_Max

    ' filter pivot table for two highest dates
    Worksheets("PIVOT").PivotTables("PivotTable1").PivotFields("ipg:date"). _
        ClearAllFilters
    Worksheets("PIVOT").PivotTables("PivotTable1").PivotFields("ipg:date"). _
        PivotFilters.Add Type:=xlValueEquals, Value1:=Highest_Max, Value2:=Second_Highest_Max
End With

End Sub

我收到的错误是:

无法获取WorksheetFunction类的Large属性

我假设xlValueEquals不是过滤我之前定义的变量的正确方法,但找不到另一个有效的过滤命令。

有人能指引我走向正确的方向吗?

答案

我无法确定这是否是肯定的问题,但我怀疑你无法使用'Highest_Max'来过滤你的支点,因为它是日期的字符串表示,而不是真正的Date(检查你的本地窗口和你应该在那里看到它。 Format函数将返回一个格式化的字符串,但如果数据透视表将这些值识别为真实日期,则当您将字符串传递给它时,它将不知道您的意思。

对于它的价值,你可能最好写一个函数来返回最近的两个日期(它们的值,而不是它们的字符串表示)。至少对我来说,使用Application.WorksheetFunction往往是一种代码气味。

您还需要确保声明变量。您可以通过将Option Explicit添加到模块顶部来强制声明。这会对未声明的变量强制执行编译时错误(我不能告诉你这会压缩多少时间来吸取时间错误)。

编辑:完全错过了你的错误是因为WorksheetFunction。这似乎是导致问题的原因:

Second_Highest_Max = Format(WorksheetFunction.Large(.Range("A:A"), WorksheetFunction.CountIf(.Range("A:A"), WorksheetFunction.Max(.Range("A:A"))) + 1), "Short Date")

请注意,.Range("")不是完全限定的(我假设你打算使用With块,但是代码中缺少这个块)。这意味着传递给array函数的WorksheetFunction.Large参数的变量将不是数组,反过来您将看到该函数返回错误。

以上是关于VBA:根据先前定义的变量过滤数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 根据下拉选择过滤多个数据透视表

加快数据透视表过滤 VBA 代码

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

使用 VBA 过滤 Excel 数据透视表

过滤数据透视表的最后一项 (vba)

VBA数据透视表:添加过滤器