【问题标题】:Automatically changing dates to YYYYMMDD format with Worksheet_Change使用 Worksheet_Change 自动将日期更改为 YYYYMMDD 格式
【发布时间】:2019-03-14 19:58:07
【问题描述】:

我正在为我所在地区的员工制作防错工作表。我们的系统需要通过 excel 工作表进行输入。连同我已经添加的其他验证,我需要将生日日期转换为格式YYYYMMDD 作为字符串/数字,因为在 Excel 上使用自定义格式切换它会在上传时在系统上抛出错误(我猜它仍然会读取日期作为 DD/MM/YYYY)。

所以我尝试使用Worksheet_Change(),所以当用户输入任何日期为DD/MM/YYYY 时,它会自动转换为所需的结果。

If Not Intersect(Target, Columns("G")) Is Nothing Then

    On Error Resume Next

    fecnacadd = Target.Address
    fecnac = Target.Value

    fecnacadd = Format(fecnac, "yyyymmdd")

    Columns("G").NumberFormat = "General"

End If

这段代码在调试(正确显示“YYYYMMDD”)时运行异常,但按原样运行,将宏循环 (?) 10 秒,然后删除单元格中的内容。

感谢我代码中的任何提示。

【问题讨论】:

  • 也许您通过更改列 G 中的单元格的值导致了无限循环,这会导致此代码再次运行。在此子例程的开头添加Application.EnableEvents = False,并在末尾将其切换回True
  • 您必须在处理捕获的事件期间禁用工作表事件,以避免创建无限(或至少长时间运行)循环。设置Application.EnableEvents = False,完成后别忘了重新启用它。
  • 为什么是On Error Resume Next?如果你有一个预期的错误,你应该测试它。否则,您可能会错过应该处理的错误。
  • @JNevill 它确实退出了循环没问题,谢谢。虽然有什么方法可以覆盖无格式数据吗?我仍然有问题。
  • @RonRosenfeld 因为同时删除多个单元格时它不能正确处理指令(内存错误)

标签: excel vba worksheet-function


【解决方案1】:

解决了它,它的日期格式证明(不管 DD 或 MM 的顺序)。还在 cmets 中添加了建议。谢谢!

If Not Intersect(Target, Columns("G")) Is Nothing Then
    Application.EnableEvents = False
    On Error Resume Next

    fecnacadd = Target.Address
    fecnac = Format(Target.Value, "YYYYMMDD")

    Target.Value = fecnac

    Columns("G").NumberFormat = "General"

    Application.EnableEvents = True
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多