相当于 VBA 的 Excel VALUE 函数

相当于 VBA 的 Excel VALUE 函数

我需要将时间值从文本格式“hh:mm”转换为数字。该值也可以是负数,并且大于 24 小时。我想出了以下公式来实现此目的:

=IF(LEFT(B1)="-";VALUE(RIGHT(B1;LEN(B1)-1))*-1;VALUE(B1))

这是可行的,但是由于 B1 的实际值是另一个公式(使用 Index/Match),所以它使一切变得复杂和不清楚。

因此,我考虑创建一个 VBA 函数来处理这个问题,但我在 VBA 中找不到“VALUE”的合适对应函数。使用“Val”函数实际上不起作用,因为它需要数字格式,而不是时间格式。只有当值小于 24:00 时,使用 TimeValue 才有效。

Function TVALUE(txt As String)
  If Left(txt, 1) = "-" Then
    'MsgBox ("Negative")
    TVALUE = (TimeValue(Right(txt, Len(txt) - 1))) * -1
  Else
    TVALUE = TimeValue(txt)
  End If
End Function

示例值

关于如何解决这个问题,我有什么想法吗?

答案1

您说 B1 实际上是一个 INDEX/MATCH,这使其变得不清楚。

如果您有适当版本的 Excel,您可以尝试这个(用您的 INDEX/MATCH 公式替换 B1):

=LET(x,B1,IF(LEFT(x)="-",VALUE(RIGHT(x,LEN(x)-1))*-1,VALUE(x)))

LET 将 INDEX/MATCH 的结果分配给变量 x,然后在整个公式中重复使用它。x 只是一个名称,您可以使用任何您想要的名称。我更喜欢使用单个字母,因为它使整个函数更短。

如果这不起作用并且您必须使用 VBA,那么您需要以下内容:

Function TVALUE(txt As String)
  If Left(txt, 1) = "-" Then
    'MsgBox ("Negative")
    TVALUE = Application.WorksheetFunction.NumberValue(Right(txt, Len(txt) - 1), ",", ".") * -1
  Else
    TVALUE = Application.WorksheetFunction.NumberValue(txt, ",", ".")
  End If
  
End Function

工作表函数.NumberValue

在此处输入图片描述

答案2

欢迎来到 SU。类似这样的方法可能有效:

Function TValue(ByVal txt)
    TValue = 0.0
    Dim a : a = Split(txt, ":")
    If 1 = UBound(a) Then
        If IsNumeric(a(0)) And IsNumeric(a(1)) Then
            TValue = (Abs(a(0)) / 24) + ((a(1) / 60) / 24)
            If InStr(txt, "-") > 0 Then TValue = -TValue
        End If
    End If
End Function

概要:

  • 对于无效字符串,将结果初始化为 0.0
  • 如果传递了小时:分钟字符串,请确保值为数字
  • 如果小时和分钟是数字,则计算时间序列化值
  • 如果发现负号,则取反该值

可以进行一些改进来明确检查有效的字符串格式和整数,但这应该有助于您入门。

祝你好运。

相关内容