VBA Excel TimeValue()输入可能性

时间:2017-11-16 12:31:57

标签: excel vba excel-vba

这里新的。阅读了很多主题,但实际上无法弄清楚这一点。 我正在将一个字符串从userform文本框转换为double,表示时间。目前的代码非常好用:

Dim startingTime As Double, endingTime As Double
Dim totalTime As Double
On Error Resume Next
With textbox_inMyUserform
TimeValue(.Value)
    If Err.Number <> 0 Then
        startingTime = CDbl(.Value)
        Err.Clear
        On Error GoTo 0
    Else
        On Error GoTo 0
        startingTime = 24 * TimeValue(.Value)
    End If
End With

TimeValue(.value)检查格式是否正确。没有错误意味着函数在else中使用,错误使得if运行正常的Cdbl(.value)。

效果很好,除了...小数显然不会触发错误。由于TimeValue上的错误,“5”变为5,“5:30”变为5,5因为TimeValue上没有错误,但“5.5”和“5,5”不会触发错误,分别给出5.0833333和0的结果TIMEVALUE(.value的)。我希望这些字符串出错?

我现在的解决方案是不使用小数,但我不知道什么是错的。

感谢。

更新
所以基于Slai的答案我得到了它的工作。显然,在Excel中的VBA和TIMEVALUE()内的TimeValue()表现不同。我还把我最初计划的'if not IsError()'放回去。

Dim startingTime As Double, endingTime As Double
Dim totalTime As Double
With textbox_starttijd
    If Not IsError(Evaluate("TIMEVALUE(""" & .Value & """)")) Then
        startingTime = 24 * TimeValue(.Value)
    ElseIf .Value <> vbNullString Then
        startingTime = CDbl(.Value)
    Else
        startingTime = 0
    End If
End With
With textbox_eindtijd
    If Not IsError(Evaluate("TIMEVALUE(""" & .Value & """)")) Then
        endingTime = 24 * TimeValue(.Value)
    ElseIf .Value <> vbNullString Then
        endingTime = CDbl(.Value)
    Else
        endingTime = 0
    End If
End With
totalTime = endingTime - startingTime

更新2
也许这个代码保持最新:userform中的空文本框在'CDbl(.value)'处抛出一个错误,所以我用一个ElseIf更新了上面的代码,它检查了vbNullString,而Else将我的时间设置为0,所以现在字符串永远不会是空的。

2 个答案:

答案 0 :(得分:0)

TimeValue - 函数尝试将字符串转换为日期和时间字段。它的工作原理与Excel本身类似。将单元格格式化为time并尝试不同的值:Excel将尝试将该值解释为日期/时间。 &#34; 5.5&#34;例如,作为5月5日,当TimeValue只读取时间部分时,它返回0.

您强制用户以hh:mm格式输入时间并手动检查输入(通过regEx等),或者将输入字段更改为DateTime选择器。在Excel&lt; = 2010上,您可能必须先选择它:右键单击工具箱窗口,选择&#34;其他控件...&#34;并搜索&#34; Microsoft日期和时间选择器控件&#34;。但是,如果您使用的是2010年以上的Excel,则不再安装,也许这有助于: Excel VBA Macro - Date / Time Picker

答案 1 :(得分:0)

您可以改为使用Excel TIMEVALUE函数:

For Each s In Split("5:30 5.5 5,5 5 a")
    v = Evaluate("TIMEVALUE(""" & s & """)")
    Debug.Print s, IsNumeric(s), IsError(v), VarType(v), TypeName(v), v
Next

结果:

s             IsNumeric(s)  IsError(v)    VarType(v)    TypeName(v)   v
5:30          False         False          5            Double         0.229166666666667 
5.5           True          True           10           Error         Error 2015
5,5           True          True           10           Error         Error 2015
5             True          True           10           Error         Error 2015
a             False         True           10           Error         Error 2015