【问题标题】:Dates switching from dd mm to mm dd in VBA filter在 VBA 过滤器中从 dd mm 切换到 mm dd 的日期
【发布时间】:2019-05-09 13:52:21
【问题描述】:

我正在尝试使用 VBA 在 Excel 中按日期过滤。

输入过滤器时日期会转置,月份和日期被交换为美国而不是欧洲日期。

表格中的日期格式为短日期,输入文本框中的日期格式正确。

dateselect 是激活过滤器的复选框,datestart 和 datefinish 是保存日期的文本框。

If dateselect = True Then

    With Worksheets("Data").Range("C:C")
      .AutoFilter field:=1, Operator:=xlAnd, Criteria1:=">=" & Datestart, Criteria2:="<=" & datefinish
    End With

End If

我尝试为日期添加格式,但出现溢出错误。

If dateselect = True Then

    With Worksheets("Data").Range("C:C")
      .AutoFilter field:=1, Operator:=xlAnd, Criteria1:=">=" & Format(Datestart, dd/mm/yyyy), Criteria2:="<=" & Format(datefinish, dd/mm/yyyy)
    End With

End If

所以我得到一个转置日期,如果我试图强制格式我得到一个溢出。

【问题讨论】:

  • 这段代码在Worksheet_Change事件中吗?
  • 尝试使用DateValue
  • 代码在您按下按钮时被激活,并且位于该按钮的宏中。周围有更多数据,但这与这个问题无关。刚试了 DateValue 还是换位了。
  • 日期是“真正的 Excel 日期”而不是日期的文本表示形式吗? (单元格格式与回答此问题无关)您的 Windows 区域日期设置是什么?
  • 刚刚尝试了 CDbl 方法,它现在过滤了错误的列。而不是日期列 (C),它正在过滤引擎装备列 (A)。我的区域设置适用于英国,如果我将 TODAY 函数放入单元格中,我会得到 dd/mm/yyyy。我不完全确定您所说的“真正的 Excel 日期”而不是文本表示是什么意思?

标签: excel vba date


【解决方案1】:

如果您在单元格中使用日期值,例如 =TODAY() 的结果,您可以使用 Range.AutofilterCDbl 进行比较。

通过CDate,您可以确保您的变量“datestart”和“datefinish”也是日期值。

CDbl 工作得几乎完美,因为日期值在内部由整数部分(自 1900 年以来的天数)及其小数部分(一天的一部分,即小时、分钟、秒)组成。

With Worksheets("Data").Range("C:C")
    .AutoFilter field:=1, _
    Operator:=xlAnd, _
    Criteria1:=">=" & CDbl(CDate(datestart)), _
    Criteria2:="<=" & CDbl(CDate(datefinish))
End With

请注意,标准 、>=、 将像上面一样工作,但如果必须过滤日期等于 单个给定日期,则简单的“=.. ." 要么需要工作表中日期的确切字符串表示法(取决于单元格的数字格式),要么需要遵循独立于日期格式的日期:

With Worksheets("Data").Range("C:C")
    .AutoFilter field:=1, _
    Criteria1:="<=" & CDbl(myDate), Operator:=xlAnd, _
    Criteria2:=">=" & CDbl(myDate)

【讨论】:

  • 刚刚尝试过,它现在过滤了错误的列,A 而不是 C。我现在真的很困惑。但是,它添加到过滤器中的数字在以日期格式输入时会给出正确的日期。
  • 好的,将字段更改为 3,现在可以正确过滤。感谢您的帮助。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多