我有一张桌子,其中一列填充了日期。我想在每次打开时在此列表中添加动态排序,因此我创建了一个宏来触发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格式 - 但没有成功。
答案 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,过滤器已成功应用。