VBA Excel TimeValue() 输入可能性

Posted

技术标签:

【中文标题】VBA Excel TimeValue() 输入可能性【英文标题】:VBA Excel TimeValue() input possibilities 【发布时间】: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,所以字符串现在永远不会为空。

【问题讨论】:

为什么不在文本框中输入一个时间值? 【参考方案1】:

您或许可以改用 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

【讨论】:

谢谢!现在开始工作了。没有意识到VBA中时间值的差异,只是擅长。必须说我还没有完全理解你的 Evaluate() 的语法,所有这些引号,但我稍后会研究。在您精心制作的示例中还注意到 IsError() 是一个合法函数,在我的任务中的某个地方我认为它不是,并在我的原始代码中提出了“on error resume next”逻辑。 'If not IsError()' 更好。再次感谢。 @MerijnBol 我不知道 Excel 和 VBA 中的 TimeValue 之间的区别,并通过尝试几件事找到了它。 Excel 公式需要引号=TIMEVALUE("5:30"),我找不到任何其他方式从 VBA 调用它。 IsError 只能用于可以返回错误值的函数,因此对于运行时错误仍然需要On Error【参考方案2】:

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

要么强制用户以 hh:mm 形式输入时间并手动检查输入(通过 regEx 等),要么将输入字段更改为 DateTime 选择器。在 Excel Excel VBA Macro - Date / Time Picker

【讨论】:

是的,没有意识到 TimeValue 也在寻找约会对象,谢谢。 DateTime 选择器是我也可以看看的东西。感谢您的信息。

以上是关于VBA Excel TimeValue() 输入可能性的主要内容,如果未能解决你的问题,请参考以下文章

如何在Excel中设置日期倒计时函数,不包含周六周日两天。

VBA:用代码操作代码

excel中想实现使用Python代替VBA,请问应该怎么做

Excel VBA 从关闭的工作簿中读取数据,带有 ADODB、动态范围和标题可选

TimeValue 不是可识别的内置函数名称

在 excel 2007 vba 中找不到可安装的 ISAM