我需要将时间值从文本格式“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
答案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
- 如果传递了小时:分钟字符串,请确保值为数字
- 如果小时和分钟是数字,则计算时间序列化值
- 如果发现负号,则取反该值
可以进行一些改进来明确检查有效的字符串格式和整数,但这应该有助于您入门。
祝你好运。