【问题标题】:Autofilter with column formatted as date自动过滤,列格式为日期
【发布时间】:2013-11-15 00:45:27
【问题描述】:

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

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

这是我的代码:

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

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

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

【问题讨论】:

  • 如果您将日期单元格格式更改为一般格式,它会显示数字吗?
  • 是的,正如我所说,一切正常。应用过滤器时出现问题。因为录制的宏也不行。
  • 尝试转换为文本。比如CDate([datecell])改成Format([datecell], "dd-MMM-yy")
  • 也不起作用,请参阅下面的答案和我的评论。真的很荒谬。
  • 这似乎有点奇怪是的......如果你 Debug.Printmsgbox 他们,[datecell]WorksheetFunction.EoMonth([datecell], 3) 是什么值?

标签: excel vba date autofilter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    所以这对我来说很干净

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

    你也可以试试

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

    【讨论】:

      【解决方案3】:

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

      ActiveWindow.AutoFilterDateGrouping = False

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 这对我有用......我的专栏被格式化为 dd-mmmm-yyyy 并且把所有东西都扔掉了。更改标准解决了这个问题。
          【解决方案6】:

          这个语法对我有用:

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

          通过宏注册获得的提示

          【讨论】:

            【解决方案7】:

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

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

            更好,因为 Excel 不能“理解”错误。如果您使用 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)) 将数据显式转换为美国格式的字符串,或前面显示的 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
            

            【讨论】:

              【解决方案8】:

              卡洛斯·恩里克, 感谢您建议 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")
              

              谢谢。

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

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

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

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

                  【讨论】:

                  • 是的,之前也试过了,但也没有用。这对我来说是个谜。特别是考虑到录制的宏也不起作用。
                  • 在处理“日期之间”时,另一个选项是使用 Excel 存储的数字。在答案中查看我的编辑
                  • 还有一点要检查的是,您的所有日期都是真正的日期,而不是碰巧看起来像日期的字符串。即使是列表中的单个“字符串日期”也会搞砸。
                  • 编辑您的答案以仅显示 CDbl 版本,我将其标记为正确并投票。
                  • 查看您的一些 cmets,并注意到您的设置将点作为日期分隔符,让我进行了一些测试。似乎如果将点设置为系统日期分隔符,即使您输入 Format([date],"m/d/yyyy") 系统仍会将分隔符更改为点。为了获得带有斜线分隔符的正确美国格式,您需要使用以下格式代码: "m""/""d""/""yyyy" 尝试后一种方法,看看它在您的系统上是如何工作的。 VBA 格式函数的帮助中概述了此行为。
                  猜你喜欢
                  • 2020-12-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-07-17
                  相关资源
                  最近更新 更多