Excel VBA自动筛选器不使用Date列

时间:2013-11-04 11:44:39

标签: excel vba date autofilter

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

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

这是我的代码:

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

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

提前致谢。

编辑:只是添加,当我宏记录它并运行录制的宏时,它也不起作用。

10 个答案:

答案 0 :(得分:15)

Excel VBA AutoFilter的日期可能很棘手。有些人发现循环遍历要过滤的数组更容易。

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

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

请注意,上面的内容需要是“真实日期”,而不是看起来像日期的字符串。即使是一个单独的“字符串日期”也会搞砸。

答案 1 :(得分:9)

Autofilter()适用于&#39; universal&#39;格式yyyy-mm-dd,即:

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

它更好,因为Excel无法理解&#39;错了。如果您使用mm/dd/yyyydd/mm/yyyy Excel可以将02 / jan设为01 / feb。

请参阅: http://www.oaltd.co.uk/ExcelProgRef/Ch22/ProgRefCh22.htm

  

使用Excel的规则(International Issue

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

修改

我们可以使用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

答案 2 :(得分:2)

您需要将格式转换为美国格式,例如: “&gt;” 中&安培;格式([datecell],“mm / dd / yyyy”) VBA不了解其他格式。

答案 3 :(得分:1)

这种语法对我有用:

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

通过宏注册获得的提示

答案 4 :(得分:0)

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")

感谢。

答案 5 :(得分:0)

匹配你的&#34; dd-mm-yyy&#34;到列的格式,所以如果你有&#34; 16-Aug-16&#34;作为源数据格式,然后将过滤器设为&#34; dd-mmm-yy&#34;

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

这对我来说很干净

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

您也可以尝试

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

答案 8 :(得分:0)

在用日期过滤列时,我遇到了类似的问题。当我将系统日期格式更改为01/01/2020时,它将“标准”字段中的日期转换为1/1/2020。 我的解决方案是在设置函数时将参数转换为str。

答案 9 :(得分:-1)

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

ActiveWindow.AutoFilterDateGrouping = False