【问题标题】:Checking that cell value is date time (ISO)检查单元格值是否为日期时间 (ISO)
【发布时间】:2023-04-11 00:20:01
【问题描述】:

想要检查单元格是否是使用 ISO 格式的日期时间值,即 2012-04-12T00:00:00

当前尝试:

If mainsht.Cells(r, 6).Value = "" Or mainsht.Cells(r, 6).Value = "####-##-##T##:##:## Then
GoTo next6

它似乎仍然与 vba 中的格式和单元格值不匹配,因为我有许多具有这种正确格式的单元格并且仍在激活 else 语句,即 "####-##-##T##:##:##" 无法识别。

也许是 yyyy-mm-ddThh-MM-ss?

【问题讨论】:

  • 当使用通配符时,你应该使用Like,而不是=
  • 您是要判断单元格中是否有一个看起来像日期的字符串,还是要判断单元格中是否有一个以该特定格式格式化的数字?例如。当前日期/时间(对我而言)是数字 42569.628827662,可以用多种不同的方式进行格式化,但仍然是一个日期。 (而且仍然是一个数字。)
  • @TimWilliams 谢谢,这是我正在寻找的答案。
  • @YowE3K ISO 格式化日期

标签: vba excel


【解决方案1】:

ISO 日期有多种格式,添加星号 "####-##-##T##:##:##*" 会更加通用。

2011-01-01T12:00:00Z
2011-01-01T12:00:00+05:00
2011-01-01T12:00:00-05:00
2011-01-01T12:00:00.05381+05:00

例子:

If mainsht.Cells(r, 6).Value = "" Or mainsht.Cells(r, 6).Value Like "####-##-##T##:##:##*" Then 

你可能想看看这个帖子:Parsing an ISO8601 date/time (including TimeZone) in Excel

【讨论】:

  • 感谢您的提醒。
  • 很高兴能帮上忙。感谢您的检查!
【解决方案2】:

以下 UDF¹ 可用作 VBA 项目中的工作表函数或辅助函数。

Option Explicit

Function IsISODateTime(str As String)
    Dim n As Long, nums() As Variant
    Static rgx As Object, cmat As Object

    'with rgx as static, it only has to be created once; beneficial with repeated calls to the UDF
    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If
    IsISODateTime = vbNullString

    With rgx
        .Global = False
        .MultiLine = False
        .Pattern = "[0-9]{4}\-[0-9]{2}\-[0-9]{2}[A-Z]{1}[0-9]{2}\:[0-9]{2}\:[0-9]{2}"
        IsISODateTime = .Test(str)
    End With
End Function

UDF 返回一个真正的布尔值 True/False。

我提供的模式是一砖一瓦的字面意思;可以使用How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops中详述的方法缩短它。


¹ 用户定义函数(又名 UDF)被放入标准模块代码表中。点击Alt+F11,当VBE打开时,立即使用下拉菜单Insert ► ModuleAlt+I,M)。将功能代码粘贴到标题为 Book1 - Module1 (Code) 的新模块代码表中。点击 Alt+Q 返回您的工作表。

【讨论】:

    【解决方案3】:

    正如蒂姆·威廉姆斯已经指出的那样,这样做

    If mainsht.Cells(r, 6).Value = "" Or mainsht.Cells(r, 6).Value Like "####-##-##T##:##:##" ...
    

    【讨论】:

      【解决方案4】:

      要测试单元格的 ISO 格式日期,您应该检查单元格的 NumberFormat 属性,因此您的 If 语句应该是:

      If mainsht.Cells(r, 6).Value = "" Or mainsht.Cells(r, 6).NumberFormat Like "yyyy-mm-ddThh:mm:ss*" Then
      

      注意:如果当前接受的解决方案有效,则您的单元格仅包含一个字符串值(看起来类似于 ISO 格式的日期),而不是使用 ISO 日期格式显示的实际日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-22
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多