Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 检查单元格值是否为日期时间(ISO)_Vba_Excel - Fatal编程技术网

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

Vba 检查单元格值是否为日期时间(ISO),vba,excel,Vba,Excel,要检查单元格是否是使用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

要检查单元格是否是使用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-DDTH-mm-ss

在VBA项目中,以下UDFª可用作工作表函数或辅助函数

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

我提供的模式是一块砖一块砖的文字;可以使用中详述的方法缩短时间



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

正如Tim Williams所指出的那样,这样做吧

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

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 

您可能想看看这篇文章:

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

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

注意:如果当前接受的解决方案正常工作,您的单元格只包含字符串值(看起来像ISO格式的日期),而不是使用ISO日期格式显示的实际日期。

使用通配符时,您应该使用
,不是
=
您是要告诉单元格中是否有一个看起来像日期的字符串,还是要告诉单元格中是否有一个已按该特定格式格式化的数字?例如,当前日期/时间(对我而言)是号码42569.628827662,可以用多种不同的方式格式化,但仍然是一个日期。(也是一个数字。)@TimWilliams谢谢,这是我要找的答案。@YowE3K ISO格式日期谢谢你的提醒。很高兴我能帮上忙。谢谢你的支票!