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

时间:2018-01-03 09:19:04

标签: excel vba excel-vba pivot

我有以下情况:需要一个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类的大属性

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

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

1 个答案:

答案 0 :(得分:0)

我无法确定这是否是肯定的问题,但我怀疑你无法使用' 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参数的变量将不是数组,反过来您将看到函数返回错误。