Table 可以从 GUI 按日期过滤,但不能 VBA
Table can be filtered on date from the GUI, but not VBA
我有一个 table,其中一列填满了日期。我想在每次打开时在此列表上添加动态排序,所以我制作了一个宏来触发 Workbook_Open
.
上的日期过滤器更新
问题是 过滤器在通过 VBA 输入时不显示任何结果,即使我在 GUI 中手动验证代码输入了正确的日期.更重要的是,如果我在 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 的下拉按钮中检查了 table),似乎虽然添加了过滤器的条件,但它没有执行......或类似的东西。
我有一个想法,这可能与日期格式的本地化有关。您可以在我的代码中看到我使用的是欧洲日期格式 (dd.mm.yy),并且我之前在 VBA 中遇到过日期戳问题,因为 VBA 似乎更喜欢美国日期格式。
但是,正如您在我的代码中看到的那样,我尝试应用 mm.dd.yy 格式 - 但没有成功。
答案似乎是 VBA 确实 对它的日期格式有特殊要求。
此代码有效,当问题中的 none 有效时。
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 并不总是能很好地与其他日期格式一起使用,但它愿意将字符串输入 table 无论如何。然后,当我使用 GUI 检查 table 的过滤器并按 Enter
时,Excel 识别日期格式,因为它不像 VBA 引擎那么难,而且过滤器申请成功
我有一个 table,其中一列填满了日期。我想在每次打开时在此列表上添加动态排序,所以我制作了一个宏来触发 Workbook_Open
.
问题是 过滤器在通过 VBA 输入时不显示任何结果,即使我在 GUI 中手动验证代码输入了正确的日期.更重要的是,如果我在 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 的下拉按钮中检查了 table),似乎虽然添加了过滤器的条件,但它没有执行......或类似的东西。
我有一个想法,这可能与日期格式的本地化有关。您可以在我的代码中看到我使用的是欧洲日期格式 (dd.mm.yy),并且我之前在 VBA 中遇到过日期戳问题,因为 VBA 似乎更喜欢美国日期格式。
但是,正如您在我的代码中看到的那样,我尝试应用 mm.dd.yy 格式 - 但没有成功。
答案似乎是 VBA 确实 对它的日期格式有特殊要求。
此代码有效,当问题中的 none 有效时。
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 并不总是能很好地与其他日期格式一起使用,但它愿意将字符串输入 table 无论如何。然后,当我使用 GUI 检查 table 的过滤器并按 Enter
时,Excel 识别日期格式,因为它不像 VBA 引擎那么难,而且过滤器申请成功