Excel VBA自动筛选器不能使用date列

在Excel中使用VBA使用AutoFilter时遇到了问题。

它适用于常规filter,但过滤date列不能按预期工作。 该列被格式化为date,我可以手动和荒谬地过滤它,如果我运行我的代码,它什么都不过滤,但是当我检查filter,然后只点击确定(没有更改应用于筛选条件),它开始正确过滤。

这是我的代码:

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

任何人有一个想法? 这似乎是一个普遍的问题,但我还没有find解决办法。

提前致谢。

编辑:只要添加,当我loggingmacros并运行录制的macros时,它也不起作用。

Excel VBA自动筛选date可能会非常棘手。 有些人发现只需循环访问数组即可进行过滤。

有时我发现可以使用date的数字值,特别是在处理“date之间”

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

请注意,以上需要是“真正的date”,而不是看起来像date的string。 即使是一个单一的“stringdate”也会搞砸了。

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

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

这样更好,因为Excel不能“理解”错误。 如果你使用mm/dd/yyyy或者dd/mm/yyyy Excel可以使用02 / jan作为01 / feb。

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

Excel使用规则( 国际版 )

  1. 如果必须将数字和date转换为传递给Excel的string(例如在自动filter或.Formulastring的条件中),则始终使用Trim(Str(MyNumber))将数据显式转换为US格式的string,所有数字和datetypes的sNumToUS()函数在前面显示。 Excel将正确使用它并将其转换为本地号码/date格式。

编辑:

我们可以使用Application.International创build一个通用的函数,如:

 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 

您需要将格式转换为美式格式,例如:“>”&Format([datecell],“mm / dd / yyyy”)VBA不理解其他格式。

这个语法适用于我:

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

通过macros注册获得的提示

Karlos Henrique,谢谢格式化([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") 

谢谢。

将“dd-mm-yyy”与列的格式相匹配,所以如果您的源数据格式为“16-Aug-16”,则将filter设置为“dd-mmm-yy”