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使用规则( 国际版 )
- 如果必须将数字和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”