首页 > 解决方案 > 考虑到“13:12:00”作为日期,我如何解决 Excel?

问题描述

该代码进行网络查询,然后输入订单的状态和发货日期,它大部分时间都可以工作,但有时它会在不应该的时候跳过 Do Loop(即它认为时间格式的数字是日期)。 :)

            Cells.Find(What:="order shipped", After:=ActiveCell, _
            LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    
            Selection.Offset(0, -1).Select
            strDateShipped = Selection.Value
            
            If IsDate(strDateShipped) = False Then
                Do
                Selection.Offset(-1).Select
                strDateShipped = Selection.Value
                Loop Until IsDate(strDateShipped) = True
            End If
    
            Selection.Copy

标签: excelvba

解决方案


微软的文档说,IsDate如果“参数是包含可识别为日期或时间的日期表达式或字符串表达式的变体”,则返回 true。

因此,从技术上IsDate检查该值是日期还是时间。但是,VBA 似乎将单元格中的时间值视为双精度值,而将日期值视为日期值。因此,IsDate其行为就像检查值是日期还是时间。

在您的情况下,13:12:00与任何其他时间值没有什么不同。所以,我认为问题的原因是13:12:00在单元格中作为字符串值输入。

为了处理不同的类型,解决方案是添加以下函数来检查值是日期(不是时间),

Function IsDateValue(ByVal v As Variant) As Boolean
    IsDateValue = False
    
    ' Convert value to string
    v = CStr(v)
    
    ' This is date OR time
    If IsDate(v) Then
        ' If serial of the value is equal or more than 1, it is date
        If CDbl(CDate(v)) >= 1 Then
            IsDateValue = True
        End If
    End If
End Function

并在您的代码中更改对IsDateto的调用。IsDateValue

If IsDateValue(strDateShipped) = False Then
    Do
        Selection.Offset(-1).Select
        strDateShipped = Selection.Value
    Loop Until IsDateValue(strDateShipped) = True
End If

顺便说一句,理想情况下,VBA 读取的单元格应该只包含格式良好(相同类型)的数据,否则代码会变得复杂,包含许多ifs 并可能引入错误。


推荐阅读