13

我在 Excel 中使用带有 VBA 的自动过滤器,它适用于常规过滤器,但不适用于格式化为日期的列。

我可以手动过滤。如果我运行我的代码,它什么都不过滤,但是当我检查过滤器然后只单击确定(没有更改应用于过滤条件)时,它会正确过滤。

这是我的代码:

ws.ListObjects(SheetName).Range.AutoFilter Field:=3, Criteria1 _
        :=">" & CDate([datecell]), Operator:=xlAnd, Criteria2:= _
        "<=" & CDate(WorksheetFunction.EoMonth([datecell], 3))

这似乎是一个常见的问题,但我还没有找到解决方案。

当我运行录制的宏时,它也不起作用。

4

10 回答 10

21

使用 Excel VBA 自动筛选可能会很棘手。有些人发现循环遍历要过滤的数组更容易。

有时我发现可以使用日期的数值,尤其是在处理“日期之间”时

Criteria1:= ">" & CDbl([datecell])
Criteria2:= "<=" & CDbl(WorksheetFunction.EoMonth([datecell], 3))

请注意,以上内容必须是“真实日期”,而不是看起来像日期的字符串。即使是一个“字符串日期”也会把事情搞砸。

于 2013-11-04T12:43:09.360 回答
13

Autofilter()适用于“通用”格式yyyy-mm-dd,即:

Criteria1:= ">" & Format([MY_DATE],"yyyy-mm-dd")
Criteria2:= "<=" & Format([MY_DATE],"yyyy-mm-dd")

更好,因为 Excel 不能“理解”它是错误的。如果您使用mm/dd/yyyydd/mm/yyyyExcel 可以适合 02/jan 为 01/feb。

见: http ://www.oaltd.co.uk/ExcelProgRef/Ch22/ProgRefCh22.htm

使用 Excel 的规则(国际问题

  1. 当您必须将数字和日期转换为字符串以传递给 Excel 时(例如在 AutoFilter 或 .Formula 字符串的条件中),始终使用 Trim(Str(MyNumber)) 或前面显示的 sNumToUS() 函数,适用于所有数字和日期类型。Excel 然后将正确使用它并将其转换为本地数字/日期格式。

编辑:

我们可以使用以下方法创建一个通用函数Application.International

Sub MySub()
    Select Case application.International(xlDateOrder)
        Case Is = 0
            dtFormat = "mm/dd/yyyy"
        Case Is = 1
            dtFormat = "dd/mm/yyyy"
        Case Is = 2
            dtFormat = "yyyy/mm/dd"
        Case Else
            dtFormat = "Error"
    End Select

    Debug.Print (dtFormat)

    ...
    Criteria1:= ">" & Format([MY_DATE],dtFormat)
    Criteria2:= "<=" & Format([MY_DATE],dtFormat)
    ...

End Sub
于 2015-08-06T21:13:41.943 回答
5

您需要将格式转换为美国格式,例如:

">" & Format([datecell], "mm/dd/yyyy")

VBA 不理解其他格式。

于 2014-05-22T15:12:31.407 回答
1

Karlos Henrique,感谢您提出 Format([datecell], "mm/dd/yyyy") 的建议。它适用于我的文件。我以前的代码是:

Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _
  Criteria1:=">=" & StrtDt, _
  Operator:=xlAnd, _
  Criteria2:="<=" & EndDt

我修改后的代码是:

Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _
  Criteria1:=">=" & Format(StrtDt, "mm/dd/yyyy"), _
  Operator:=xlAnd, _
  Criteria2:="<=" & Format(EndDt, "mm/dd/yyyy")

谢谢。

于 2014-06-14T05:59:46.663 回答
1

这种语法对我有用:

.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(2, Format(Now, "yyyy-mm-dd"))

通过宏注册获得的提示

于 2016-04-29T14:35:15.317 回答
0

将您的“dd-mm-yyy”与列的格式相匹配,因此如果您将“16-Aug-16”作为源数据格式,则将过滤器设置为“dd-mmm-yy”

于 2016-08-16T08:28:40.143 回答
0

一种解决方案是正确设置目标列的格式。如果它被格式化为“自定义”,即使它看起来像一个日期,它也不会起作用。

您要求 VBA 根据日期进行过滤,因此列的格式也必须是日期。

于 2019-01-29T14:24:00.377 回答
0

所以这对我来说很干净

ActiveSheet.Range("$A$1:$K$35727").AutoFilter Field:=1, Criteria1:= _
        ">=" & Range("G1"), Operator:=xlAnd, Criteria2:="<=" & Range("H1")

你也可以试试这个

预期输出将在我的 G1 单元格中开始日期,结束日期将是 H1 单元格。

于 2019-11-22T17:55:47.597 回答
0

我在使用日期过滤列时遇到了类似的问题。当我将系统日期格式更改为 2020 年 1 月 1 日时,它在条件字段中将我的日期转换为 2020 年 1 月 1 日。我的解决方案是在设置为函数期间将参数转换为 str 。

于 2020-02-27T12:37:36.540 回答
-1

这是occam的剃刀解决方案...尝试将其放入电子表格的自动打开中,或者如果需要,为您希望影响的工作表修改它。它将导致日期标题的下拉过滤器显示为单个日期,而不是日期层次结构。

ActiveWindow.AutoFilterDateGrouping = False

于 2019-11-14T17:14:03.227 回答