表可以从GUI过滤日期,但不能过滤VBA

时间:2017-02-22 15:11:49

标签: vba excel-vba excel-2013 excel

我有一张桌子,其中一列填充了日期。我想在每次打开时在此列表中添加动态排序,因此我创建了一个宏来触发Workbook_Open上的日期过滤器更新。

问题是,即使我在GUI中手动验证代码已输入正确的日期,过滤器在通过VBA输入时也不会显示任何结果。更重要的是,如果我在验证GUI中的日期(即不更改任何内容)后按Enter,则过滤器会突然运行。

这是代码,外面注释的行是我尝试过的东西。最后一行是宏记录器在记录GUI过程时给出的完整代码(手动过程显示所需结果,而代码则没有):

Sub FixSortings
    tbl.Sort.SortFields.Clear
    tbl.Sort.SortFields.Add Key:=Range("Tabell2[[#All],[Ref dato]]"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

    With tbl.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    tbl.ShowAutoFilter = False

    'tbl.Range.AutoFilter Field:=9, Criteria1:=">=" & CStr(Format(DateAdd("m", -6, Now()), "dd.mm.yy")), Operator:=xlAnd, Criteria2:="<=" & CStr(Format(Now(), "dd.mm.yy"))
    'tbl.Range.AutoFilter Field:=9, Criteria1:=">=" & CStr(Format(DateAdd("m", -6, Now()), "mm.dd.yy")), Operator:=xlAnd, Criteria2:="<=" & CStr(Format(Now(), "mm.dd.yy"))
    'tbl.Range.AutoFilter Field:=9, Criteria1:=">=22.08.2016", Operator:=xlAnd, Criteria2:="<=22.02.2017"
    ActiveSheet.ListObjects("Tabell2").Range.AutoFilter Field:=9, Criteria1:=">=22.08.2016", Operator:=xlAnd, Criteria2:="<=22.02.2017"
End Sub

tbl声明是正确的,我知道这是因为排序是按原样添加的...并且过滤器也以某种方式添加(因为我可以在检查时找到输入的日期)从GUI中的下拉按钮开始的表格,看起来虽然添加了过滤器的标准,但它没有被执行......或类似的东西。

我知道它可能与日期格式的本地化有关。您可以在我的代码中看到我使用的是欧洲日期格式(dd.mm.yy),之前我在VBA中遇到过日期戳问题,因为VBA似乎更喜欢美国日期格式。

但是,正如您在我的代码中看到的那样,我尝试应用mm.dd.yy格式 - 但没有成功。

1 个答案:

答案 0 :(得分:0)

答案似乎是VBA 非常特别关注其日期格式。

如果问题中没有一个代码可以使用,则此代码可以正常工作。

tbl.Range.AutoFilter Field:=9, _
    Criteria1:=">=" & CStr(Format(DateAdd("m", -6, Now()), "yyyy-mm-dd")), _ 
    Operator:=xlAnd, _
    Criteria2:="<=" & CStr(Format(Now(), "yyyy-mm-dd"))

作为一个接近,我只能得出结论,我使用之前尝试过的代码没有得到任何结果,因为VBA并不总能很好地与其他日期格式一起使用,但无论如何它都愿意将字符串输入到表中。当我然后使用GUI检查表格的过滤器并按Enter时,Excel会识别日期格式,因为它不像VBA引擎那么困难,并且wham,过滤器已成功应用。