我有以下情况:需要一个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
不是过滤我之前定义的变量的正确方法,但找不到另一个有效的过滤命令。
有人可以指引我走向正确的方向吗?
答案 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
参数的变量将不是数组,反过来您将看到函数返回错误。