【发布时间】:2017-11-16 12:31:57
【问题描述】:
这里是新的。阅读了很多主题,但真的无法弄清楚。 我正在将一个字符串从一个用户表单文本框转换为一个双精度,代表一个时间。当前代码运行良好:
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 的结果时间值(.值)。我预计这些字符串会出错?
我现在的解决方案是不使用小数,但我不知道出了什么问题。
谢谢。
更新
因此,根据 Slai 的回答,我得到了它的工作。显然,VBA 中的 TimeValue() 和 excel 中的 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
不妨让这段代码保持最新:用户窗体中的一个空文本框在“CDbl(.value)”处抛出一个错误,所以我用一个检查 vbNullString 的 ElseIf 更新了上面的代码,Else 将我的时间设置为 0,所以字符串现在永远不会为空。
【问题讨论】:
-
为什么不在文本框中输入一个时间值?