检查单元格值是否为日期时间(ISO)

时间:2016-07-18 04:04:58

标签: excel vba excel-vba

想要使用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?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

以下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打开时,立即使用下拉菜单插入►模块 Alt + 中号)。将功能代码粘贴到标题为 Book1 - Module1(Code)的新模块代码表中。点击 Alt + Q 返回工作表。

答案 2 :(得分:0)

正如Tim Williams已经指出的那样,

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

答案 3 :(得分:0)

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

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

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